Schrift
[thread]10370[/thread]

Anfängerfrage..



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
liam21c
 2007-09-11 16:21
#99332 #99332
User since
2007-09-11
5 Artikel
BenutzerIn
[default_avatar]
Hi ich hab gestern zum ersten mal in meinem leben ein perl skript geschrieben.

Das Skript soll ein Text einlesen, alle Wörter die in der Datei stopwords.txt gespeichert sind überspringen und dann die restlichen Wörter ins Hash %dependentWord speichern.
leider funktioniert der Vergleich

if($is_stopwords{$second}){
next;
}

irgendwie nicht und es werden alle vorkommenden Wörter gespeichert.
ch habe im Moment echt keine Ahnung woran es liegen könnte..
kann mir jemand helfen?
mfg,
liam21c

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
#!/usr/local/bin/perl -w

use strict;
use warnings;
my $miniparDir = "home/sat/minipar";
my @dataArray;
my $parsedMiniparOutput;
my $searchWord;
my %dependentWord;
my @stopwords;
my %is_stopwords;
$searchWord = $ARGV[0];

open(OPENSTOPW,'stopwords.lst');
my $var = 0;
while(<OPENSTOPW>){
        chomp;
        push @stopwords, ($_);
}
foreach(@stopwords){
        $is_stopwords{$_} = 1;
}
close(OPENSTOPW);
open(OPENMY,'minipar.txt');

while(<OPENMY>){
        ...
        my($firstWord,$relation, $secondWord)=split(/:/,$_);
        my($first,$firstPOS)=split(/\s/,$firstWord);
        my($secondPOS,$second)=split(/\t/,$secondWord);
        ...
        if($is_stopwords{$second}){
                next;
        }
        
        my $entry = "$relation $firstPOS $second $secondPOS";
        $dependentWord{$entry}++;
        
}
close(OPENMY);
print %is_stopwords, "\n";
renee
 2007-09-11 16:32
#99333 #99333
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ein paar Anmerkungen:
Code (perl): (dl )
1
2
3
4
#!/usr/local/bin/perl -w

use strict;
use warnings;


vorbildlich... Aber das -w kannst Du weglassen (Du benutzt ja "use warnings")

Code (perl): (dl )
1
2
3
4
5
6
7
my $miniparDir = "home/sat/minipar";
my @dataArray;
my $parsedMiniparOutput;
my $searchWord;
my %dependentWord;
my @stopwords;
my %is_stopwords;
man sollte Variablen so spät wie möglich (wenn's geht erst bei der ersten Verwendung) deklarieren

Code (perl): (dl )
1
2
3
4
5
6
7
8
$searchWord = $ARGV[0];

open(OPENSTOPW,'stopwords.lst');
my $var = 0;
while(<OPENSTOPW>){
        chomp;
        push @stopwords, ($_);
}

Man sollte immer mit angeben, ob die Datei zum Lesen oder zum Schreiben geöffnet wird und Fehler sollten abgefangen werden.

Man muss nicht alles in ein Array "pushen", man kann gleich alles in ein Array lesen...
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
foreach(@stopwords){
        $is_stopwords{$_} = 1;
}
close(OPENSTOPW);
open(OPENMY,'minipar.txt');

while(<OPENMY>){
        ...
        my($firstWord,$relation, $secondWord)=split(/:/,$_);
        my($first,$firstPOS)=split(/\s/,$firstWord);
        my($secondPOS,$second)=split(/\t/,$secondWord);
        ...
        if($is_stopwords{$second}){
                next;
        }
        
        my $entry = "$relation $firstPOS $second $secondPOS";
        $dependentWord{$entry}++;
        
}
close(OPENMY);
print %is_stopwords, "\n";


Schon mal überprüft, ob in $second wirklich das drin steht was Du erwartest??

Mit meinen Anmerkungen:
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
#!/usr/local/bin/perl -w

use strict;
use warnings;

my $miniparDir = "home/sat/minipar";
my @dataArray;
my $parsedMiniparOutput;
my %dependentWord;
my %is_stopwords;

my $searchWord = $ARGV[0];

open(my $fh_stop,'<','stopwords.lst') or die $!;
while(my $line = <$fh_stop>){
        chomp $line;
        $is_stopwords{$line} = 1;
}
close $fh_stop;

open(my $fh,'<','minipar.txt') or die $!;
while(my $line = <$fh>){
        ...
        my($firstWord,$relation, $secondWord)=split(/:/,$line);
        my($first,$firstPOS)=split(/\s/,$firstWord);
        my($secondPOS,$second)=split(/\t/,$secondWord);
        ...
        if($is_stopwords{$second}){
                next;
        }
        
        my $entry = "$relation $firstPOS $second $secondPOS";
        $dependentWord{$entry}++;
        
}
close($fh);
print %is_stopwords, "\n";
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/
Taulmarill
 2007-09-11 16:32
#99334 #99334
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Das liegt daran, dass ein Hashkey in dem Moment, in dem man in anguckt, z.b. um zu schauen ob es ihn gibt, auch schon erstellt wird. Das ganze kann man mit der Funktion exists umgehen, also so:
Code: (dl )
if( exists $is_stopwords{$second} ) {
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
renee
 2007-09-11 16:35
#99335 #99335
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Taulmarill+2007-09-11 14:32:27--
Das liegt daran, dass ein Hashkey in dem Moment, in dem man in anguckt, z.b. um zu schauen ob es ihn gibt, auch schon erstellt wird. Das ganze kann man mit der Funktion exists umgehen, also so:
Code: (dl )
if( exists $is_stopwords{$second} ) {


Das ist hier egal... Weil ein Hashwert, der durch Autovivifikation erstellt wurde nicht "true" ist...

Code: (dl )
1
2
3
C:\>perl -Mstrict -e "my %hash; print 'yes' if $hash{key}"

C:\>


Natürlich ist es mit dem "exists" sauberer...
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/
renee
 2007-09-11 16:37
#99336 #99336
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ist vielleicht ein Newline (CRLF; LF; CR) am Ende von $second?
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/
liam21c
 2007-09-11 16:50
#99337 #99337
User since
2007-09-11
5 Artikel
BenutzerIn
[default_avatar]
vielen Dank für die Hilfe!
Noch funktioniert mein Skript nicht. bin jetzt beim umschreiben.
und ja, im $second gibts schon ein Newline
mfg,
liam21c
renee
 2007-09-11 16:53
#99338 #99338
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann musst Du das entfernen...

In dem Hash sind die Worte ohne "newline" gespeichert. Das ist dann natürlich nicht gleich dem Wert in $second...

'test\n' ne 'test' !
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/
liam21c
 2007-09-11 17:16
#99339 #99339
User since
2007-09-11
5 Artikel
BenutzerIn
[default_avatar]
hmmm es geht noch immer nicht..

komisch ist auch, dass die konsole am bei der Anweisung
Code: (dl )
print %is_stopwords,"\n"

folgendes ausgibt..

Code: (dl )
1althoughngss

die Ausgabe macht wenig Sinn, da der Hash, wenn es richtig funktionieren sollte, 319 keys haben soll, und es keinen key wie "althoughngss" haben soll..
Wie kann sowas passieren?
renee
 2007-09-11 17:41
#99340 #99340
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wurde die Stopword.lst vielleicht unter Windows erstellt und Du arbeitest jetzt unter Linux? Oder umgekehrt?
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/
liam21c
 2007-09-11 17:46
#99341 #99341
User since
2007-09-11
5 Artikel
BenutzerIn
[default_avatar]
hmmm es kann sein.
die Liste habe ich von einer anderen Webseite runtergeladen.. und ich arbeite jetzt unter Linux..
soll ich die Liste in Linux noch einmal schreiben und speichern?
oder gibt es da andere leichtere Möglichkeiten?
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2007-09-11 16:21.