代码之家  ›  专栏  ›  技术社区  ›  user2578525

生产环境中的文档相似性

  •  3
  • user2578525  · 技术社区  · 7 年前

    我们有n个文档。在用户提交新文档时,我们的目标是通知他现有文档可能存在重复(就像stackoverflow建议问题可能已经有答案一样)。

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

    我们当前的实现包括对文档进行培训的gensim doc2vec模型(使用唯一的文档ID标记)。我们推断新文档的向量,并找到与之最相似的文档(ID)。选择doc2vec模型的原因是我们想利用语义来改进结果。据我们所知,它不支持在线培训,因此我们可能不得不安排一个cron或其他定期更新模型的东西。但是,随着文档的激增,调度cron将是不利的。当模型尚未接受新数据培训时,用户可以上载副本。同时,由于数据量巨大,训练时间也会更长。

    所以我想知道大公司是如何处理此类案件的。有没有更好的选择?或者更好的算法来解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   gojomo    7 年前

    您不必为了开始培训新模型而放弃旧模型,因此,尽管存在任何培训滞后或新文档激增的情况,您仍将拥有一个尽可能做到最好的实时模型。

    根据文档空间随时间变化的程度,您可能会发现再培训的好处微乎其微。(一个建立在大量历史记录基础上的好模型可能仍然适合无限期地推断新的向量。)

    请注意,要使用更多 steps (特别是对于短文档),或起点较低 alpha (更像训练默认值0.025)可能会得到更好的结果。

    如果有可用的词向量,还可以计算文档相似性的“词移动距离”(WMD),这可能会更好地识别相近的重复项。但请注意,计算成本可能相当高–您可能只想针对可能的候选对象的子集进行计算,或者必须添加许多并行处理器才能批量进行计算。另一种较新的距离度量称为“软余弦相似性”(可在最近的gensim中获得),其复杂性介于简单向量到向量的余弦相似性和完整WMD之间,可能值得尝试。

    如果词汇量没有扩展,可以加载旧的 Doc2Vec 模型,并继续 train() 它和从一个已经运行的模型开始可能会帮助您以更少的过程获得类似的结果。但请注意:目前它不支持学习任何新单词,最安全的做法是混合使用 全部的 已知示例交错。(如果只培训增量的新示例,模型可能会对未显示的旧文档失去平衡的理解。)

    (如果您主要关注的是复制精确字串的文档,而不仅仅是类似的模糊主题,那么您可能会考虑使用其他技术进行混合,例如将文档分解成一袋字符图形,或者像剽窃检测应用程序中常见的那样使用“木瓦印刷”。)

    推荐文章