2011-04-01 10 views
0

POSタグ付きフレーズthe_DT flower_NN pot_NNがあり、すべての名詞シーケンスをアンダースコアで区切られた単一の名詞に結合したいと考えています。the_DT flower_pot_NNruby​​ regex:POSタグ付きデータの名詞クラスターを置換する

私は次のことをしようとしている:

s.gsub!(/ ([^ ]+)_NN ([^ ]+)_NN/, " #{$1}_#{$2}_NN") 

のような行に複数の名詞がある場合は、この解決策は失敗します。the_DT monster_truck_wallpaper_NNなるはずthe_DT monster_NN truck_NN wallpaper_NNは、。

どうすればよいですか?

+0

あなたの例の出力を 'the_DT monster_truck_wallpaper_NN'にしますか? – climbage

+0

はい: 'the_DT monster_NN truck_NN wallpaper_NN'は次のようになります:' the_DT monster_truck_wallpaper_NN' – dsg

答えて

2
while s.gsub!(/\b(\S+)_NN\s+(\S+)_NN\b/, '\1_\2_NN') 
end 

再帰(または反復)のための準備がないため、すべてを一度に正規表現で行うことはできません。あなたがすることは、隣接するペアを結合し、隣接するNNがなくなるまで繰り返すことです。

EDIT:交換部品も同様に修正されました。今すぐ働かなければならない。

+0

これはうまくいかないようです。 '$ 1'と' $ 2'はうんざりしているようです。 – dsg

+0

'x = the_DT monster_NN truck_NN wallpaper_NN'のとき' x {{1} _ {(2})} NN/s +([^] +)_ NN/"); 'the_DT monster_truck_NN'を返します。 – dsg

+0

Heh、申し訳ありませんが、最初に正しい表現を確認していませんでした。それでも、答えの本質は変わらない: 'while'ループです。 – Amadan

1

また、1つのグローバル置換を使用してこれを試すこともできます。

s.gsub!(/_NN\s+(?=\b[^ ]+_NN)/, "_"); 
+0

うーん、良いキャッチ! – Amadan

関連する問題