Toon posts:

[perl] zoeken naar een woord in de zin en woord daarna/voor

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een script voor zogenaamde bigrammen. Dus een script dat een tekst doorloopt en woordcombinaties opslaat, die combinaties zijn het volgende.

bv: A B C D E F G H I J

laten we zeggen we willen E hebben en slaat daarbij ook D E en E F op in een hash.

Ik had al een script geschreven die alle mogelijke woord combinaties opslaat. Dat gaat als volgt.
Ik heb een reference file, waarin woorden staan. De tekst heb ik per zin op 1 regel gezet. Hij doorloopt dus alle regels en kijkt of er een woord uit de reference file matched. ZO ja, dan slaat hij alle woord combinaties op. Maar dat is niet wat ik uiteindelijk wil.

Ik wil dus dat hij het woord en het woord ervoor en erna opslaat.
Nu dacht ik al als ik een array heb en het gematchte woord is woorden[9] dat is de vorige dus woorden[9-1] en de volgende woorden[9+1] alleen is het gematchte woord uiteraard niet standaar woorden[9] maar verschillend.

Uitprogammeren is uiteindelijk niet moeilijk maar ik kom er niet op hoe ik dit probleem kan oplossen, wie kan mij op weg helpen?

een fragment uit mijn code maakt het waarschijnlijk duidelijker:

code:
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
while (<REFERENCE>) { @reference_words = split (/;/,$_); }
# zet de woorden van de reference file in een array

while (<CORPUS>) {
#doorloop het corpus
    
    $zin = $_;  
    
    $totaal_zinnen++;
    #totaal aantal zinnen +1

    foreach  my $word(@reference_words) {
    #doorloop de array met referentie woorden

        if ($zin =~ /\b$word\b/i) {
        #matched het reference woord in de zin dan
        
            @words_zin = split (/ /,$zin);
            #split de zin op woordbasis en zet de woorden uit de zin in een array


                foreach  my $word_zin(@words_zin) {
                #doorloop de array met woorden uit de zin

                    if ($word_zin =~ /\w/) {
                    #als het woord begint met een woordteken
                                                                    
                            if ($word ne $word_zin) {
                            #referentie woord moet niet gelijk zijn aan woord uit de zin, dus niet {voorbeeld}{voorbeeld}
                                
                                $bigram{$word}{$word_zin}++;
                                #zet deze in de hash bigrammem in combi met reference woord dus bv {een}{computer}
                            }
                        
                    }
                }

            
        }
    }

    
}

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Kun je niet beter direct de woorden die voor en na het woord komen matchen op regel 15 :?
iets in de trant van:
code:
1
/\b((?!\2)\w+)\b($word)\b((?!\2)\w+)/i

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
drm schreef op 07 juli 2004 @ 15:34:
Kun je niet beter direct de woorden die voor en na het woord komen matchen op regel 15 :?
iets in de trant van:
code:
1
/\b((?!\2)\w+)\b($word)\b((?!\2)\w+)/i
ik moet even denken wat je precies bedoelt. je bedoelt dus als hij het moet een woord X HET WOORD woord Y matchen? en dat slaat hij dan op in een array dus woorden[0] = woord X
woorden[1] = het woord
woorden[2] = woord y

ik heb wel nog dit bedacht:

code:
1
2
3
4
5
6
7
8
9
10
11
while (@words_zin > 1) {
                ($word, $word_zin) = splice @words_zin, 0, 2;
                
                if ($word_zin =~ /\w/) {

                    if ($word ne $word_zin) {

                        $bigram {$word}{$word_zin}++;
                        unshift @words_zin, $word_zin;
                    }
                }

[ Voor 23% gewijzigd door Verwijderd op 07-07-2004 16:00 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

femkester:
ik moet even denken wat je precies bedoelt. je bedoelt dus als hij het moet een woord X HET WOORD woord Y matchen? en dat slaat hij dan op in een array dus woorden[0] = woord X
woorden[1] = het woord
woorden[2] = woord y
zoiets, ja. Dat moet toch makkelijk direct met een regex kunnen?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
drm schreef op 07 juli 2004 @ 16:06:
[...]
zoiets, ja. Dat moet toch makkelijk direct met een regex kunnen?
helemaal niet aan gedacht, goede invalshoek! ga even kijken

Verwijderd

Topicstarter
ik heb nu twee oplossingen bedacht, beide werken, maar welke is nu de juiste aangezien ze verschillende antwoorden geven, alleen ik zie niet 1-2-3 welke nu wel juist is...

code:
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
while (<CORPUS>) {
#doorloop het corpus
    
    $zin = $_;  
    
    $totaal_zinnen++;
    #totaal aantal zinnen +1

    foreach  my $word(@reference_words) {
    #doorloop de array met referentie woorden

        if ($zin =~ /\b$word\b/i) {
        #matched het reference woord in de zin dan
        
            @words_zin = split (/ /,$zin);
            #split de zin op woordbasis en zet de woorden uit de zin in een array

            my $i;

            for ($i=0; $i < @words_zin - 1; $i++) {

                if ($words_zin[$i] =~ /\w/ && $words_zin[$i+1] =~ /\w/) {
                
                        $bigram{$words_zin[$i]}{$words_zin[$i+1]}++
                }
        

            }
        }
            


                

            
    }
}


VS

code:
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
while (<CORPUS>) {
#doorloop het corpus
    
    $zin = $_;  
    
    $totaal_zinnen++;
    #totaal aantal zinnen +1

    foreach  my $word(@reference_words) {
    #doorloop de array met referentie woorden

        if ($zin =~ /\b$word\b/i) {
        #matched het reference woord in de zin dan
        
            @words_zin = split (/ /,$zin);
            #split de zin op woordbasis en zet de woorden uit de zin in een array

            my $word_zin;

            while (@words_zin > 1) {
                ($word, $word_zin) = splice @words_zin, 0, 2;
                
                if ($word_zin =~ /\w/) {

                    if ($word ne $word_zin) {

                        $bigram {$word}{$word_zin}++;
                        unshift @words_zin, $word_zin;
                    }
                }
            }
            


                

            
        }
    }

    
}
Pagina: 1