Schrift
[thread]12256[/thread]

Probleme mit RegEx und Worttypen (Seite 3)



<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten
LanX-
 2008-07-25 21:08
#112754 #112754
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Funktioniert astrein, wenn der untersuchte Text tatsächlich die Keys sein sollen ...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
my %hash = ('Abend' => 'NN',
            'Sonne' => 'NN',
            'Haus' => 'NN',
            'Abendsonne' => 'who knows',
);

for my $word ( keys %hash ) {
    for my $pre ( keys %hash ) {
        for my $post ( keys %hash ) {
            if ( "\L$word" eq "\L$pre$post" ) {
                print $word, $/;
            }
        }
    }
}

Abendsonne
Dingels
 2008-07-25 21:16
#112757 #112757
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
OK, hier mal der Inhalt der Subroutine. Ist nichts besonderes. Das Korpus wird eingelesen und einem Hash gespeichert.


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sub lese_korpus {
my $dateiname = shift;

my %hash_korpus;

open my $input, "<", $dateiname or return 0;

while (my $zeile = <$input>) {

# Whitespace entfernen und normalisieren:
$zeile =~ s/(\S+)\s+(\S+)/$1 $2/;
$zeile =~ s/^\s+//;

# Leere Zeilen überspringen
next if ($zeile eq '');

# Token und Tag im Hash als Schlüssel und Wert ablegen:
$zeile =~ s/(\S+)\s(\S+)/$hash_korpus{$1}=$2/ge;
}


close $input;

return %hash_korpus;
}
LanX-
 2008-07-25 21:19
#112760 #112760
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
debugge mal lieber was hinten rauskommt indem du in die Schleifen ein
print "$word\n"; # und $pre und $post
einfügst.
Dingels
 2008-07-25 21:30
#112763 #112763
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
LanX-+2008-07-25 19:19:42--
debugge mal lieber was hinten rauskommt indem du in die Schleifen ein
print "$word\n"; # und $pre und $post
einfügst.


Erste Schleife mit print gibt folgendes aus:

Wahlkampf
auszuleuchten
Söhne
Übernachtungen
Budget
Öl-
classe
nächstes
Posten
gestehen
59%
Wiederaufbau
Schweizer-Eishockey-Junioren
Ewige
würdigten
verglich
Nichterwerbstätige
...

Zweite Schleife:

Wenn ich $worttyp mit print ausgebe, dann gibt er jedes Wort von oben zwei mal hintereinander aus (logisch).

Wahlkampf
Wahlkampf
auszuleuchten
auszuleuchten
...

Wenn ich $pre ausgeben will, dann gibt er erst alle Wörter aus wie oben in der ersten Schleife und dann die ganze Liste nochmal und nochmal und nochmal. Wie ne Endlosschleife, obwohl nach meinem Verständnis das nur zweimal kommen sollte. Eclipse zeigt nen IOUpdater-Error an.

Dritte Schleife:

Gebe ich in der dritten Schleife $worttyp aus, dann wird das erste Wort (Wahlkampf) unendlich oft ausgegeben. Die anderen gar nicht. Mit $post dasselbe wie mit $pre.

Das entzieht sich irgendwie meinem Verständnis. -.-
LanX-
 2008-07-26 00:29
#112766 #112766
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
poste doch nochmal deinen aktuellen Code inklusive deinen prints, aus deiner Beschreibung wird man nicht schlau. Oder noch besser versuche anhand der Printergebnisse den Fehler einzugrenzen.

mein Tip ist dass deine Korpusdatei eine ziemliche weite Interpretation von "Wörtern" hat, wenn da %-zeichen und ähnliches vorkommt und deswegen was kaputt geht und wenn dein innererster Vergleich immer noch mit Linuxers RegEx läuft statt dem eq brauchen wir uns auch nicht mehr zu unterhalten, wahrscheinlich produzierst du ne Endlosschleife in der RegEx.

Ab welchem Wort hängt sich denn die Schleife auf?
LanX-
 2008-07-26 14:33
#112775 #112775
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
noch ne Idee, kann es sein dass du %hash in den Schleifen veränderst?
MatthiasW
 2008-07-26 17:12
#112800 #112800
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Wie LanX- schon sagte, liegt das Problem bei der RegEx.
Die Variablen $pre und $post musst du mit \Q...\E umschließen, damit enthaltene Sonderzeichen nicht als regulärer Ausdruck interpretiert werden, oder du verwendest gleich eq...

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Dingels
 2008-07-27 15:38
#112813 #112813
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
So, sorry war gestern unterwegs, daher kann ich mich erst jetzt melden.

Ich hab jetzt zig Sachen ausprobiert, die ihr vorgeschlagen habt, aber nichts funktioniert. Wahrscheinlich habe ich missverstanden, wie ich eure Tipps anwenden soll.

Also hier noch mal mein Code bis zu dem Punkt, an dem er korrekt funktioniert:


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use strict;
use diagnostics;
use locale;


my %korpus = lese_korpus("korpus.txt");




sub lese_korpus {
        
        my $dateiname = shift;
        
        
        my %hash_korpus;
        
        
        open my $input, "<", $dateiname or return 0;
        
        
        while (my $zeile = <$input>) {
                
                # Whitespace entfernen und normalisieren:
                $zeile =~ s/(\S+)\s+(\S+)/$1 $2/;
                $zeile =~ s/^\s+//;
                
                # Leere Zeilen überspringen
                next if ($zeile eq '');
                
                # Token und Tag im Hash als Schlüssel und Wert ablegen:
                $zeile =~ s/(\S+)\s(\S+)/$hash_korpus{$1}=$2/ge;
        }
        
        
        close $input;
        
        
        return %hash_korpus; 
}


Ja, viele Token enthalten auch zig Sonderzeichen. Das Korpus beinhaltet Daten aus Zeitungen. Wenn ich die Schlüssel sortiert ausgeben lassen, sieht man das schon. Hier mal ein Auszug:

!
#
$
%
&
'
(
)
*
+
+16,4%
+23%
+5,8%
+8,8%
,
-
[...]

Auch am Ende kommen noch paar Sonderzeichen:

[...]
£
©
±
µg/m
«
»

Wo genau soll ich diese \Q und \E einfügen? Hab das an jedem möglichen Vorkommen von $pre und $post versucht, es ändert nichts daran, dass mein Programm scheinbar ne Endlosschleife produziert und nichts anzeigt.
Ich habe auch schon versucht, alle Sonderzeichen mit einem regulären Ausdruck in einer if-Anweisung auszuschließen, aber das führt auch zu keinem Ergebnis. So hab ich das gemacht:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
foreach my $schluessel (keys %korpus) {
        if ($schluessel =~ /\w+/) {
                foreach my $pre (keys %korpus) {
                        foreach my $post (keys %korpus) {
                                if ($schluessel eq "\Q$pre$post\E") {
                                        print $schluessel . "\n";
                                }
                        }
                }
        }
}


Was muss ich machen, damit der Code endlich funktioniert? Gibt's ne Abkürzung, mit der man alle Sonderzeichen auf einmal ausschließen kann?
LanX-
 2008-07-27 16:25
#112814 #112814
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Dingels+2008-07-27 13:38:38--
Gibt's ne Abkürzung, mit der man alle Sonderzeichen auf einmal ausschließen kann?


Code (perl): (dl )
@woerter= grep {/w+/}  keys %hash ;


und in *allen* Schleifen nur noch über @woerter laufen

Dingels+2008-07-27 13:38:38--
Was muss ich machen, damit der Code endlich funktioniert?


Du solltest lernen systematisch zu debuggen, das heißt man kürzt Code und Daten solange bis man den Fehler isoliert hat. Z.B. finde raus bei welchem Wort, Pre und Post sich die Routine aufhängt.
Dingels
 2008-07-27 16:33
#112815 #112815
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
@LanX-

Hab ich getan, ändert nichts. Mein Code sieht jetzt so aus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my @woerter = grep {/w+/} keys %korpus;

foreach my $schluessel (@woerter) {
        foreach my $pre (@woerter) {
                foreach my $post (@woerter) {
                        if ("\L$schluessel" eq "\L$pre$post") {
                                print $schluessel . "\n";
                        }
                }
        }
}


Das Programm funktioniert ab dann nicht richtig, wenn ich $pre in der zweiten Schleife ausgeben will, wie ich oben bereits erläutert habe. Die Wortlisten werden immer und immer wieder ausgegeben. Wie soll ich da bitte herausfinden, an welchem Wort es liegt? Er gibt mir ja nix aus, was mir diesbezüglich helfen würde.
<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten



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