在不同文件中查找类似段落

时间:2011-10-11 18:48:07

标签: c# nlp

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

例如,请考虑以下两段:

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

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

  3. 从根本上说,我希望这两个条款选择相同。

    我正在寻找.Net下的图书馆。

3 个答案:

答案 0 :(得分:4)

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

  1. 管辖法律,协议,法律,国家,密苏里州,冲突,法律原则
  2. 法律,法律,州,密苏里州,协议
  3. 现在,相似性不是双向的。第2组完全代表第1组,但不是相反。您可以应用调和平均值来计算另一组中组的百分比,因此G21将为1.0,G12将为0.57。所以调和平均值为H = 2AB /(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怎么样?发现这个阈值的一个好方法是拿测试例子而不做数学计算只是自己判断它们的相似性,然后运行数字并看看你想出了什么。

答案 1 :(得分:0)

我不知道是否有.NET实现,但您可以自己轻松编写代码。

你可以使用反向n-gram指数(A),在搜索段落(B)中查找n-gram,计算常用n-gram除以总n-gram(C),它给出概率测量,您可以设置一个阈值,也可以做其他事情。

(A)创建反转的n-gram索引:从要搜索的段落中获取所有n-gram并将其存储在db中。

  

示例:

     

由以下(短)段组成的小型语料库:   {雨,西班牙,主要,平原}

     

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

     

你得到以下内容   键值对:{(#ra,rain),(rai,rain),(ain,rain),(ain,西班牙),   (ain,main),(ain,plain),(在#,rain),(在#,西班牙),(在#,main),   (在#,普通),(#sp,西班牙),(spa,西班牙),(pai,西班牙),(#ma,main),   (mai,main),(#pl,plain),(pla,plain),(lai,plain)}

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

  

示例:

     

在我们刚刚创建的数据库中查找“痛苦”。我们得到以下n-gram:   {#pa,pai,ain,in#}

     

以下是匹配条目:

     

#pa - >没有比赛

     

pai - > {西班牙}

     

ain - > {雨,西班牙,主要,平原}

     

in# - > {雨,西班牙,主要,平原}

(C)通过除以搜索段落和结果段落中常用n-gram的数量和所有n-gram的并集来计算每个条目的得分。

  

实施例

     

痛苦与西班牙:普通的n-gram:{pai,ain,in#},n-gram联合{#pa,#sp,pai,ain,in#},得分:3/5(0.6)

     

痛苦与降雨:常见的n-gram:{ain,in#},n-gram联合{#pa,#ra,ain,in#},得分:2/4(0.5)

     

痛苦与主要:常见的n-gram:{ain,in#},n-gram联合{#pa,#ma,ain,in#},得分:2/4(0.5)

     

痛苦与普通:常见的n-gram:{ain,in#},n-gram {#pa,#pl,lai,ain,in#}的结合,得分:2/5(0.4)

实施细节:

  • 在搜索和存储中配置n-n n的n,这使您可以灵活地试验3克,4克,5克,......
  • 使用快速(内存中/进程中)数据库,例如SQLite或BerkeleyDb
  • 确保允许重复的密钥(BerkeleyDb允许这样做 - 但是您需要找到重复键值对的解决方法,例如“维护”具有两倍于3克的ain和#,所以从技术上讲,您无法存储在数据库中)

快乐编码

答案 2 :(得分:0)

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

使用Rubin算法对短语进行哈希处理,对这些哈希值进行排序并比较底部10.非常快。

帕特里克。