web-dev-qa-db-ja.com

Gensimを使用してトリグラムを取得する際の問題

私が言及した例文からバイグラムとトリグラムを取得したいと思います。

私のコードはバイグラムで正常に機能します。ただし、データ内のトリグラムはキャプチャされません(たとえば、私の文章の5か所で言及されているヒューマンコンピュータインタラクション)

アプローチ1以下に、Gensimでフレーズを使用した私のコードを示します。

from gensim.models import Phrases
documents = ["the mayor of new york was there", "human computer interaction and machine learning has now become a trending research area","human computer interaction is interesting","human computer interaction is a pretty interesting subject", "human computer interaction is a great and new subject", "machine learning can be useful sometimes","new york mayor was present", "I love machine learning because it is a new subject area", "human computer interaction helps people to get user friendly applications"]
sentence_stream = [doc.split(" ") for doc in documents]

bigram = Phrases(sentence_stream, min_count=1, threshold=1, delimiter=b' ')
trigram = Phrases(bigram_phraser[sentence_stream])

for sent in sentence_stream:
    bigrams_ = bigram_phraser[sent]
    trigrams_ = trigram[bigrams_]

    print(bigrams_)
    print(trigrams_)

アプローチ2フレーズとフレーズの両方を使おうとしましたが、うまくいきませんでした。

from gensim.models import Phrases
from gensim.models.phrases import Phraser
documents = ["the mayor of new york was there", "human computer interaction and machine learning has now become a trending research area","human computer interaction is interesting","human computer interaction is a pretty interesting subject", "human computer interaction is a great and new subject", "machine learning can be useful sometimes","new york mayor was present", "I love machine learning because it is a new subject area", "human computer interaction helps people to get user friendly applications"]
sentence_stream = [doc.split(" ") for doc in documents]

bigram = Phrases(sentence_stream, min_count=1, threshold=2, delimiter=b' ')
bigram_phraser = Phraser(bigram)
trigram = Phrases(bigram_phraser[sentence_stream])

for sent in sentence_stream:
    bigrams_ = bigram_phraser[sent]
    trigrams_ = trigram[bigrams_]

    print(bigrams_)
    print(trigrams_)

トリグラムを取得するこの問題を修正するのを手伝ってください。

私はGensimの サンプルドキュメント をフォローしています。

9
user8566323

コードにいくつかの変更を加えるだけで、バイグラムとトリグラムを取得できました。

_from gensim.models import Phrases
documents = ["the mayor of new york was there", "human computer interaction and machine learning has now become a trending research area","human computer interaction is interesting","human computer interaction is a pretty interesting subject", "human computer interaction is a great and new subject", "machine learning can be useful sometimes","new york mayor was present", "I love machine learning because it is a new subject area", "human computer interaction helps people to get user friendly applications"]
sentence_stream = [doc.split(" ") for doc in documents]

bigram = Phrases(sentence_stream, min_count=1, delimiter=b' ')
trigram = Phrases(bigram[sentence_stream], min_count=1, delimiter=b' ')

for sent in sentence_stream:
    bigrams_ = [b for b in bigram[sent] if b.count(' ') == 1]
    trigrams_ = [t for t in trigram[bigram[sent]] if t.count(' ') == 2]

    print(bigrams_)
    print(trigrams_)
_

バイグラムPhrasesから_threshold = 1_パラメーターを削除しました。そうしないと、奇妙なトリグラムの作成を可能にする奇妙なダイグラムを形成するように見えるためです(bigramがトリグラムPhrasesの作成に使用されることに注意してください)。このパラメーターは、より多くのデータがある場合に役立つ可能性があります。トリグラムの場合、_min_count_パラメーターも指定する必要があります。指定しない場合はデフォルトで5になるためです。

各ドキュメントのバイグラムとトリグラムを取得するために、このリスト内包法を使用して、それぞれ2つまたは3つの単語で形成されていない要素をフィルタリングできます。


編集-thresholdパラメーターに関するいくつかの詳細:

このパラメーターは、2つの単語abがフレーズを形成するかどうかを判別するために推定器によって使用され、それは次の場合にのみ使用されます。

_(count(a followed by b) - min_count) * N/(count(a) * count(b)) > threshold
_

ここで、[〜#〜] n [〜#〜]は語彙の合計サイズです。デフォルトでは、パラメータ値は10です( docs を参照)。したがって、thresholdが高いほど、単語がフレーズを形成するための制約が難しくなります。

たとえば、最初のアプローチでは_threshold = 1_を使用しようとしていたため、「ヒューマンコンピュータインタラクション」で始まる5つの文のうち3つのダイグラムとして_['human computer','interaction is']_を取得します。その奇妙な2番目のダイグラムは、より緩和されたしきい値の結果です。

次に、デフォルトの_threshold = 10_でトリグラムを取得しようとすると、これらの3つの文では_['human computer interaction is']_のみが取得され、残りの2つの文では何も取得されません(しきい値でフィルタリング)。これはトリグラムではなく4グラムであるため、if t.count(' ') == 2によってもフィルタリングされます。たとえば、トリグラムのしきい値を1に下げると、残りの2つの文のトリグラムとして[「ヒューマンコンピュータインタラクション」]を取得できます。パラメータの適切な組み合わせを取得するのは簡単ではないようです、 ここに それについての詳細。

私は専門家ではないので、この結論を一粒の塩で考えてください。奇妙なダイグラムはさらなるトリグラムに混乱をもたらす可能性があるため、先に進む前にまず良いダイグラム結果を得る方が良いと思います(「相互作用は」ではありません)4。 -グラム...

8
stjernaluiht