Schrift
[thread]12256[/thread]

Probleme mit RegEx und Worttypen (Seite 5)



<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten
Dingels
 2008-08-02 21:04
#113019 #113019
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Hallo nochmal,

weil jeder Durchgang des Programms trotz jetzt nur noch quadratischen Aufwands nur zum Testen einzelner Quelltextänderungen recht lange dauert, hab ich mir mal ein kleines Test-Script gebastelt.

Das sieht jetzt folgendermaßen aus:

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
use strict;
use diagnostics;
use locale;

my %lexikon = (
               'hell' => 'ADJA',
               'blau'      => 'ADJA',
               'hellblau' => 'ADJA',

               'Tisch'      => 'NN',
               'Decke'     => 'NN',
               'Tischdecke' => 'NN'
               [...]
);

foreach my $wortteil_1 (keys %lexikon) {
        foreach my $wortteil_2 (keys %lexikon) {
                if (exists $lexikon{$wortteil_1.$wortteil_2}) {
                        if ($lexikon{$wortteil_1} eq "ADJA" && $lexikon{$wortteil_2} eq "ADJA" && $lexikon{$wortteil_1.$wortteil_2} eq "ADJA") {
                                print $wortteil_1.$wortteil_2 . "\t" . $lexikon{$wortteil_1.$wortteil_2} . "\t\t" . $wortteil_1 . "\t" . $lexikon{$wortteil_1} . "\t\t" . $wortteil_2 . "\t" . $lexikon{$wortteil_2}  . "\n";
                        }
                }
        }
}


Hiermit teste ich jetzt also, ob ein Wort ein Kompositum ist. Das ist dann der Fall, wenn seine einzelnen Bestandteile einzeln im Korpus vorkommen. Zusätzlich teste ich die Wortart, da jedes Wort ein Wortarten-Tag besitzt. In dem Hash oben sind zwei repräsentative Einträge.

Meine Abfrage mit dem Adjektiv funktioniert korrekt:
Code: (dl )
hellblau	ADJA		hell	ADJA		blau	ADJA


Mit dem Substantiv klappts logischerweise nicht, weil die Groß- und Kleinschreibung nicht normalisiert ist. Also wollte ich die lc-Funktion anwenden. Klappt jedoch seltsamerweise nicht. Folgendes geht z.B. nicht:

Code (perl): (dl )
1
2
3
4
5
6
7
foreach my $wortteil_1 (keys %lexikon) {
               $wortteil_1 = lc($wortteil_1);
               foreach my $wortteil_2 (keys %lexikon) {
                               $wortteil_2 = lc ($wortteil_2);
              [...]
               }
}


Hab noch andere Dinge versucht, aber nichts funktioniert. Wie kann ich nur für den temporären Schleifendurchlauf alle Schlüssel im Hash in Kleinbuchstaben umwandeln? Denn ausgegeben werden sollen die Wörter ja in der richtigen Groß- und Kleinschreibung.

Vielen Dank. :)


Schönen Gruß,
Dingels
LanX-
 2008-08-02 21:22
#113022 #113022
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Dingels+2008-08-02 19:04:05--
Also wollte ich die lc-Funktion anwenden. Klappt jedoch seltsamerweise nicht.


Wie ichs mir dachte ... also ich bekomme ne ziemlich prägnante Fehlermeldung, wieso musste ich deinen Code jetzt dafür nochmal abtippen?
Dingels
 2008-08-02 21:40
#113023 #113023
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Ja ich bekomm auch nen Fehler.

Quote
Use of uninitialized value in string eq at...


Allerdings weiß ich nicht, wieso ich diesen Fehler ausgerechnet hier bekomme. Die Werte in $wortteil_1 und $wortteil_2 sind doch definiert. Der Fehler taucht irgendwo in der zweiten if-Abfrage auf.

Was läuft hier falsch?
LanX-
 2008-08-02 22:56
#113025 #113025
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
OK, ich hatte nen anderen Fehler ... grunsätzlich vermeide ich es möglichst die Schleifenvariable zu verändern, sie ist ein Alias auf das aktuelle Listenelemente.

Deswegen benenne die LC-Version mit einem neuen Var-Namen und sag Bescheid ob der Fehler noch da ist.
Dingels
 2008-08-02 23:25
#113026 #113026
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Hab die LC-Versionen mit nem anderen Namen versehen und die Namen auch im folgenden Code angepasst. Aber ändert leider nichts. Selber Fehler. So sieht's momentan aus:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
foreach my $wortteil_1 (keys %lexikon) {
        my $klein_1 = lc($wortteil_1);
        foreach my $wortteil_2 (keys %lexikon) {
                my $klein_2 = lc($wortteil_2);
                if (exists $lexikon{$klein_1.$klein_2}) {
                        if ($lexikon{$klein_1} eq "NN" && $lexikon{$klein_2} eq "NN" && $lexikon{$klein_1.$klein_2} eq "NN") {
                                print $klein_1.$klein_2 . "\t" . $lexikon{$klein_1.$klein_2} . "\t\t" . $klein_1 . "\t" . $lexikon{$klein_1} . "\t\t" . $klein_2 . "\t" . $lexikon{$klein_2}  . "\n";
                        }
                }
        }
}


Und wieder derselbe Fehler:

Code: (dl )
1
2
3
An undefined value was used as if it were already
defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
To suppress this warning assign a defined value to your variables.


Was hattest du denn für einen Fehler?
LanX-
 2008-08-02 23:30
#113027 #113027
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
BTW: was stört dich am Code in Beitrag 35 geschrieben: am 27.07.2008 um 15:40:16?
LanX-
 2008-08-02 23:36
#113028 #113028
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Quote
Und wieder derselbe Fehler:

Code: (dl )
1
2
3
An undefined value was used as if it were already
defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
To suppress this warning assign a defined value to your variables.


wahrscheinlich sind bei dir nicht alles Hashvalues defined, lass dir das letzte Key ausgeben vor dem abbruch dann weißt du es sicher.

Quote
Was hattest du denn für einen Fehler?


hilft dir nicht, die Listenelemente waren Literal und konnten im Alias nicht geändert werden


Mein oben erwähnter Code ist übrigens performanter weil du "lc" nur einmal pro haskey aufrufen musst!
Dingels
 2008-08-02 23:43
#113029 #113029
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Mit folgender Zeile in deinem Quelltext weist du keys und values dieselben Werte zu. Das will ich aber nicht, da ich die Tags brauche:

Code (perl): (dl )
my %klein= map {(lc $_ => $_)} keys %hash;


Die zweite if-Abfrage benötige ich auch, da es unterschiedliche Typen von Komposita gibt, die aus unterschiedlichen Wortarten bestehen. Und da ich diese Komposita getrennt ausgeben soll, geht das für jeden Kompositumstyp anders, da teilweise auch noch Fugenelemente mit drin sind etc.

Außerdem hat jeder Schlüssel im Hash %lexikon einen Wert. Hab ich kontrolliert. Wie kann ich denn den letzten Key vor Abbruch ausgeben?
LanX-
 2008-08-03 00:00
#113030 #113030
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Dingels+2008-08-02 21:43:36--
Mit folgender Zeile in deinem Quelltext weist du keys und values dieselben Werte zu. Das will ich aber nicht, da ich die Tags brauche:

Code (perl): (dl )
my %klein= map {(lc $_ => $_)} keys %hash;


NEIN, ich weise der Kleinform die Ursprungsform zu um sie (in deinem vorausgeahnten Sinne) später rauszubekommen! Schau dir bitte den ganzen Code an + Ausgabe an!

Fragestellung ist eher wie du mit Wörtern unterschiedlicher Wortbedeutungen bei Groß/kleinschreibung umgehen willst z.B. Sein/sein.

Ich klinke mich hier aus, hab zu tun, sorry!
Dingels
 2008-08-03 00:05
#113031 #113031
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Ok, danke für deine Hilfe. Ich denke, ich werd das schon irgendwie rauskriegen. Alle Komposita lassen sich eh nicht korrekt erkennen.

Ich werd mich nochmal mit deinem Code beschäftigen.

Melde mich dann vielleicht später nochmal.

Also nochmals DANKE. :)
<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten



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