我们有n个文件。在用户提交新文档后,我们的目标是告知他现有文档的可能重复(就像stackoverflow建议问题可能已经有答案一样)。
在我们的系统中,新文档每分钟上传一次,主要是关于同一主题(复制的可能性更大)。
我们当前的实施包括在文档上训练的gensim doc2vec模型(标记有唯一文档ID)。我们推断新文档的向量,并用它找到most_similar docs(ids)。选择doc2vec模型背后的原因是我们希望利用语义来改善结果。据我们所知,它不支持在线培训,因此我们可能需要安排一个定期更新模型的cron或其他东西。但是,随着文件的爆发,调度cron将是不利的。当模型尚未针对新数据进行培训时,用户可以上传重复项。同时,如果获得大量数据,培训时间也会更长。
所以我想知道大公司如何处理此类案件。有没有更好的选择?或更好的算法解决这个问题?
答案 0 :(得分:0)
您不必将旧模型降低以开始训练新模型,因此,尽管存在任何训练滞后或新文档突发,您仍然可以尽可能地使用最佳模型。
根据文档空间随时间变化的程度,您可能会发现重新培训可以获得微不足道的好处。 (建立在大型历史记录上的一个好模型可能无限期地推断出新的向量。)
请注意,调整推理以使用更多steps
(特别是对于短文档)或较低的起始alpha
(更像是训练默认值0.025)可能会产生更好的结果。
如果可以使用单词向量,还有“文字移动距离”(WMD)计算文档相似度,这可能会更好地识别密切重复项。但请注意,计算起来可能非常昂贵 - 您可能只想针对可能的候选子集进行此操作,或者必须添加许多并行处理器才能进行批量处理。另一个更新的距离度量称为“软余弦相似度”(在最近的gensim中可用),介于简单的矢量与矢量余弦相似性和完整的WMD之间,可能值得尝试。
如果词汇表尚未扩展,您可以加载旧的Doc2Vec
模型,并继续train()
它 - 从已经正常工作的模型开始可以帮助您以更少的数量获得类似的结果经过。但请注意:它目前不支持学习任何新单词,最安全的做法是使用交错的所有已知示例的混合重新训练。 (如果您只训练增量新示例,则模型可能会失去对未重新呈现的旧文档的平衡理解。)
(如果你主要担心的是复制精确词语的文档,而不仅仅是类似的模糊主题,你可能会考虑混合使用其他技术,例如将文档分解为字符包ngram ,或剽窃检测应用中常见的“shingleprinting”。)