Schrift
[thread]12256[/thread]

Probleme mit RegEx und Worttypen (Seite 4)



<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten
LanX-
 2008-07-27 16:51
#112816 #112816
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Wie gesagt kürze die Datenmenge, sukzessives halbieren!

Oder gib zuerst nur $schluessel aus bis du weißt wo die äußere Schleife hängt.
dann isolierst du die nächste Schleife usw.


Dein Problem lässt sich bei mir überhaupt *nicht* reproduzieren!

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/perl
use Data::Dumper;

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

while (<DATA>) {
        chomp;
        $hash{$_}="irgendwas";
}

#print Dumper \%hash;


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



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

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


Wieviele Zeilen hat eigentlich in deiner Korpusdatei? Hast du mal daran gedacht es einfach lang genug durchlaufen zu lassen, bei 1000 Zeilen sind das immerhin 1000³=1 Milliarde Durchläufe...

ich hab dir schonmal geraten mit -f index zu arbeiten, dann kannst du auch abkürzen.

tschüss bin jetzt 3 Tage offline!
Dingels
 2008-07-27 17:06
#112817 #112817
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Dass das Programm so lange braucht, hab ich gar nicht bedacht. Ich lass es jetzt mal länger durchlaufen. Das Korpus hat 18973 Zeilen. Na super, dann dauert das ja Ewigkeiten. Scheinbar liegt es tatsächlich daran. Wieso hab ich das nicht bedacht. In der heutigen Zeit, wo Rechner so schnell sind, denkt man da gar nicht mehr dran. ^^

Ich werd die Datenmenge mal stärker eingrenzen und falls es dann immer noch nicht klappt, mich nochmal melden. Danke für eure Mühe und Geduld. Manchmal steh ich echt aufm Schlauch.
LanX-
 2008-07-27 17:13
#112818 #112818
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
ja lass mal länger durchlaufen und beantrag schon mal nen billigen Stromtarif und und nen Flux-Compensator um das Ergebnis nach 6,829 Billionen Durchläufen abzuholen.

hab ich schonmal index erwähnt? damit könntest du deinen Aufwand näherungsweise quadratisch machen.
Dingels
 2008-07-27 17:21
#112819 #112819
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
Du meinst diese Funktion hier?

http://www.hidemail.de/blog/index-perl.shtml

Ich wüsste jetzt aber nicht, wie ich das auf mein Problem anwenden sollte. Die drei Schleifen sind doch weiterhin notwendig oder irre ich mich da?
LanX-
 2008-07-27 17:40
#112821 #112821
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Quadratischer Aufwand:
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
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

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


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


my @woerter=keys %klein;

for my $pre ( @woerter ) {
        for my $post ( @woerter ) {
                my $kompo = $pre.$post;
                if ( $klein{$kompo} ) {
                        print "$kompo \t $klein{$kompo} \t $hash{$klein{$kompo}} \n";
                }

        }
}


abendsonne Abendsonne who knows
LanX-
 2008-07-27 18:10
#112824 #112824
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Dingels+2008-07-27 15:21:18--
Die drei Schleifen sind doch weiterhin notwendig oder irre ich mich da?


müssen sie auch alle immer durchlaufen werden?
LanX-
 2008-07-27 18:27
#112825 #112825
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Für diejenigen die's interessiert, die beste Performance holt man wahrscheinlich durch vorheriges sortieren der Wort-Liste raus, dannach könnte der Aufwand fast linear werden.
Dingels
 2008-07-27 18:42
#112826 #112826
User since
2008-07-07
31 Artikel
BenutzerIn
[default_avatar]
@LanX-

hab deinen letzten Code getestet. Aus 18973 Token spuckt er mir jetzt etwas mehr als 8000 Token aus in wenigen Minuten. Da ist zwar auch viel Müll dabei, also nicht nur Komposita, aber das ist schon mal ein Anfang. DANKE. :-)

Wie sähe denn der vorherige Code mit der index-Funktion aus?

KurtZ
 2008-07-28 15:54
#112833 #112833
User since
2007-12-13
411 Artikel
BenutzerIn
[default_avatar]
Dingels+2008-07-27 16:42:34--
Wie sähe denn der vorherige Code mit der index-Funktion aus?


sagt er doch:

Quote
Quote
Die drei Schleifen sind doch weiterhin notwendig oder irre ich mich da?
müssen sie auch alle immer durchlaufen werden?


Wenn du den Algorithmus verstanden hast sollte das offensichtlich sein, ansonsten Spiel es mal auf dem Papier mit einer kleinen Datenmenge durch, und dein Unterbewusstsein wird sich automatisch weigern, bestimmte unsinnige wege zu gehen.

Ob nun zur Erkennung der Sinnhaftigkeit index oder m// benutzt ist eigentlich Jacke wie Hose, aber da du Probleme mit RegEx hast ist index für dich wohl besser.
TMTOWTDYOG (there's more than one way to dig your own grave)
Gast Gast
 2008-07-29 13:24
#112860 #112860
Dingels
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:

Innerhalb der Regex hättest du \Q und \E um die Variablen $pre und $post packen sollen, denn dann werden alle Sonderzeichen, die diese Variablen enthalten automatisch escaped.

MfG
<< |< 1 2 3 4 5 >| >> 50 Einträge, 5 Seiten



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