从一个例句中的句子列表中找出具有相似相对含义的句子

时间:2011-05-01 05:03:16

标签: nlp natural-language-processing google-natural-language

我希望能够找到具有相同含义的句子。我有一个查询语句,以及数百万个其他句子的长列表。句子是单词,或称为符号的特殊类型的单词,它只是一种象征某些被讨论对象的单词。

例如,我的查询语句是:

示例:将(x)添加到(y)给出(z)

我的数据库中可能存在一系列句子,例如:1。(x)和(y)之和为(z)2.(x)加(y)等于(z)3。( x)乘以(y)不等于(z)4.(z)是(x)和(y)的总和

该示例应与我的数据库1,2,4中的句子匹配,但不匹配3.此外,句子匹配应该有一些权重。

它不仅仅是数学句子,它可以根据单词的含义与任何其他句子进行比较。我需要某种方法来对句子和许多其他句子进行比较,以找到具有封闭相对含义的句子。即根据句子的含义在句子之间进行映射。

谢谢! (标签是语言设计,因为我无法创建任何新标签)

4 个答案:

答案 0 :(得分:7)

首先:您要解决的是非常难题。根据数据集中的内容,它可能是AI-complete

您需要程序知道或了解添加 plus sum 引用相同的概念,而乘法是一个不同的概念。您可以通过测量WordNet / FrameNet中单词“同义词”之间的距离来实现此目的,但如果您不想找到乘法,则必须非常精确地计算距离。否则,您可能需要手动建立一些单词概念映射(例如{'add' : 'addition', 'plus' : 'addition', 'sum' : 'addition', 'times' : 'multiplication'})。

如果你想要完整的句子语义,你还需要解析句子并从解析树/依赖图中导出意义。 Stanford parser是解析的流行选择。

您还可以在问答系统研究中找到此问题的灵感。在那里,一种常见的方法是解析句子,然后将解析树的片段存储在索引中,并通过常见的搜索引擎技术(例如,在Lucene中实现的tf-idf)搜索它们。这也会给你每个句子的分数。

答案 1 :(得分:1)

您需要stem将句子中的单词缩小为常用的同义词,然后比较这些词干并使用句子中的词干匹配率(10个单词中的5个)与某个阈值进行比较这句话是匹配的。例如,所有单词匹配超过80%的句子(或您认为的任何百分比)。至少这是一种方法。

答案 2 :(得分:1)

编写一个函数,从句子中创建一些有点哈希或“表达式”,与其他句子的哈希值相比可以很容易。

Cca:
1.“(x)和(y)之和为(z)” => x + y = z
4.“(z)是(x)和(y)之和” => z = x + y

转换的一些提示:省略“the”字样,将双字字词转换为单个字词“sum of”=> “sumof”,找到操作员单词并用它替换“和”。

答案 3 :(得分:0)

不那么容易^^ 您应首先使用禁用词过滤器,以获取非信息承载词。 Here are some good ones

然后你想要处理同义词。这实际上是一个非常复杂的主题,因为你需要某种词义消歧去做。大多数最先进的方法都比最简单的解决方案好一点。那就是,你采用一个词最常用的含义。您可以使用WordNet。您可以获取单词的同义词集,其中包含所有同义词。然后你可以推广这个词(它被称为超名词)并采用最常用的含义并用它替换搜索词。

只是说,在NLP中处理同义词非常困难。如果你只是想处理不同的单词形式,例如添加和添加,你可以使用一个词干分析器,但是没有词干分析器可以帮助你从添加到总和(wsd是唯一的方法)

然后你的句子中有不同的单词排序,如果你想要精确的答案(x + y = z与x + z = y不同),也不应该忽略。所以你需要单词依赖,所以你可以看到哪些单词相互依赖。如果你想使用英语,那么The Stanford Parser实际上是最好的。

也许你应该从一个句子中获取名词和动词并对它们进行所有预处理,并在搜索索引中询问依赖项。 依赖关系看起来像

x (sum, y)
y (sum, x)
sum (x, y)

您可以用于搜索

因此,您需要标记化,概括,获取依赖关系,过滤不重要的单词以获得结果。如果你想用德语做,你还需要一个单词解析器。