2017-10-24 4 views
0

私は現在、人々の関係を検出するための簡単なスクリプトに取り組んでいます。私は、$ npを適切な名詞の正規表現と定義します。 私の最初の仕事では、目的は、それらの間の単語の数が固定値よりも少ない別の固有名詞の左側に現れるすべての固有名詞を見つけることです。私は、次のコードを書かれている:perlで捕獲されたグループを得る方法

$/ = ''; 

my $PM = qr{\b[A-Z][\w-]*\w}; 
my $de = qr{d[aoe]s?}; 
my $s = qr{[\n ]}; 
my $np = qr{$PM (?: $s $PM | $s $de $s $PM)*}x; 

while(<>){ 
    while(/($np)/g){ 
    print("$1 : "); 
    my @x = m/(?=(?: $s+ (?: [\w-]+ | ($np))){1,7})/gx; 
    my $y = join(", ", @x); 
    print("$y\n"); 
    } 
} 

私はそれがそれらの各1、ウィンドウ内にある固有名詞のために、ファイル内のすべての固有名詞を印刷しすると予想しました。しかし、これは起こっていません。 私はそれが私が望むように動作させることができますか?

PS:私はperlの初心者だ

EDIT:一部の人々が期待される入力と出力のサンプルを追加することをお勧めします。 私は

John asked Mary to meet Anna. 

次のテキストを使用してファイルを持っていた場合、私は私のスクリプトは、現在の状態で、私は無限ループに印刷されたカンマを取得し、しかし

John : Mary, Anna 
Mary : Anna 
Anna : 

を印刷したいと思います。

+0

質問を入力して入力してください。あなたが話しているファイルが役に立つでしょう。 – simbabque

+0

また、すでに '/ x'修飾子を使用しています。これは素晴らしい方法です。しかし、物事の間に単一のスペースを置くのではなく、正しく字下げしてコメントを追加するのはなぜですか?そうすれば、私たちのために、そしてあなたの未来の自己(おそらく既に明日、パターンを見て)のために読むことがより簡単になります。 – simbabque

答えて

0

あなたは第二試合を行った後$_の一致の位置が再び変更されているため、あなたは無限ループを取得します。あなたはこれを回避するために、試合前という名前の変数に割り当てることができ:

while(<>) { 
    my $line = $_; 
    while($line =~/($np)/g) { 
     ... 
    } 
} 

は詳細についてはUsing regular expressions in Perlpos()を参照してください。

0

正規表現を使用する必要がありますか?私にとって最善の方法ではないようです。 私は文字列を単語に分割し、それを通過します。以下のコードのようなもの。

あなたの仕様を正しく理解しているかわかりません。私のコードが行うことは、他の適切な名前の左に一定距離以内に現れる適切な名前を見つけることです。

my $window = 3; 


my %result; 
while(<DATA>){ 

    my @words = map {$_ =~ s/[[:punct:]]$//; $_} split; 

    my $index = $#words; 
    for (my $index = $#words; $index > 0; $index--) { 

    my $word = $words[$index]; 

    next unless is_name($word); 

    my $start_index = $index - 3; 
    $start_index = 0 if $start_index < 0; 

    my $end_index = $index - 1; 
    $end_index = 0 if $end_index < 0; 

    my @neigbours = grep {is_name($_)} @words[$start_index .. $end_index]; 

    $result{$word} = [@neigbours] if @neigbours; 

    } 
} 


sub is_name { 

    shift =~ /^[A-Z][\w-]*\w$/; 

} 

__DATA__ 
John asked Mary to meet Anna. 
関連する問題