【问题标题】:finding semantic similarity between 2 statements查找 2 个语句之间的语义相似性
【发布时间】:2020-09-19 16:46:42
【问题描述】:

我目前正在使用 python 中的小型应用程序,并且我的应用程序具有搜索功能(目前使用 difflib)但我想创建 语义搜索 根据用户输入的文本,它可以从我的数据库中给出前 5 或 10 个结果。它与谷歌搜索引擎的工作方式相同。我找到了一些解决方案Here

但问题是,以下来自一个解决方案的两个语句在语义上是不正确的。我不在乎这个。因为他们让事情变得太难了,这是我不想要的,而且解决方案将是一些预训练的神经网络模型或库,我可以从中轻松实现。

  • Pete 和 Rob 在车站附近发现了一条狗。
  • Pete 和 Rob 从未在车站附近找到过狗

我还发现了一些解决方案,这些解决方案显示使用 gensimGlove 嵌入并发现单词之间的相似性而不是句子之间的相似性。

我想要什么?

假设我的数据库有声明 display classes 和用户输入 showshoweddisplayeddisplayed classshow types 等是相同的。如果以上 2 个陈述相同,那么我也不在乎。 displayeddisplayed class 已经显示在 difflib 中。

注意事项

  • 从固定的语句集中查找,但用户输入的语句可能不同
  • 必须适用于语句

【问题讨论】:

    标签: python-3.x nlp


    【解决方案1】:

    我认为不是gensim 嵌入。它是word2vec 嵌入。不管是什么。

    你需要 tensorflow_hub

    通用句子编码器将文本编码为high-dimensional vectors,可用于text classificationsemantic similarityclustering和其他自然语言任务。

    我相信您需要的是 Text ClassificationSemantic Similarity,因为您想找到用户给出的最接近的前 5 或 10 个语句。

    它易于使用。但模型的大小约为 1GB。它适用于单词、句子、短语或短段落。输入是可变长度的英文文本,输出是一个 512 维向量。你可以找到更多关于它的信息Here

    代码

    import tensorflow_hub as hub
    import numpy as np
    
    # Load model. It will download first time.
    module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/5" 
    model = hub.load(module_url)
    
    # first data[0] is your actual value
    data = ["display classes", "show", "showed" ,"displayed class", "show types"]
    
    # find high-dimensional vectors.
    vecs = model(data)
    
    # find distance between statements using inner product
    dists = np.inner(vecs[0], vecs)
    
    # print dists
    print(dists)
    

    输出

    array([0.9999999 , 0.5633253 , 0.46475542, 0.85303843, 0.61701006],dtype=float32)
    

    结论

    第一个值0.999999display classesdisplay classes 本身之间的距离。第二个0.5633253display classesshow 之间的距离,最后一个0.61701006display classesshow types 之间的距离。

    使用它,您可以找到给定输入和 db 中的语句之间的距离。然后根据距离对它们进行排名。

    【讨论】:

      【解决方案2】:

      您可以使用wordnet 查找同义词,然后使用这些同义词查找相似的语句。

      import nltk
      from nltk.corpus import wordnet as wn
      
      nltk.download('wordnet')
      
      def get_syn_list(gword):
        syn_list = []
        try:
          syn_list.extend(wn.synsets(gword,pos=wn.NOUN))
          syn_list.extend(wn.synsets(gword,pos=wn.VERB))
          syn_list.extend(wn.synsets(gword,pos=wn.ADJ))
          syn_list.extend(wn.synsets(gword,pos=wn.ADV))
        except :
          print("Something Wrong Happened")
        syn_words = []
        for i in syn_list:
          syn_words.append(i.lemmas()[0].name())
        return syn_words
      

      现在使用split 并将您的语句拆分到数据库中。像这样

      stat = ["display classes"]
      
      syn_dict = {}
      for i in stat:
         tmp = []
         for x in i.split(" "):
             tmp.extend(get_syn_list(x))
         syn_dict[i] = set(tmp)
      

      现在您有了同义词,只需将它们与输入的文本进行比较即可。并且在比较单词之前使用 lemmatizer,以便 displayed 变为 display

      【讨论】:

      • 但是如何将这些输入的文本与这本词典进行比较。
      【解决方案3】:

      你可以使用spacy

      这个答案来自https://medium.com/better-programming/the-beginners-guide-to-similarity-matching-using-spacy-782fc2922f7c

      import spacy
      
      nlp =  spacy.load("en_core_web_lg")
      
      doc1 = nlp("display classes")
      doc2 = nlp("show types")
      print(doc1.similarity(doc2))
      

      输出

      0.6277548513279427
      

      编辑

      运行以下命令,将下载模型。

      !python -m spacy download en_core_web_lg
      

      【讨论】:

      • 嘿,当我安装 spacy 并运行上面的代码时,我得到了错误 Can't find model 'en_core_web_lg'. It doesn't seem to be a shortcut link, a Python package or a valid path to a data directory.
      • 虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。这样,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能获得支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。
      • 请记住,虽然欢迎链接,但 SO 上的所有帖子都必须是独立的,以防页面内容发生更改或链接不可用。当用户要求跳上网络以拼凑“答案”时,用户体验也会受到影响。只需将链接中的任何相关解释包含到您的帖子中即可。通过这种方式,用户体验很棒,并且链接为后续、确认或更深入的潜水提供了一个受欢迎的附录。
      • @FocusNow 我更新了解决方案。您的问题已解决。
      猜你喜欢
      • 1970-01-01
      • 2011-01-03
      • 2016-12-14
      • 2015-06-13
      • 2014-11-19
      • 2013-04-18
      • 2015-10-27
      • 2018-02-02
      • 2018-04-12
      相关资源
      最近更新 更多