【问题标题】:semantic similarity between sentences句子之间的语义相似度
【发布时间】:2011-01-03 12:22:31
【问题描述】:

我正在做一个项目。我需要任何开源工具或技术来查找两个句子的语义相似性,我将两个句子作为输入,并接收分数(即语义相似性)作为输出。有什么帮助吗?

【问题讨论】:

标签: java nlp


【解决方案1】:

Salma,我担心这不是您的问题的正确论坛,因为它与编程没有直接关系。我建议您在corpora list 上再次提问。您可能还想先搜索他们的档案。

除此之外,您的问题还不够精确,我将解释我的意思。我假设您的项目是关于计算句子之间的语义相似性,而不是关于语义相似性只是众多事物中的一件事的其他事物。如果是这种情况,那么有几件事情需要考虑:首先,无论从计算语言学的角度还是从理论语言学的角度来看,“语义相似性”一词的确切含义都不清楚。它有许多不同的观点和定义,所有这些都取决于要解决的问题的类型、手头的工具和技术以及完成这项任务的背景等。请考虑以下示例:

  1. Pete 和 Rob 在车站附近发现了一条狗。
  2. Pete 和 Rob 从未在车站附近找到过狗。
  3. Pete 和 Rob 都非常喜欢编程。
  4. Patricia 在车站附近发现了一条狗。
  5. 是一只狗在雪地下发现了皮特和罗伯。

第 2-4 句中有哪些与第 1 句相似? 2与1完全相反,仍然是关于Pete和Rob(不是)寻找狗。 3 是关于皮特和罗布的,但在完全不同的背景下。 4是关于在车站附近找一只狗,虽然找的人是别人。 5 是关于 Pete、Rob、一只狗和一个“发现”事件,但方式与 1 不同。至于我,即使不必编写计算机程序,我也无法根据它们的相似性对这些示例进行排名.

为了计算语义相似度,您首先需要确定您希望将哪些内容视为“语义相似”,哪些不视为。为了计算句子级别的语义相似度,理想情况下,您会比较句子的某种意义表示。含义表示通常以逻辑公式的形式出现,并且生成起来非常复杂。但是,有一些工具试图做到这一点,例如Boxer

作为一种简单但通常实用的方法,您可以将语义相似度定义为一个句子中的单词与另一个句子中的单词相似度的总和。这使问题变得容易得多,尽管仍然有一些困难的问题需要解决,因为单词的语义相似性与句子的语义相似性一样被定义得很糟糕。如果您想对此有所了解,请查看 D.A. 的《词汇语义》一书。克鲁斯 (1986)。然而,有相当多的工具和技术可以计算单词之间的语义相似度。他们中的一些人基本上将其定义为像Word Net 或维基百科分类法(参见this paper,它为此描述了一个API)中的两个词的负距离。其他人通过使用在大型文本语料库上计算的一些统计度量来计算语义相似度。它们基于相似词出现在相似上下文中的洞察力。第三种计算句子词之间语义相似度的方法涉及向量空间模型,你可能从信息检索中知道。要了解后一种技术的概述,请查看 Manning 和 Schütze 所著的统计自然语言处理基础一书的第 8.5 章。

希望这能让你暂时站起来。

【讨论】:

    【解决方案2】:

    我开发了一个简单的开源工具,可以根据 categories 进行语义比较: https://sourceforge.net/projects/semantics/files/

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


    句子之间的相似性
    -Patricia 在车站附近发现了一只狗。
    - 是一只狗在雪地里发现了皮特和罗伯。
    是:0.7363210405107239


    句子之间的相似性
    -Patricia 在车站附近发现了一只狗。
    -我很好,谢谢!
    是:0.0


    句子之间的相似性
    -你好,你好吗?
    -我很好,谢谢!
    是:0.29160592175990213



    用法:

    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());
    
        }
    
    }
    

    【讨论】:

    • Nice lib :) 你是如何生成字典/单词列表的?我需要一个德国人。
    • 使用 DISCO 实用程序并从字典中为每个单词查找最接近的单词。 DISCO 确实支持德语,所以你也可以这样做。
    【解决方案3】:

    您可以尝试使用基于 WordNet KB 的 UMBC Semantic Similarity Service。 有UMBC STS(语义文本相似性)服务。这是链接http://swoogle.umbc.edu/StsService/sts.html

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-13
      • 2016-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      相关资源
      最近更新 更多