doc2vec不准确的余弦相似度

out*_*ier 1 python machine-learning gensim word2vec doc2vec

我已经训练了400万条记录的doc2vec模型.我想从我的数据中找到一个新句子,但是我的结果非常糟糕.

数据样本:

Xolo Era (Black, 8 GB)(1 GB RAM).
Sugar C6 (White, 16 GB)(2 GB RAM).
Celkon Star 4G+ (Black & Dark Blue, 4 GB)(512 MB RAM).
Panasonic Eluga I2 (Metallic Grey, 16 GB)(2 GB RAM).
Itel IT 5311(Champagne Gold).
Itel A44 Pro (Champagne, 16 GB)(2 GB RAM).
Nokia 2 (Pewter/ Black, 8 GB)(1 GB RAM).
InFocus Snap 4 (Midnight Black, 64 GB)(4 GB RAM).
Panasonic P91 (Black, 16 GB)(1 GB RAM).
Run Code Online (Sandbox Code Playgroud)

在传递这些数据之前,我已经完成了预处理,包括1)停止删除单词.2)特殊字符和数值删除.3)小写数据.我也在测试过程中执行了相同的步骤.

我用于培训的代码:

sentences=doc2vec.TaggedLineDocument('training_data.csv') # i have used TaggedLineDocument which can generate label or tags for my data

max_epochs = 100
vec_size = 100
alpha = 0.025

model = doc2vec.Doc2Vec(vector_size=vec_size,
                alpha=alpha, 
                min_alpha=0.00025,
                dm =1,
                min_count=1)
model.build_vocab(sentences)
model.train(sentences, epochs=100, total_examples=model.corpus_count)
model.save('My_model.doc2vec')
Run Code Online (Sandbox Code Playgroud)

好吧,我是gensim和doc2vec的新手所以我已经按照一个例子来训练我的模型所以如果我使用了错误的参数请纠正我.

在测试方面

model = gensim.models.doc2vec.Doc2Vec.load('My_model.doc2vec')
test = 'nokia pewter black gb gb ram'.split()
new_vector = model.infer_vector(test)
similar = model.docvecs.most_similar([new_vector]) 
print(similar) # It returns index of sentence and similarity score
Run Code Online (Sandbox Code Playgroud)

为了测试,我已经通过相同的句子,这些句子存在于训练数据中,但模型没有给出类似文件的相关文件,例如我得到" lootmela钢化玻璃防护装置用于micromax帆布果汁 "作为最类似的句子"nokia pewter black gb gb ram"这句话以0.80作为相似度得分.

So my questions to you: 
1) Do i need to reconsider parameters for model training?
2) Training process is correct?
3) How to build more accurate model for similarity?
4) Apart from doc2vec what will be your suggestion for similarity (keeping in mind i have very large data so training and testing time should not be much longer)
Run Code Online (Sandbox Code Playgroud)

如果问题格式不好,请原谅.

goj*_*omo 11

Doc2Vec 使用较短的文本会有更难的时间 - 而且看起来你的文本可能只有5到10个令牌.

您的文本似乎也不是自然语言句子 - 而是产品名称.无论Doc2Vec/ Word2Vec样分析将做任何这样的文本片段有用具有相同的排序共生多样性自然口头/书面语言将取决于数据的特性.我不确定它会不会,但它只是 - 只会尝试/调整它会告诉我.

但是,目前尚不清楚您期望的结果应该是什么.什么类型的产品名称应该返回最相似的?同一品牌?相同的颜色?(如果其中任何一个,你可以使用比Doc2Vec训练更简单的模型.)相同的规格,包括内存?(如果是这样,你不想丢弃数字信息 - 而是你可能希望将它规范化为单个标记,这些标记在影响的逐字级别有意义Doc2Vec,例如将"64 GB"转换为"64gb"或"2 GB RAM"到"2gbram".)

由于这不是常规的自然语言文本,因此您可能拥有非常小的约束词汇 - 可能是几千个令牌,而不是正常语言中的数十到数十万.并且,每个令牌可能只出现在少数示例中(单个生产者的产品系列),绝对不会出现与类似竞争产品密切相关的术语(因为产品名称不会混合竞争对手的专有名称.)这些因素这也将对这种算法提出挑战 - 需要对词语进行多种不同的重叠使用,以及许多具有细微含义的词语,以逐渐将向量推向有用的安排.小词汇表可能需要使用更小的模型(更低vector_size)以避免过度拟合.如果你有一个数据集暗示了人们认为可以比较哪些产品 - 在相同的评论中提到,或由同一个人搜索,或由同一个人购买 - 你可能想要创建额外的合成文本示例,其中包括那些多个产品.相同的文本 - 这样算法就有机会学习这种关系.

很多Doc2Vec/ Word2Vec工作并不打扰删除停用词,并可能将标点符号保留为独立单词.

您应该显示"training_data.csv"文件中实际内容的示例,以查看算法实际使用的内容.请注意,它TaggedLineDocument无法正确处理真正的逗号分隔值文件 - 它期望每行只有一个文本,已经以空格分隔.(任何逗号都会保留在原位,可能附加到字段标记.)

降低min_count到1通常会使结果恶化,因为这种罕见的标记(只有少数或少数出现)没有得到好的向量,但是如果它们中有很多是聚合的(在正常文本中有可能不在这里) )可以作为训练噪声降低其他向量.

您不需要更改min_alpha,一般情况下,如果您确定它们的含义并且有一个严格的,可重复的评分过程来测试更改是否会改善结果,那么通常只应修改默认值.(在实现良好的相似性度量的情况下,这样的分数可能是一组应该比第三项更相似的项目.对于您尝试的每个算法/参数,有多少这样的对被正确发现为"更相似"比任何一个项目到第三个?"

推理,尤其是短文本的推断,可能会受益于不同的参数(例如更多的推理过程) - 最新的gensim版本(3.5.0,2018年7月)包括一个重要的修正和默认调整infer_vector().因此,请务必使用该版本,并测试为其提供更大epochs价值的改进.

总的来说,我建议:

  • 明确一个好的相似结果应该是什么:用大多数和最不相似的项目的例子

  • 使用这些示例来创建严格的模型质量自动评估

  • 以域敏感的方式预处理,保留有意义的区别; 尝试获取/创建不是孤立品牌词汇的文本到隐藏潜在跨品牌关系的微小单一产品示例中

  • 除非您确定它有所帮助,否则不要更改默认值

  • 在INFO级别启用日志记录,以便您可以查看算法的进度和报告有效词汇等内容

根据您真正的"相似性"目标,您可能仍然无法获得出色的结果 - 产品名称与自然语言的Doc2Vec效果不同.

另一个要考虑的基准是将每个产品名称视为"词袋",从而产生一个单一的矢量,其中包含单词(来自完整词汇表).这些单热矢量的余弦相似性(可能具有额外的术语加权)将是一个简单的衡量标准,至少可以捕捉所有"黑色"物品彼此更接近的东西,或者所有"诺基亚"物品等.

  • 如上所述,将每个项目表示为"词袋",具有大维度"稀疏"单热矢量,是您应该尝试的基线.但它只能检测出有点像同一个词的相似之处.EG:你的两个三星示例共有4个令牌 - "samsung"`4``gb``ram`--共同所以得分为4,而诺基亚只有2个共同的令牌 - `gb``ram ` - 所以它有一个像2的分数.(余弦相似性或相对术语频率/重要性的权重使事情更微妙,但它仍然大致"多少共享词".) (2认同)