Machine learning 检测两个文档中的相似段落

Machine learning 检测两个文档中的相似段落,machine-learning,nlp,Machine Learning,Nlp,我试图在两份文件中找到类似的段落。每个文档都有多个段落,多行文本。段落中的文本有一些变化。这些单词可以插入、删除或拼写错误。比如说 文件1.第 这是一行文字 文件2.第 这是一篇林文 您可以在这里看到,有些单词缺少('of'),有些单词拼写不同。因此,这两个段落并非完全相同,而是相似的。相似性不是基于语义或本质的。这只是基于文字 这些段落的顺序不一样。比如说 文件1第1段第2段第3段第4段 文件2第3段第4段第1.1段第2段第1.2段 在这里你可以看到顺序是不一样的。此外,段落也可以像Doc1.

我试图在两份文件中找到类似的段落。每个文档都有多个段落,多行文本。段落中的文本有一些变化。这些单词可以插入、删除或拼写错误。比如说

文件1.第

这是一行文字

文件2.第

这是一篇林文

您可以在这里看到,有些单词缺少('of'),有些单词拼写不同。因此,这两个段落并非完全相同,而是相似的。相似性不是基于语义或本质的。这只是基于文字

这些段落的顺序不一样。比如说

文件1

第1段
第2段
第3段
第4段

文件2第3段第4段第1.1段第2段第1.2段

在这里你可以看到顺序是不一样的。此外,段落也可以像Doc1.Para1一样拆分为2个段落Doc2.Para1.1+Doc2.Para1.2


我必须检测Doc1中的哪个段落与Doc2中的哪个段落相似。正在寻找一些开源工具或算法。

我以前成功地使用单词嵌入来捕获段落相似性。单词嵌入,比如谷歌的,在高维向量空间中模拟单词。因此,它们使得计算两个单词之间的语义相似性成为可能,例如,作为它们各自向量之间的余弦。您可以直接从word2vec站点或相关项目站点(如)下载这些嵌入


为了模拟段落之间的相似性,一个简单的解决方案是通过对该段落中所有单词的嵌入进行加权和来计算段落嵌入。因为有些单词比其他单词信息量更大,所以您可以根据单词的大小来衡量单词嵌入的权重。然后,您可以将两个段落之间的相似性计算为其嵌入之间的余弦

仅通过比较文本和单词的相似性来比较两个段落的一个好方法是使用一种称为的算法。它比较两个文本之间的距离,您可以使用更适合您需要的阈值


例如,所有相似度超过90%的文本应视为相同。

NLP社区中有许多关于文本相似度/蕴涵(STS 2015、2014、2013、RTE 2010等)的共享任务。这是最新的竞争:

其中一些发布了提交的系统或基线,我认为您也可以将其用于您的任务。看看这个:

  • 您还可以使用具有丰富ML和 有许多基于文档相似性的鲁棒算法

  • 示例程序/示例程序可从 这个


  • 你在写作时担心时间的复杂性——一种避免对所有段落的乘积进行缓慢比较的常用方法是

    总之,你

  • 创建一组所有段落的草图/指纹(通过一组哈希函数运行每个段落)
  • 从草图到包含该草图的段落绘制地图
  • 将其倒转成一张从段落对到共同草图数量的地图
  • 以特定阈值进行过滤,以及
  • 通过使用

  • 细节。我有一个可能有用的方法,但是如果你搜索文档,可能会有很多其他语言的库。

    你的问题与自然语言处理中的剽窃检测有关。 可以选择使用指纹算法。由于段落顺序并不重要,我建议提交以下文件:


    我不是在寻找两个词之间的语义相似性……我只是想得到确切的相似性……你提到的工具也适用于这类问题吗?……无论如何,我会阅读abt itAha。那么,在这种情况下,你可能应该按照felipeclopes在另一个答案中建议的Levenshtein距离去做。谢谢。我在考虑……但我担心时间的复杂性。假设我在每个文档中分别有m&n段落。我必须为每个组合应用Levenshtein距离算法,即m X n次(实际上甚至更多,因为段落可以拆分,所以我必须尝试将1个或多个段落与1个或多个段落组合)。单个Levenshtein距离步长本身的复杂性等于2个字符串长度的乘积。假设100个单词中有100个段落,也有可能使用与文本搭配良好的段落。更重要的是将它们聚集到相似的“bucket”中,它应该在性能方面做得很好,也许你可以在段落仅与bucket匹配时进行比较;)有意思…我离开了那个项目,但很高兴知道我面临同样的问题。你能给我建议解决方案吗?