4

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

例如,我的查询语句是:

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

我的数据库中可能已经存在一个句子列表,例如: 1. (x) 和 (y) 之和为 (z) 2. (x) 加 (y) 等于 (z) 3. (x) 相乘by (y) 不等于 (z) 4. (z) 是 (x) 和 (y) 之和

该示例应该匹配我的数据库中的句子 1、2、4 但不是 3。句子匹配也应该有一些权重。

它不仅仅是数学句子,它是任何可以根据单词含义与任何其他句子进行比较的句子。我需要一些方法来比较一个句子和许多其他句子,以找到具有密切相关含义的句子。即基于其含义的句子之间的映射。

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

4

4 回答 4

7

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

您需要您的程序知道或了解addplussum指的是同一个概念,而multiplies是不同的概念。您可以通过测量 WordNet/FrameNet 中单词的同义词之间的距离来做到这一点,但如果您不想找到乘数,则距离计算必须非常精细。否则,您可能需要手动建立一些词-概念映射(例如{'add' : 'addition', 'plus' : 'addition', 'sum' : 'addition', 'times' : 'multiplication'})。

如果您想要完整的句子语义,您还必须解析句子并从解析树/依赖图中获取含义。斯坦福解析器是解析的流行选择。

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

于 2011-05-01T11:22:42.973 回答
1

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

于 2011-05-09T21:56:49.550 回答
1

编写一个从句子中创建某种散列或“表达式”的函数,与其他句子的散列相比,这很容易。

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

转换的一些技巧:省略“the”词,将双词词转换为单个词“sum of”=>“sumof”,找到运算符词并将“and”替换为它。

于 2011-05-10T07:08:35.740 回答
1

没那么容易^^您应该首先使用停用词过滤器,以从中取出不包含信息的词。这里有一些不错的

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

简单地说,在 NLP 中处理同义词是相当困难的。如果您只想处理不同的词形,例如 add 和 add,您可以使用词干分析器,但没有词干分析器可以帮助您从 add 到 sum(wsd 是唯一的方法)

然后你的句子中有不同的词序,如果你想要准确的答案(x+y=z 与 x+z=y 不同),也不应该忽略它们。所以你也需要单词依赖,这样你就可以看到哪些单词相互依赖。如果您想使用英语,Stanford Parser实际上是该任务的最佳选择。

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

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

您可以将其用于您的搜索

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

于 2012-06-23T23:32:54.640 回答