在不同的文档中找到相似的段落
本文关键字:相似 段落 文档 | 更新日期: 2023-09-27 18:11:03
我想弄清楚有什么类型的分析和当前可用的库,当输入两个文本段落时,确定两者之间是否存在某种程度的相似性(无论是关于主题和动词,还是上下文)。我想可能会有一些NLP类型的分析可以做,但看看人们在这些解决方案中的经验。
例如,考虑以下两段:
-
适用法律。本协议受密苏里州法律管辖,但不涉及其法律冲突原则。
-
法律适用。密苏里州法律适用于本协议。
基本上,我希望这两个子句被选为相同的。
我正在寻找一个库下可用。net。
这是一个有趣的问题。您可以使用NLTK提取核心概念(名词组)并直接比较它们。在这种情况下,您将得到:
- 适用法律,协议,法律,州,密苏里州,冲突,法律原则
- 法律,法律,州,密苏里,协议
现在,相似性不是双向的。第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。