Schrift
[thread]12087[/thread]

Textnormalisierung...Hilfe!



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Gast Gast
 2008-06-26 17:45
#111555 #111555
Hallo zusammen,

Ich studiere Computerlinguistik und komme bei einer Aufgabe ums Verrecken nicht weiter und hoffe, dass ihr mir zumindest nen Tip geben könntet, wie ich die lösen könnte.

Und zwar hab ich einen Text, in dem alle Wörter, alle Zahlen und alle Satzzeichen jeweils durch ein Leerzeichen voneinander getrennt sind. Der Text ist in der Variablen $text gespeichert.
Die Aufgabe besteht darin, die Groß- und Kleinschreibung zu normalisieren. Das bedeutet, dass die Wörter, die normalerweise kleingeschrieben werden (Verben, Adjektive etc) am Satzanfang auch kleingeschrieben werden sollen. Die Aufgabe soll mit Regulären Ausdrücken gelöst werden.

Um die Aufgabe zu lösen, sollen wir schauen, für welche Wörter man in diesem Text Evidenz findet, dass sie innerhalb eines Satzes kleingeschrieben werden. Tauchen diese Wörter nun auch am Satzanfang auf, sollen wir diese halt kleinschreiben.

Ich habe schon zig Ansätze durchprobiert, doch keiner eignet sich für die Lösung. Habt ihr vielleicht eine Idee? Ich denke, man muss dabei mit Look-Ahead oder Look-Behind arbeiten, aber ich kriegs nicht hin.

Vielen lieben Dank.

Gruß,
Remus
moritz
 2008-06-26 18:17
#111557 #111557
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Gib doch mal einen Beispiel-Input und den dazugehörigen Output mit an, dann kann man dir vielleicht helfen.
Gast Gast
 2008-06-26 18:26
#111559 #111559
moritz+2008-06-26 16:17:02--
Gib doch mal einen Beispiel-Input und den dazugehörigen Output mit an, dann kann man dir vielleicht helfen.


Also, nochmals. Ich habe einen Text in folgender Form:

Code (perl): (dl )
my $text = "Hier steht ein längerer Text , dessen Wörter und Satzzeichen alle voneinander durch ein Leerzeichen getrennt sind . . .";


Jetzt stehen ja an vielen Satzanfängen oft Wörter wie Adjektive oder Verben, die sonst immer kleingeschrieben werden. Tauchen solche Wörter an einem Satzanfang auf, sollen diese mittels eines Perl-Scripts kleingeschrieben werden. Im oberen Beispiel müsste man also einen regulären Ausdruck entwickeln, der erkennt, dass es sich bei dem Wort "hier" um eine Ortsangabe handelt, die normalerweise immer kleingeschrieben wird. Das heißt, die Ausgabe soll dann halt lauten:


hier steht ein längerer Text, dessen Wörter und Satzzeichen usw.

Ich hoffe, jetzt wird es klarer. Jemand Ideen?
Gast Gast
 2008-06-26 18:56
#111560 #111560
Wie lang ist denn der Text eigentlich?
So lang, dass man vom restlichen Text ( nicht die Satzanfänge ) herleiten kann, welche Wörter klein und welche groß geschrieben werden sollen?
Dann wäre das der Ansatz den ich wählen würde, er kommt mir vergleichsweise einfach vor, auch wenn man das in eine Regex bringen muss.

MfG
Gast Gast
 2008-06-26 19:01
#111561 #111561
Gast+2008-06-26 16:56:00--
Wie lang ist denn der Text eigentlich?
So lang, dass man vom restlichen Text ( nicht die Satzanfänge ) herleiten kann, welche Wörter klein und welche groß geschrieben werden sollen?
Dann wäre das der Ansatz den ich wählen würde, er kommt mir vergleichsweise einfach vor, auch wenn man das in eine Regex bringen muss.

MfG


Ja, die Aufgabenstellung ist in der Tat recht simpel, aber ich komm einfach nicht auf die Lösung. Das Textkorpus, das wir bekommen haben, ist über 25000 Zeilen lang. ^^ Da bringts nicht viel, sich die Satzanfänge alle anzuschauen. Hättest du vielleicht einen konkreten Ansatz für mich mit einem regulären Ausdruck?
renee
 2008-06-26 19:02
#111562 #111562
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Naja, ein einfacher Regulärer Ausdruck hilft da wenig. Du musst das Wort am Satzanfang holen (was relativ einfach ist) und dann müsstest Du eigentlich in einem "Wörterbuch" (oder eine andere Datei in der so etwas gespeichert ist) nachschauen, ob es ein Verb, Adjektiv oder ähnliches ist...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pq
 2008-06-26 19:05
#111563 #111563
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wie will man das denn verlässlich rauskriegen?
beispiel:

Ruhe sanft.
Ruhe vor dem Sturm.

im ersten fall ist Ruhe ein verb, im zweiten ein substantiv.
es gibt also immer doppeldeutigkeiten, die du nur herausfindest, wenn du den kontext erkennen
kannst, und das ist bei einer sprache nicht so leicht. selbst bei programmiersprachen gibt
es mehrdeutige ausdrücke. in perl kann man dann nur mit einem hilfsmittel dem compiler
klarmachen, was gemeint ist.

also solltest du erstmal sagen, wie du bestimmen willst, ob etwas kleingeschrieben werden muss oder nicht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Linuxer
 2008-06-26 19:13
#111564 #111564
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
Anhand der Beschreibung denke ich an folgende Vorgehensweise:

- Text einmal durchsuchen nach kleingeschriebenen Wörter; Wörter in einem Index ablegen
- Text noch einmal parsen; für jedes Wort am Satzanfang ist dann gegen den Index zu prüfen, ob das Wort kleingeschrieben schon mal vorkam; wenn ja, dann ersetzen...

Edit:
Um pqs Ansatz aufzugreifen:
Natürlich gibt es dann immer noch das Problem, den Worttyp korrekt zu identifizieren:

Code: (dl )
Ruhe sanft . Die Ruhe vor dem Sturm . Er ruhe in Frieden . Ruhe ist's, was er sucht .


Wie soll nun entschieden werden, ob "Ruhe" am Satzanfang groß oder klein geschrieben werden soll?


meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Gast
 2008-06-26 19:17
#111565 #111565
pq+2008-06-26 17:05:58--
also solltest du erstmal sagen, wie du bestimmen willst, ob etwas kleingeschrieben werden muss oder nicht.


Das hab ich doch eigentlich schon. ;-)

Wenn ein bestimmtes Wort innerhalb eines Satzes (also nicht am Satzanfang) immer kleingeschrieben wird, und es taucht plötzlich am Satzanfang auf, ist aber da großgeschrieben, dann soll Perl dieses Wort am Satzanfang in Kleinbuchstaben umwandeln. So benötigt man keinerlei sprachliches Wissen.

Natürlich kann man mit so einer Methode nicht 100%-ig alles richtig umformen, aber in der Computerlinguistik werden Probleme selten zu 100% gelöst, weil Sprache halt ein sehr komplexes Gebilde ist.

Also mal eine Überlegung von mir:

Zunächst könnte man doch alle verschiedenen kleingeschriebenen Wörter im Text in einem Hash ablegen, in etwa so:

Code (perl): (dl )
1
2
3
4
5
my %hash;

if ($text =~ /(\b[a-zäöüß]+\b)/g) {
               $hash{$1}++;
}


Jetzt möchte ich nur alle Wörter am Satzanfang betrachten, also alle großgeschriebenen Wörter, die nach einem Punkt kommen. Wenn ein solches Wort identisch ist mit einem Wort aus dem Hash und sich nur in der Schreibung unterscheidet, dann soll dieses Wort am Satzanfang eben kleingeschrieben werden. Aber ich weiß nicht, ob sowas a) geht und b) wies geht. Meine Versuche warn bisher erfolglos.
Gast Gast
 2008-06-26 19:19
#111566 #111566
Linuxer+2008-06-26 17:13:59--
Anhand der Beschreibung denke ich an folgende Vorgehensweise:

- Text einmal durchsuchen nach kleingeschriebenen Wörter; Wörter in einem Index ablegen
- Text noch einmal parsen; für jedes Wort am Satzanfang ist dann gegen den Index zu prüfen, ob das Wort kleingeschrieben schon mal vorkam; wenn ja, dann ersetzen...

Edit:
Um pqs Ansatz aufzugreifen:
Natürlich gibt es dann immer noch das Problem, den Worttyp korrekt zu identifizieren:

Code: (dl )
Ruhe sanft . Die Ruhe vor dem Sturm . Er ruhe in Frieden . Ruhe ist's, was er sucht .


Wie soll nun entschieden werden, ob "Ruhe" am Satzanfang groß oder klein geschrieben werden soll?


Wenn du mir jetzt noch sagst, wie ich das in Perl implementieren kann, dann bin ich glücklich. :-)

Solche Ambiguitäten wie bei "Ruhe" sind hierfür irrelevant.
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2008-06-26 17:45.