2017-03-15 76 views
0

我有以下方式的形態分析樹,其中前綴,詞幹和後綴是標籤,其他部分是不斷變化的,我需要以開頭的前綴,詞根和後綴重新排序。例如,需要將 (S (un:prefix) (sold:stem))轉換爲(S (prefix:un) (stem:sold))。同樣,(S (S (in:prefix) (decipher:stem)) (able:suffix))(S (S (prefix:in) (stem:decipher)) (suffix:able))保持結構也很重要。重新排列括號內的文本

我的Perl代碼也:

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; 
} 

它不會做預期的任務。那裏有什麼問題?

+0

'$ STR =〜S/\(([^ \(\)] *)\:([^ \(\)] *)\)/ \ ($ 2 \:$ 1 \)/ g;' – ssr1012

+0

'perl -pi -e's/\(([^(] *):([^)] *)\)/ \($ 2:$ 1 \)/ g 'input.txt'其中input.txt是這些行的文件 – yonyon100

回答

1

如果我理解你的問題是正確的,簡單的正則表達式可以替換後綴和前綴。

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

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

print "$str\n"; 

輸出:

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

如果我需要從命令行讀取 – karu

+0

,那麼這個失敗我希望我不清楚 – ssr1012

+0

使用File :: Slurp; $ str = read_file('test.ptb'); (([^ \(\)] *)\:([^ \(\)] *)\)/ \($ 2 \:$ 1 \)/ g; print「$ str \ n」 – karu