在不同的文档中找到相似的段落

本文关键字:相似 段落 文档 | 更新日期: 2023-09-27 18:11:03

我想弄清楚有什么类型的分析和当前可用的库,当输入两个文本段落时,确定两者之间是否存在某种程度的相似性(无论是关于主题和动词,还是上下文)。我想可能会有一些NLP类型的分析可以做,但看看人们在这些解决方案中的经验。

例如,考虑以下两段:

  1. 适用法律。本协议受密苏里州法律管辖,但不涉及其法律冲突原则。

  2. 法律适用。密苏里州法律适用于本协议。

基本上,我希望这两个子句被选为相同的。

我正在寻找一个库下可用。net。

在不同的文档中找到相似的段落

这是一个有趣的问题。您可以使用NLTK提取核心概念(名词组)并直接比较它们。在这种情况下,您将得到:

  1. 适用法律,协议,法律,州,密苏里州,冲突,法律原则
  2. 法律,法律,州,密苏里,协议

现在,相似性不是双向的。第2组在第1组中有充分的代表,而不是相反。你可以应用调和平均值计算一组在另一组中的百分比G21是1.0 G12是0.57。所以调和平均数将H = 2 ab/(A + B) = = 2(1.0) *(0.57)/(1.0 + 0.57) = 0.72。

现在,这是不相同的,但在你的例子中,你希望有两个段落之间的匹配。在这种情况下,它们的调和平均值H是0.72。这个数字越高,实现起来就越困难。H>0.8被认为是好的。H>0.9对于大多数系统来说是例外。所以你必须决定的是,你想要在哪里随意画一条线?它必须是任意的,因为你没有给出相似度的定义。你是把它设为0.6还是0.7?0.12948737怎么样?发现这个阈值的一个好方法是拿一些测试例子,不做数学计算,只是自己判断它们的相似性,然后运行数字,看看你能得出什么。

我不知道是否有。net实现,但您可以轻松地自己编写。

你可以使用反向n-gram索引(a),在你的搜索段落(B)中查找n-grams,计算共同n-grams除以总n-grams (C),这给了你一个概率度量,你可以设置一个阈值,可能还可以做其他事情。

(A)创建一个反向n-gram索引:从你想要搜索的段落中获取所有n-gram,并将它们存储在一个数据库中。

的例子:

由以下(短)段落组成的小语料库:{rain, spain, main, plain}

有以下3克:{#ra, rai, ain,#, #sp, spa, pai, #ma, mai, #pl, pla, lai}

得到以下结果键值对:{(#ra, rain), (rai, rain), (ain, rain), (ain, spain),(主要是),(就一般),(#,雨中)(#、西班牙),(主要在#,),(#平原),(# sp、西班牙),(spa、西班牙),(pai、西班牙),(#妈妈,主要),(主要)梅(# pl,平原),(解放军,平原),(赖平原)}

(B)查找与语料库匹配的段落时,计算其所有n-gram,在反向索引中查找每个n-gram。

的例子:

查找"pain"在我们刚刚创建的db中。我们得到了下面的n-grams:{#pa, pai, ain, in#}

以下是匹配的条目:

# pa→没有匹配

pai→{西班牙}

ain→{rain, spain, main, plain}

#→{rain, spain, main, plain}

(C)计算你找到的每一个条目的得分,方法是除以它的公共n-gram的数量和所有n-gram在搜索段落和结果段落中的并集。

例子

pain vs. spain:常见n-gram: {pai, ain, in#}, n-gram {#pa, #sp, pai, ain, in#}的并集,得分:3/5 (0.6)

痛与雨:共同n-g: {ain, in#}, n-g的并集{#pa, #ra, ain, in#},得分:2/4 (0.5)

pain vs. main:常见n-gram: {ain, in#}, n-gram的并集{#pa, #ma, ain, in#},得分:2/4 (0.5)

疼痛与平淡:普通n-g: {ain, in#}, n-g的并集{#pa, #pl, lai, ain, in#},得分:2/5 (0.4)

实现细节:

  • 使n-g中的n在搜索和存储中都可配置,这使您可以灵活地试验3-g, 4-g, 5-g,…
  • 使用快速(内存中/进程中)数据库,如SQLite或BerkeleyDb
  • 确保允许重复的键(BerkeleyDb允许这一点-但你需要找到一个解决方法来重复的键值对,例如"维护";是3克的两倍,所以从技术上讲,你不能把它存储在db

快乐编码

我建议您使用与Google在网络上查找重复文档相同的算法http://www.cs.sunysb.edu/cse692/论文/henzinger_sigir06.pdf

使用Rubin的算法对短语进行散列,对这些散列进行排序并比较底部的10个。非常快。

Patrick。