如何解释以前看到的数据的 doc2vec 结果?

How to interpret doc2vec results on previously seen data?

我使用 gensim 4.0.1 并训练 doc2vec:

from gensim.test.utils import common_texts
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
    
sentences = [['hello', 'world'], ['james', 'bond'], ['adam', 'smith']]
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(sentences)]
model = Doc2Vec(documents, vector_size=5, window=5, min_count=0, workers=4) 
documents
    [TaggedDocument(words=['hello', 'world'], tags=[0]),
    TaggedDocument(words=['james', 'bond'], tags=[1]),
    TaggedDocument(words=['adam', 'smith'], tags=[2])]
model.dv[0],model.dv[1],model.dv[2]
        (array([-0.10461631, -0.11958256, -0.1976151 ,  0.1710569 ,  0.0713223 ],
               dtype=float32),
         array([ 0.00526548, -0.19761242, -0.10334401, -0.19437183,  0.04021204],
               dtype=float32),
         array([ 0.05662392,  0.09290017, -0.08597242, -0.06293383, -0.06159503],
               dtype=float32))

我希望在 TaggedDocument #1 上找到匹配项

seen = ['james','bond']

令人惊讶的是,已知文本 (james bond) 产生了一个完全“看不见”的矢量:

new_vector = model.infer_vector(seen)
new_vector
        
        array([-0.07762126,  0.03976333, -0.02985927,  0.07899596, -0.03556045],
              dtype=float32)

most_similar() 没有指向预期的 Tag=1。此外,所有 3 个分数都很弱,意味着完全看不见的数据。

model.dv.most_similar_cosmul(positive=[new_vector]) 
[(0, 0.5322251915931702), (2, 0.4972134530544281), (1, 0.46321794390678406)]

这里有什么问题,有什么想法吗?

对于只有 6 个词、6 个唯一词和 3 个 2 词文本的玩具大小的数据集来说,五个维度仍然太多了。

Word2Vec/Doc2Vec/FastText 类型算法的

None 适用于少量人为数据。他们只从不同上下文中的许多微妙对比的单词用法中学习他们的模式。

它们的真正优势只有在 50、100 或数百维宽的向量中才会显现出来——而许多维度的训练需要(至少)数千个单词的独特词汇表——理想情况下是数十或数百个数千个单词——每个单词都有许多用法示例。 (对于像 Doc2Vec 这样的变体,您同样需要成千上万种不同的文档。)

当使用足够的训练数据时,您会发现与预期结果的相关性得到改善。