检测两个文件中的类似段落

时间:2015-05-17 10:07:19

标签: machine-learning nlp

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

Doc1.Para

这是一行文字

Doc2.Para

这是一个林文

你可以在这里看到一些单词缺失(' of'),有些单词拼写不同。因此,该段不完全相同但相似。并且相似性不是基于语义或本质。它只是基于单词。

段落的顺序不一样。例如

文件1

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

Doc 2

第3段第4段第1.1段第2段第1.2段

在这里你可以看到顺序不一样。 para也可以 splited 像Doc1.Para1被分成2段Doc2.Para1.1 + Doc2.Para1.2。

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

6 个答案:

答案 0 :(得分:0)

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

为了模拟段落之间的相似性,一个简单的解决方案是通过对该段落中所有单词的嵌入进行加权求和来计算段落嵌入。因为某些单词比其他单词更具信息性,所以您可以通过单词的tf-idf对单词嵌入进行加权。然后,您可以计算两个段落之间的相似度作为其嵌入之间的余弦值。

答案 1 :(得分:0)

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

例如,所有90%以上相似度的文本都应视为相同。

答案 2 :(得分:0)

在NLP社区中有很多关于文本相似性/蕴涵的共享任务(STS 2015,2014,2013,RTE 2010,...)等。这是最新的竞赛:

http://alt.qcri.org/semeval2015/task2/index.php?id=semantic-textual-similarity-for-english

他们中的一些人会释放提交的系统或使用的基准,我认为您也可以将其用于任务。看看这个:

http://ixa2.si.ehu.es/stswiki/index.php/Main_Page

答案 3 :(得分:0)

  1. 你也可以使用富含ML和的Apache Spark 2.0 有很多基于文档相似性的健壮算法。

  2. 示例程序/示例程序可以从中下载 这site

答案 4 :(得分:0)

您写信给您并担心时间复杂性 - 避免对所有段落的产品进行缓慢比较的一种常用方法是 shingling

简而言之,

  1. 创建一组所有段落的草图/指纹(通过一组哈希函数运行每个段落),
  2. 从草图到具有该草图的段落制作地图。
  3. 将其反转为从段落对到共同草图数量的地图,
  4. 在某个阈值处过滤,
  5. 通过使用union-find
  6. 进行群集,从成对转到群组

    请参阅 http://nlp.stanford.edu/IR-book/html/htmledition/near-duplicates-and-shingling-1.html细节。我有一个simple OCaml implementation可能会有所帮助,但如果您搜索文档带状疱疹,可能还有许多其他语言的库。

答案 5 :(得分:0)

您的问题与自然语言处理中的窃检测有关。 一种选择是使用指纹算法。由于段落的顺序并不重要,因此建议以下论文:

Winnowing: Local Algorithms for Document Fingerprinting