起こったこと
事情により、ドキュメント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 件のコメント:
コメントを投稿