2017-12-20 43 views
1

は、テキストのコーパスで見つかったトップn最も一般的なバイグラムの、top_n、私はタプルのリストを持っていると言う:NLTKを使ってバイグラムを置き換えるには?

import nltk 
from nltk import bigrams 
from nltk import FreqDist 

bi_grams = bigrams(text) # text is a list of strings (tokens) 
fdistBigram = FreqDist(bi_grams) 

n = 300 
top_n= [list(t) for t in zip(*fdistBigram.most_common(n))][0]; top_n 
>>> [('let', 'us'), 
    ('us', 'know'), 
    ('as', 'possible') 
    .... 

は今、私はとtop_nにバイグラムある単語のセットのインスタンスを交換したいですそれらの連結は、である。例えば、我々は文字列のリストであるquery新しい変数を持っていると言う:

query = ['please','let','us','know','as','soon','as','possible'] 

は、所望の動作後

['please','letus', 'usknow', 'as', 'soon', 'aspossible'] 

なります。より具体的には、queryのすべての要素を検索し、i番目と(i + 1)番目の要素がtop_nにあるかどうかを確認したいと思います。そうである場合は、query[i]query[i+1]を連結した1つのバイグラムで置き換えます。つまり、(query[i], query[i+1]) -> query[i] + query[i+1]です。

NLTKを使用してこれを行う方法はありますか、queryの各単語をループする必要がある場合は、これを行う最もよい方法は何ですか?

+0

私はあなたの入力が間違っていると感じている、クエリはバイグラムのリストではありません。 – Arne

+0

でない場合、 '[token_1のトークン+1トークン2、zipのトークン2(クエリ[: - 1]、[] '' +クエリ[2:])] ' – Arne

+0

あなたの出力には、 。正確に何をしたいのですか?それは連結されたバイグラムのリストではありません:< – Arne

答えて

1

あなたのコードと、彼らはtop_nにあった場合の言葉は貪欲に自分のバイグラムに置き換えられますクエリ、を考えると、これはトリックを行いますが(たとえば)で

lookup = set(top_n) # {('let', 'us'), ('as', 'soon')} 
query = ['please', 'let', 'us', 'know', 'as', 'soon', 'as', 'possible'] 
answer = [] 
q_iter = iter(range(len(query))) 
for idx in q_iter: 
    answer.append(query[idx]) 
    if idx < (len(query) - 1) and (query[idx], query[idx+1]) in lookup: 
     answer[-1] += query[idx+1] 
     next(q_iter) 
     # if you don't want to skip over consumed 
     # second bi-gram elements and keep 
     # len(query) == len(answer), don't advance 
     # the iterator here, which also means you 
     # don't have to create the iterator in outer scope 

print(answer) 

結果:

>> ['please', 'letus', 'know', 'assoon', 'as', 'possible'] 
+0

答えが分かりましたが、問題は 'query_'の単語を置き換えるときに変数' top_n'を使わないことです。変数 'query'のすべての要素を検索し、i番目と(i + 1)番目の要素が' top_n'にあるかどうかをチェックしたいと思います。そうであれば、 'query [i] + query [i + 1]'を単一の連結されたbigramすなわち '(query [i]、query [i + 1]) - i + 1]となる。質問をより明示的に編集するようにしましょう。 – killerT2333

+1

申し訳ありません、私は今あなたの質問を理解し、私の答えを言い換えると思います。しかし、ああ、それを解読するのは大変だった。 – Arne

+0

私はまだ間違っていることに気づいた。 3つの余時の単語がtop_nリストにある場合はどうなりますか? – Arne

0

代替答え:

from gensim.models.phrases import Phraser 
from gensim.models import Phrases 
phrases = Phrases(text, min_count=1500, threshold=0.01) 
bigram = Phraser(phrases) 
bigram[query] 
>>> ['please', 'let_us', 'know', 'as', 'soon', 'as', 'possible'] 

ない正確にデその質問で望まれる出力が得られるが、これは代替手段として機能する。入力min_countthresholdは出力に強く影響します。 this question hereに感謝します。

関連する問題