生产环境中的文档相似度

Document similarity in production environment

我们有 n 个文件。用户提交新文档后,我们的目标是通知他现有文档可能重复(就像 Whosebug 提示问题可能已经有答案一样)。

在我们的系统中,每分钟都会上传新文档,而且大部分都是关于同一主题的(重复的可能性更大)。

我们当前的实施包括在文档上训练的 gensim doc2vec 模型(标记有唯一的文档 ID)。我们推断新文档的向量并用它找到 most_similar 文档(ids)。选择 doc2vec 模型的原因是我们想利用语义来改善结果。据我们所知,它不支持在线训练,所以我们可能不得不安排一个 cron 或定期更新模型的东西。但是调度 cron 将是不利的,因为文档会突然出现。用户可以在模型尚未针对新数据进行训练时上传重复项。同样给定海量数据,训练时间会更长。

所以我想知道大公司是怎么处理这种情况的。有没有更好的选择?或者更好的算法来解决这个问题?

您无需拆除旧模型即可开始训练新模型,因此尽管存在任何训练滞后或新文档爆发,您始终拥有一个正在尽力而为的实时模型。

根据文档 space 随时间变化的程度,您可能会发现再训练的好处可以忽略不计。 (一个好的模型,建立在大量历史记录的基础上,可能仍然可以无限期地推断新向量。)

请注意,调整推理以使用更多 steps(尤其是对于短文档)或较低的起始值 alpha(更像是训练默认值 0.025)可能会得到更好的结果。

如果可以使用词向量,还有文档相似度的 "Word Mover's Distance" (WMD) 计算,这可能会更好地识别相似的重复项。但是请注意,计算起来可能会非常昂贵——您可能只想针对可能的候选人的一个子集进行计算,或者必须添加许多并行处理器才能批量进行计算。还有另一个更新的距离度量,称为 'soft cosine similarity'(在最近的 gensim 中可用),它的复杂性介于简单的向量到向量余弦相似性和完整的 WMD 之间,可能值得尝试。

如果词汇量没有扩大,您可以加载一个旧的 Doc2Vec 模型,然后继续 train() 它——从一个已经可用的模型开始可能会帮助您获得类似的结果传球次数更少。但请注意:它目前不支持学习任何新单词,最安全的做法是将 所有 个已知示例交错混合进行重新训练。 (如果您只训练增量新示例,模型可能会失去对未重新呈现的旧文档的平衡理解。)

(如果您主要关心的是重复精确的单词运行的文档,而不仅仅是相似的模糊主题,您可能会考虑混合使用其他技术,例如将文档分解为字符袋-ngrams,或 'shingleprinting',在剽窃检测应用程序中很常见。)