2019年12月8日

gensimのdoc2vecで知らないベクトルが発生している件について

gensimでdoc2vecを使用する際、全く想定していなかったベクトルが生成されていた。 かなり戸惑ったので、残しておく。

起こったこと


事情により、ドキュメントIDがとびとびのドキュメントを使って、doc2vecのモデルを作成しようとしていた。
# こんな感じのデータ doc = {0: ['夢', 'なら', 'ば', 'どれ', 'ほど', 'よかっ', 'た', 'でしょう'], 3: ['未だ', 'に', 'あなた', 'の', 'こと', 'を', '夢', 'に', 'みる']}

このデータでdoc2vecのモデルを作成して作成されたベクトルを見てみたところ、以下の結果になった。
from gensim.models.doc2vec import Doc2Vec, TaggedDocument doc = {0: ['夢', 'なら', 'ば', 'どれ', 'ほど', 'よかっ', 'た', 'でしょう'], 3: ['未だ', 'に', 'あなた', 'の', 'こと', 'を', '夢', 'に', 'みる']} documents = [TaggedDocument(words=words, tags=[id]) for id, words in doc.items()] model = Doc2Vec(documents=documents, min_count=1) print(0 in model.docvecs) #=> True print(1 in model.docvecs) #=> True <= ?????????????????????? print(2 in model.docvecs) #=> True <= ?????????????????????? print(3 in model.docvecs) #=> True print(4 in model.docvecs) #=> False print(5 in model.docvecs) #=> False

tagが0と3のベクトルのみ作成されると思っていたのに、1,2のドキュメントも作成されていた。

調査結果


gensimのdoc2vecでは、tagをint型で指定するとtagの値をそのままベクトル配列のindexとして使用するらしい。
そのため、とびとびの値を指定すると、間のインデックスの分も勝手に埋められてしまうとのこと。
どんなベクトルで埋められるのかは不明。
機会があれば、調査してみたい。

str型のtagを指定した場合


tagをstr型にしてみる。
from gensim.models.doc2vec import Doc2Vec, TaggedDocument doc = {'0': ['夢', 'なら', 'ば', 'どれ', 'ほど', 'よかっ', 'た', 'でしょう'], '3': ['未だ', 'に', 'あなた', 'の', 'こと', 'を', '夢', 'に', 'みる']} documents = [TaggedDocument(words=words, tags=[id]) for id, words in doc.items()] model = Doc2Vec(documents=documents, min_count=1) # 指定したtagのみベクトルが生成されている print('0' in model.docvecs) #=> True print('1' in model.docvecs) #=> False print('2' in model.docvecs) #=> False print('3' in model.docvecs) #=> True print('4' in model.docvecs) #=> False print('5' in model.docvecs) #=> False # ベクトル配列のindex的にも、二つだけ登録されている print(0 in model.docvecs) #=> True print(1 in model.docvecs) #=> True print(2 in model.docvecs) #=> False print(3 in model.docvecs) #=> False print(4 in model.docvecs) #=> False print(5 in model.docvecs) #=> False

結論


gensimのdoc2vecを使用する場合、tagはstr型にしたほうが良さげ。

参考


https://stackoverflow.com/questions/54521323/i-get-more-vectors-than-my-documents-size-gensim-doc2vec

※この問題の直接のQAではないが、回答内でintの場合に間が埋められる仕様について説明されている。
gensimのdoc2vecの作者による回答のため、間違いないはず。

0 件のコメント:

コメントを投稿