2016-06-18 17 views
-2

ich habe einen Text enthält Sätze in jeder Zeile, und vor jedem Wort seiner lemmetize Form exemple:Extract n Worte aus Zeichenfolge mit Perl

er „er“ ging „go“ auf „“ Schule „Schule "mit‚mit‘seinem‚seinem‘freinds‚freind‘

ich mochte zum Beispiel drei mal drei Wort extrahieren in in jeder Zeile. Das Ergebnis scheint wie folgt aus:

er „er“ ging „go“ auf „“ \ n
ging „go“ auf „“ Schule „Schule“ \ n
zu „bis“ Schule „Schule“ mit „mit“ \ n
Schule „Schule“ mit „mit“ seinem „seinem“ \ n
mit „mit“ seinem „seinem“ freinds „freind“ \ n

ich möchte, dies zu tun mit Perl.

+0

Was Sie suchen, ist n-Gramm. Google "N-Gramm Perl" und Sie werden viele Möglichkeiten finden, dies zu tun, einschließlich Module auf CPAN. –

+0

gehst du die Datei werfen. Für jede Zeile teilen Sie es durch das * Leerzeichen * Zeichen. 'for (int i = 0; i Greg

+0

Also, wo ist dein Code? Was hast du probiert? – melpomene

Antwort

0

danke alle für Ihre Hilfe, ich fand eine Lösung, es funktioniert, aber es ist in schmutzigen Code denke ich, deshalb habe ich diese Frage gestellt, um eine bessere Lösung zu finden, die awk Lösung scheint groß, aber das Ergebnis nicht mögen Ich sehe,

Dies ist die Lösung, die ich das Fenster bei 7 Worten und vor jedem Wort, es ist POS und es ist leummierte Form: er "er" "PRO" ging "gehen" "V" zu "zu" „PREP“ Schule „Schule“ „N“ ...

open(F,"/home/file.txt")||die "error"; 

my $string; 

while($ligne = <F>) { 

my @val = split(/ /, $ligne); 
my $long=$#val; 

for($i=0; $i<$long;$i+=3){ 


$string="$val[$i] $val[$i+1] $val[$i+2] $val[$i+3] $val[$i+4] $val[$i+5] $val[$i+6] $val[$i+7] $val[$i+8] $val[$i+9] $val[$i+10] $val[$i+11] $val[$i+12] $val[$i+13] $val[$i+14] $val[$i+15] $val[$i+16] $val[$i+17] $val[$i+18] $val[$i+19] $val[$i+20]"; 

my @val2 = split(/ /, $string); 
my $long2=$#val2; 
if($long2 >19){ #if length superior at 19, (3*7) 
print FILEOUT "$string\n"; 
$string=""; 
} 

     } 

} 
+0

Sie können Ihre eigene Antwort akzeptieren. https://blog.stackoverflow.com/2009/01/accept-your-own-answers/ –

0

Dieses Skript startet durch die gesamte Zeile als Array von Wörtern (@words) zu lesen und verwendet dann eine @aux Array als FIFO ... verwerfen g die ersten 2 Elemente bei jedem Durchlauf und die FIFO-Größe immer 6 itens halten ... dann, reapeat während es Worte im @words Array sind:

#!/usr/bin/perl 
use strict; 

my $file = 'file.txt'; 
open(F,$file)||die "error"; 
my @aux; 
while(<F>) { 
    my @words = split /\s+/; 
    while($#words >= 0) { 
    while($#aux < 5 && $#words >= 0) { 
     my $a = shift @words; 
     push @aux, $a; 
    } 
    print ((join " ", @aux)."\n"); 
    shift @aux; 
    shift @aux; 
    } 
} 
Verwandte Themen