Schrift
[thread]12256[/thread]

Probleme mit RegEx und Worttypen



<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten
Dingels
 2008-07-25 19:00
#112725 #112725
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

habe ein Problem, bei dem ich nicht weiter weiß. Und zwar habe ich einen Hash, in dem die Schlüssel aus Worttypen eines Korpus bestehen, die dazugehörigen Werte aus Tags. Ich möchte jetzt alle Komposita herausfiltern, also zusammengesetzte Wörter, wie z.B. "Abendsonne".

Mein Ansatz war, dass wenn die einzelnen Bestandteile des Kompositums auch einzeln vorkommen, es sich bei einem Wort um ein Kompositum handelt. D.h., wenn mindestens eines der Wörter "Abend" und "Sonne" einzeln als Schlüssel vorkommen, dann ist "Abendsonne" ein Kompositum.

Mit einem regulären Ausdruck lässt sich das sicherlich verwirklichen. Nur wie? Folgender Ansatz funktioniert bei mir nicht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use strict;
use diagnostics;

my %hash = ('Abend' => 'NN',
'Sonne' => 'NN',
'Haus' => 'NN',
'Abendsonne' => 'NN');

foreach my $element (sort keys %hash) {
if ($element =~ /^$element.+/) {
print $element . "\n";
}
}


Rekursionen scheinen in regulären Ausdrücken nicht erlaubt zu sein. Habt ihr eine Idee, wie ich die Komposita herausfiltern kann?

Besten Dank.

Gruß,
Dingels
LanX-
 2008-07-25 19:15
#112726 #112726
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use strict;
use warnings;
use Data::Dumper;


my %hash = ('Abend' => 'NN',
            'Sonne' => 'NN',
            'Haus' => 'NN',
                );
my $text="Haus Abendsonne haussonne hurz";

my $words_re= join '|', keys %hash;
my @komposita= $text =~ m/\b(?:$words_re)(?:$words_re)\b/gi;

print Dumper \@komposita;


$VAR1 = [
'Abendsonne',
'haussonne'
];
LanX-
 2008-07-25 19:17
#112727 #112727
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
noch besser:
Code (perl): (dl )
my @komposita= $text =~ m/\b(?:$words_re){2}\b/gi;
Dingels
 2008-07-25 19:21
#112730 #112730
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
@LanX-

Danke für deinen Vorschlag, aber in meinem Programm sind alle Wörter des Korpus in einem einzigen Hash drin. Oder muss ich tatsächlich erst alle Schlüssel des Hashes noch mal in ein Array kopieren, damit das funktioniert?

Und wenn möglich, sollte das ohne Referenzen funktionieren.
LanX-
 2008-07-25 19:36
#112731 #112731
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Keine Ahnung wovon du redest, du bist der Computerliguist der seine Hausaufgaben für umme gemacht haben möchte, oder?
Dingels
 2008-07-25 19:41
#112732 #112732
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
LanX-+2008-07-25 17:36:10--
Der Computerliguist der seine Hausaufgaben für umme gemacht haben möchte?


Nein, natürlich nicht. Es war nur eine Verständnisfrage, ob ich alle Worttypen noch mal in eine skalare Variable oder in ein Array kopieren muss, um Komposita mit Einzelworten zu vergleichen. Und weil ich die Komposita noch weiterverarbeiten muss, nützt mir die Ausgabe mit Data::Dumper nicht so viel.

Nimm es bitte nicht persönlich, aber wenn du mir schon einen kompletten Lösungsvorschlag präsentiert hast, warum beschwerst du dich dann jetzt? Ich sitz hier schon seit ein paar Stunden an dieser Aufgabe und bin halt noch nicht der fitteste im programmieren.
LanX-
 2008-07-25 19:54
#112735 #112735
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
ich baue eine Regex der Form (Abend|haus|Sonne)(Abend|haus|Sonne) da kannst du auch die einzelnen Komposita greifen.

Code (perl): (dl )
1
2
3
4
5
while ( $text =~ m/\b($words_re)($words_re)\b/gi) {
        my $word1="\u$1";
        my $word2="\u$2";
        print "$word1 ->" , $hash{$word1},"\n";
}

Sonne ->NN
Abend ->NN
Haus ->NN


Aber ich vermute du willst lieber klassisch rangehen mit 3 Schleifen
die erste iteriert über die wörter
die zwote vergleicht den Wortanfang mit allen Komposita
die dritte vergleicht den Wortrest mit allen Komposita
renee
 2008-07-25 19:58
#112737 #112737
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Von Referenzen sehe ich in LanX-'s Beitrag nicht viel (außer bei der Ausgabe von Data::Dumper). Und was im Array landet ist das Ergebnis. Wenn Du mit der Ausgabe von Data::Dumper nicht viel anfangen kannst, dann brauchst Du das ja nicht ausgeben. Die Ausgabe soll ja nur skizzieren, welche Worte gefunden werden. Wenn Du die Treffer weiterverwenden willst, dann kannst Du das gerne tun. Die stehen ja in dem Array...
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/
Dingels
 2008-07-25 20:00
#112739 #112739
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
LanX-+2008-07-25 17:54:16--
Aber ich vermute du willst lieber klassisch rangehen mit 3 Schleifen
die erste iteriert über die wörter
die zwote vergleicht den Wortanfang mit allen Komposita
die dritte vergleicht den Wortrest mit allen Komposita


Ja, so in etwa habe ich mir das vorgestellt. Hab das ja mit einer foreach-Schleife versucht. Aber Rekursionen sind scheinbar nicht möglich. Wenn ich mein oberes Code-Beispiel ausführe, gibt mir Perl nichts auf der Konsole aus. Und an dem Problem häng ich jetzt schon seit Ewigkeiten. Reguläre Ausdrücke sind so komplex, dass die Möglichkeiten quasi unendlich sind. Daran liegt wohl mein Problem.

Und noch einmal, ich erwarte nicht, dass ihr meine Hausaufgaben macht. Schließlich beschäftige ich mich lang genug mit so einer Aufgabe. Ich bin kein Typ, der sich auf die faule Haut legt und die Aufgaben andere Leute machen lässt. Ich poste nur, wenn ich wirklich nicht weiterkomme.
LanX-
 2008-07-25 20:04
#112740 #112740
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Dingels+2008-07-25 18:00:54--
Ja, so in etwa habe ich mir das vorgestellt.


Dann brauchst du keine einzige Regex wenn du es so machst.-f substr, -f index

Wenn du aber Computerlinguist werden willst dann setz dich IMHO lieber mit RegExes auseinander, da gibts ein sehr gutes O'reilly-Buch das fast alle Beispiele in Perl macht.

sorry muss mich jetzt um meine Hausaufgaben kümmern ; )
<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten



View all threads created 2008-07-25 19:00.