2017-03-15 3 views
0

Ich habe morphologischen Parse-Baum in der folgenden Weise, wo Präfix, Stiel und Suffix sind Etiketten und andere Teil ist die Änderung Ich muss die Reihenfolge auf eine Weise, dass Präfix, Stiel und Suffix am Anfang. Zum Beispiel muss (S (un:prefix) (sold:stem)) in (S (prefix:un) (stem:sold)) konvertiert werden. Ähnlich (S (S (in:prefix) (decipher:stem)) (able:suffix)) bis (S (S (prefix:in) (stem:decipher)) (suffix:able)). Es ist auch wichtig, die Struktur auch zu behalten.Umordnen von Text innerhalb der Klammern

Mein Perl-Code auch:

use strict; 
use warnings 'all'; 

use List::Util 'reduce'; 

while (<>) { 

    my ($word, $ss) =/\(([^()]*) \) /gx; 

    my @ss = split ' ', $ss; 

    my $str = reduce { sprintf 'S (%s) (%s)', $a, $b } @ss; 

    printf "%s (%s)\n", $str, $word; 
} 

Es ist nicht die beabsichtigte Aufgabe. Was ist das Problem dort?

+0

'$ str = ~ s/\ (([^ \ (\)] *) \: ([^ \ (\)] *) \)/\ ($ 2 \: $ 1 \)/g; ' – ssr1012

+0

' perl -pi -e 's/\ (([^ (] *): ([^)] *) \)/\ ($ 2: $ 1 \)/g 'input.txt' wo input.txt ist deine Datei mit diesen Zeilen – yonyon100

Antwort

1

Wenn ich richtig verstanden auf Ihre Frage einfache Regex kann das Suffix und Präfix ersetzen.

my $str ="(S (un:prefix) (sold:stem)) 
(S (S (in:prefix) (decipher:stem)) (able:suffix)) "; 

$str=~s/\(([^\(\)]*)\:([^\(\)]*)\)/\($2\:$1\)/g; 

print "$str\n"; 

Ausgang:

(S (prefix:un) (stem:sold)) 
(S (S (prefix:in) (stem:decipher)) (suffix:able)) 
+0

Das scheitert, wenn ich von der Befehlszeile – karu

+0

lesen muss Ich hoffe, ich bin nicht klar – ssr1012

+0

verwenden Sie File :: Slurp; $ str = read_file ('test.ptb'); $ str = ~ s/\ (([^ \ (\)] *) \: ([^ \ (\)] *) \)/\ ($ 2 \: $ 1 \)/g; drucken "$ str \ n" – karu

Verwandte Themen