word2vecはワードに対してベクトルを割り当てるが、doc2vec(aka paragraph2vec, aka sentence embeddings)は各ドキュメントに付けられたラベルに対してもベクトルを割り当てる。
gensimのdoc2vecはword2vecの拡張としてDistributed Representations of Sentences and Documentsの実装されている。チュートリアルはこれ。
似ているワードやドキュメントを取ってくるmost_similarというメソッドがあるが、ワードなのかラベルなのかは区別されない。そこで元のプロジェクトをフォークして限定して取得できるようにした。
フォーク先のブランチからインストールためには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
…とラベルが振られる。ラベルは複数振ることができるのでクラスは自分で書いたほうがいいかも。実装はこれ。
以下サンプル。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
>>> 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)] |
SENT_0
と一番に似てるのはSENT_7
ということだが…
No comments:
Post a Comment