File failed to load: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/extensions/TeX/AmsMath.js

February 4, 2015

doc2vecに類似ラベル・ワードを探すメソッドの追加

word2vecはワードに対してベクトルを割り当てるが、doc2vec(aka paragraph2vec, aka sentence embeddings)は各ドキュメントに付けられたラベルに対してもベクトルを割り当てる。

gensimのdoc2vecはword2vecの拡張としてDistributed Representations of Sentences and Documentsの実装されている。チュートリアルはこれ

似ているワードやドキュメントを取ってくるmost_similarというメソッドがあるが、ワードなのかラベルなのかは区別されない。そこで元のプロジェクトをフォークして限定して取得できるようにした。

satomacoto/gensim

フォーク先のブランチからインストールためにはzipを使ってpip install。


追記 2015/2/5

negativeオプションが効かなかったのを修正。

$ pip install -U https://github.com/satomacoto/gensim/archive/doc2vec-mostSimilarWordsAndLabels.zip

追加したメソッドはmost_similar_labelsとmost_similar_words。またワードのリストのリストをドキュメント群としてみなすためにLabeledListSentenceクラスを追加。各ドキュメントには順番にSENT_0, SENT_1…とラベルが振られる。ラベルは複数振ることができるのでクラスは自分で書いたほうがいいかも。実装はこれ

以下サンプル。

>>> import gensim
>>> sentences = [
... ['human', 'interface', 'computer'], #0
... ['survey', 'user', 'computer', 'system', 'response', 'time'], #1
... ['eps', 'user', 'interface', 'system'], #2
... ['system', 'human', 'system', 'eps'], #3
... ['user', 'response', 'time'], #4
... ['trees'], #5
... ['graph', 'trees'], #6
... ['graph', 'minors', 'trees'], #7
... ['graph', 'minors', 'survey'] #8
... ]
>>> labeledSentences = gensim.models.doc2vec.LabeledListSentence(sentences)
>>> model = gensim.models.doc2vec.Doc2Vec(labeledSentences, min_count=0)
>>> model.labels
{'SENT_5', 'SENT_0', 'SENT_2', 'SENT_3', 'SENT_6', 'SENT_4', 'SENT_1', 'SENT_8', 'SENT_7'}
>>> model.most_similar_labels('SENT_0')
[('SENT_7', 0.09040503203868866), ('SENT_8', 0.05388247221708298), ('SENT_3', 0.018625225871801376), ('SENT_6', 0.0021968595683574677), ('SENT_2', -0.005669509992003441), ('SENT_1', -0.034463658928871155), ('SENT_5', -0.044474877417087555), ('SENT_4', -0.11045961081981659)]
>>> model.most_similar_words('human')
[('eps', 0.0804225355386734), ('system', 0.0298603605479002), ('graph', 0.024964405223727226), ('user', 0.020017698407173157), ('computer', 0.00942305475473404), ('interface', 0.006561885587871075), ('response', -0.0009844079613685608), ('time', -0.02301063761115074), ('survey', -0.049963727593421936), ('trees', -0.11870135366916656)]
>>> model.most_similar_words(positive=['SENT_0', 'SENT_1'], negative=['SENT_2'], topn=5)
[('human', 0.10655776411294937), ('response', 0.0948006808757782), ('interface', 0.07383717596530914), ('eps', 0.04268331080675125), ('graph', 0.02581930160522461)]
view raw gistfile1.py hosted with ❤ by GitHub
SENT_0と一番に似てるのはSENT_7ということだが…

No comments:

Post a Comment