<分区>
我试图弄清楚那里有什么类型的分析和当前可用的库,当输入两个文本段落时,确定两者之间是否存在某种程度的相似性(无论是关于主语和动词,或上下文)。我想可能会有一些 NLP 类型的分析可以完成,但要看看人们在这些解决方案中有什么经验。
例如,考虑以下两段:
适用法律。本协议(protocol)受密苏里州法律管辖,不考虑其法律冲突原则。
适用法律。密苏里州法律适用于本协议(protocol)。
从根本上说,我希望将这两个子句选为相同的。
我正在寻找 .Net 下可用的库。
<分区>
我试图弄清楚那里有什么类型的分析和当前可用的库,当输入两个文本段落时,确定两者之间是否存在某种程度的相似性(无论是关于主语和动词,或上下文)。我想可能会有一些 NLP 类型的分析可以完成,但要看看人们在这些解决方案中有什么经验。
例如,考虑以下两段:
适用法律。本协议(protocol)受密苏里州法律管辖,不考虑其法律冲突原则。
适用法律。密苏里州法律适用于本协议(protocol)。
从根本上说,我希望将这两个子句选为相同的。
我正在寻找 .Net 下可用的库。
最佳答案
嗯,这是一个有趣的问题。您可以使用 NLTK 提取核心概念(名词组)并直接比较它们。在这种情况下,你会得到:
现在,相似性不是双向的。第 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 是异常(exception)。所以你必须决定的是你想在沙子中的什么地方画出你的任意线?它必须是任意的,因为您没有给出相似度的定义。那你设置成0.6,0.7? 0.12948737 怎么样?发现此阈值的一个好方法是采用测试示例,无需进行数学运算,只需自行判断它们的相似性,然后运行数字并查看您得出的结果。
关于c# - 在不同文档中查找相似段落,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730934/