2010-01-10 121 views
7

我在做project.i需要任何开源工具或技术来找到语句之间的语义相似度,我将输入作为两个语句并输出为分数(即语义相似度)。任何人都可以知道这些信息我希望我能很快得到答复。谢谢大家。语句之间的语义相似性

+0

一种幼稚方法可以是第一至[从输入提取关键词(https://stackoverflow.com/q/17447045/1225328),然后比较获得的关键字。 – sp00m 2017-06-08 12:54:13

+0

结帐https://markroxor.github.io/gensim/static/notebooks/WMD_tutorial.html – 2017-12-10 09:50:45

回答

19

萨尔玛,恐怕这不是你的问题的正确论坛,因为它与编程没有直接关系。我建议您在corpora list上再次提出您的问题。你也可能想先搜索他们的档案。

除此之外,你的问题还不够精确,我会解释我的意思。我假设你的项目是关于计算语句之间的语义相似度,而不是关于其他语义相似度只是其中的一个。如果是这样的话,那么有几件事情需要考虑:首先,从计算语言学和理论语言学的角度来看,“语义相似性”这个术语究竟意味着什么。它有许多不同的观点和定义,全部取决于要解决的问题的类型,手头的工具和技术以及接近此任务的人的背景等。考虑以下示例:

  1. 皮特和罗布在车站附近找到一只狗。
  2. 皮特和罗布从来没有在车站附近发现一只狗。
  3. 皮特和罗伯都喜欢编程很多。
  4. 帕特里夏在车站附近发现一只狗。
  5. 这是一只在雪地上发现皮特和罗布的狗。

哪个句子2-4与1相似? 2与1完全相反,仍然是关于皮特和罗布(不)找到一条狗。 3是关于皮特和罗布,但在完全不同的情况下。 4是关于在车站附近找到一只狗,虽然发现者是别人。 5是关于皮特,罗布,一只狗,还有一个'发现'事件,但采用与1不同的方式。就我而言,即使不必编写计算机程序,我也无法根据它们的相似性对这些示例进行排序。

为了计算语义相似性,您需要先决定要将什么视为'语义相似',哪些不是。为了计算句子级别上的语义相似度,理想情况下,你会比较句子的某种意义表示。含义表示通常以逻辑公式形式出现,并且非常复杂。但是,有些工具试图做到这一点,例如Boxer

作为一种过于简单但常常实用的方法,您将语义相似性定义为一个句子和另一个句子中词语之间相似度的总和。这使得问题变得更加容易,但仍然有一些难以解决的问题需要解决,因为单词的语义相似性与句子的语义相似性一样严重。如果你想得到这个印象,请看看D.A.的书“词汇语义学”。 Cruse(1986)。然而,有相当多的工具和技术来计算单词之间的语义相似度。他们中的一些人基本上将其定义为类似于Word Net或维基百科分类的两个词的负距离(参见this paper,其描述了用于此的API)。其他人通过使用在大型文本语料库上计算的一些统计度量来计算语义相似度。他们基于类似的词语出现在相似的背景下的见解。计算句子之间的语义相似度的第三种方法涉及从信息检索中可能知道的向量空间模型。要了解后面的这些技术,请看第8章。5在书统计自然语言处理的基础曼宁和Schütze。

希望这能让你暂时摆脱困境。

+0

这非常有趣,谢谢回答! – sp00m 2017-06-08 12:50:17

8

我照着类别开发了一个简单的开源工具,做语义比较: https://sourceforge.net/projects/semantics/files/

它适用于任何长度的句子,简单,稳定,速度快,体积小... 下面是一个示例输出:
句子之间的相似性
-Pete和Rob在车站附近找到了一条狗。
-Pete and Rob从未在车站附近发现过一只狗。
是:句子
-Patricia之间1.0000000000


相似发现车站附近的狗。
- 这是一只狗在雪地下发现了皮特和罗布。
是:句子
-Patricia之间0.405107239


相似发现车站附近的狗。
- 我很好,谢谢!
是:0.0


句子
你好之间有相似性,你怎么样?
- 我很好,谢谢!
是:0.29160592175990213



USAGE:

import semantics.Compare; 
public class USAGE { 

public static void main(String[] args) { 

    String a = "This is a first sentence."; 
    String b = "This is a second one."; 

    Compare c = new Compare(a,b); 
    System.out.println("Similarity between the sentences\n-"+a+"\n-"+b+"\n is: " + c.getResult()); 

    } 

} 
+0

不错的lib :)你是如何生成字典/单词列表的?我需要一个德国人。 – schokocappucino 2013-08-05 10:03:25

+0

使用DISCO实用程序并从字典中为每个单词找到最接近的单词。 DISCO确实支持德语,所以你可以这样做。 – 2014-01-09 16:14:13