2016-07-12 1 views
-1

シーケンスに基づいて文章内で見つけたい単語のリストが2つあります。私は "正規表現"を使用することが可能かどうかを確認したいのですか?条件を使用して文章をチェックする必要がありますか?文中のシーケンス単語のリストを認識するための最良の方法を見つける

  • n_ali + positive_adj
  • n_ali + negative_adj
  • n_leyla + positive_adj
  • n_leyla + negative_adj

n_ali = set(['ali','aliasghar']) 
n_leyla = set(['leyla','lili',leila]) 
positive_adj = set(['good','nice','handsome']) 
negative_adj = set(['bad','hate','lousy']) 


Sentence = "aliasghar is nice man. ali is handsome man of my life. lili has so many bad attitude who is next to my friend. " 

私は以下のように任意のパターンを見つけるしたいと思います私はVS2015でPython 3.5を使用しています。 NLTKの新機能私は単一の単語をチェックするための "正規表現"を作成する方法を知っていますが、私は類似の名前のリストのための最良のアプローチは何か分かりません。親切に私を助け、このアプローチを実装する最善の方法を教えてください。

答えて

1

ストップワードの削除を検討する必要があります。

import nltk 
from nltk.corpus import stopwords 
>>> words = [word for word in nltk.word_tokenize(sentence) if word not in stopwords.words('english')] 
>>> words 
['aliasghar', 'nice', 'man', '.', 'ali', 'handsome', 'man', 'life', '.', 'lili', 'many', 'bad', 'attitude', 'next', 'friend', '.'] 

さてさて、あなたがそれを望むようになりましたあなたは(主に)データを持っています。単純なループを使用して、alileilaのペアで結果を別々に保存しましょう。私たちは「多くの人が」ストップワードではないので、どんな形容詞がleilaを記述するために見つけることができませんでした

>>> ali_adj = [] 
>>> leila_adj = [] 
>>> for i, word in enumerate(words[:-1]): 
...  if word in n_ali and (words[i+1] in positive_adj.union(negative_adj)): 
...    ali_adj.append((word, words[i+1])) 
...  if word in n_leyla and (words[i+1] in positive_adj.union(negative_adj)): 
...    leila_adj.append((word, words[i+1])) 
... 
>>> 
>>> ali_adj 
[('aliasghar', 'nice'), ('ali', 'handsome')] 
>>> leila_adj 
[] 

注意。あなたは、このタイプの文章を手作業で掃除する必要があります。

+0

あなたの素敵な答えをありがとう。それは私の問題の70%を解決しています。この例では、問題があることを確認した場合です。このパターンが認識できる名前の後にadjが来る場合にのみあなたは[i + 1]という言葉を使用しています。 liliの場合はliliとbadを認識できませんが、例えば 'lili'、 'many'、 'bad'などです。このパターンを他のケースに拡張することをお勧めしますか?解析速度は低下しませんか?または我々はまた多くを削除する必要がありますか? – Amir

+1

大きな文書で「たくさん」のようにいくつの単語を削除する必要があるのか​​よくわからないので、2つ先の形容詞(1つではなく)を確認するといいでしょう。 – slider

+0

インデックス外の例外はありませんか?私は試してそれを制御し、キャッチしなければならない? – Amir

関連する問題