2016-03-22 2 views
0

はのは、私は、この文字列どのようにすべてのバイグラムを特定のウィンドウサイズ内で取得できますか?

my_string = "This is an example string" 

を持っており、与えられた「窓」内のすべてのバイグラムを計算するための高速な方法があります場合、私は思っていたとしましょう。例えば

ウィンドウが二つの単語の場合は三つの言葉は、我々は最初の3ワードウィンドウ

["This is","is an","This an","an this",...] 
のためにこれらのバイグラムを持っている場合は、すべての可能なバイグラムは

["This is","is This","is an","an is","an example","example an","example string","string example"] 

しかし、もし窓あり

sklearnを使ってbigramsを取得するのは簡単です。たとえば、1は

bigrams = CountVectorizer(analyzer = "word", 
        strip_accents = "ascii", 
        lowercase = True, 
        ngram_range = (2,2)) 

bigrams_counts = bigrams.fit_transform(my_string) 

を行うことができますし、あなたのすべてのバイグラムのリスト(とさえ数)を得ますが、それはすなわち(文字列ではなく、他の組み合わせに存在バイグラム「このANを」のみが含まれますと "これは"そこにはありません)。

したがって、特定のウィンドウ内ですべてのバイグラムを取得する方法があるかどうかは分かりますか?例から

+3

[バイグラム](HTTPSの定義を確認してください。 //en.wikipedia.org/wiki/Bigram)。あなたがバイグラムではなくウィンドウ内の単語の組み合わせを求めるのは、ほとんどの場合です。 –

答えて

3

["This is","is an","This an","an this",...] 

これらはバイグラムようには見えませんが、窓からの言葉の順列。 3つの言葉のために、それは次のようになります。あなたはカウントが必要な場合は、カウント(ウィンドウのサイズEGオーバーラップ量に依存)Counterを使用しますが、その重複等三倍、倍増させます用心

from itertools import permutations, chain 
from functools import partial 

my_string = "This is an example string".split() 
set(chain.from_iterable(map(partial(permutations, 
            r=2), 
          zip(my_string, 
           my_string[1:], 
           my_string[2:])))) 

与えられた単語の対について。

from collections import Counter 

Counter(chain.from_iterable(map(partial(combinations, r=2), 
           zip(my_string, 
            my_string[1:], 
            my_string[2:])))) 

と結果:

Counter({('is', 'an'): 2, ('an', 'example'): 2, ('This', 'is'): 1, ('This', 'an'): 1, ('example', 'string'): 1, ('an', 'string'): 1, ('is', 'example'): 1}) 

そして、あなたは別の結果として、ウィンドウが必要な場合は、最終的に、チェーンをスキップ:

list(map(partial(permutations, r=2), 
     zip(my_string, my_string[1:], my_string[2:]))) 
+0

nlpドメインでの機械学習では、バイグラムがテキスト内で発生した回数は予測能力を持つかもしれません。だから、なぜ 'set'?同様に、3つの単語ではなく、テキスト上の動くウィンドウにこれらの順列をどのように適用しますか?重複の2つの同じ組み合わせは、異なる組み合わせまたは同じものとしてカウントされますか? –

+0

その後、 'Counter'を使います。また、これらはバイグラムではありません。隣接する要素を意味するからです。 –

+0

「3語ではなく、テキスト上のウィンドウを動かす」とはどういう意味ですか?異なるウィンドウからのものであるため、オーバーラップの同じ組み合わせがカウントされます。 –

関連する問題