如何为给定域构建语义搜索


19

我们正在尝试解决一个问题,即我们想对数据集进行语义搜索,即我们拥有特定领域的数据(例如:谈论汽车的句子)

我们的数据只是一堆句子,我们想要的是给出一个短语并取回以下句子:

  1. 类似于该短语
  2. 句子的一部分与短语相似
  3. 具有上下文相似含义的句子


让我尝试举一个例子,假设我搜索短语“ Buying Experience”,我应该得到如下句子:

  • 我从没想过汽车购买可以花费不到30分钟的时间进行签名和购买。
  • 我找到了我喜欢的汽车,购买过程
    简单明了

  • 我绝对讨厌去购物,但今天我很高兴


我想强调的事实是,我们正在寻找上下文相似性,而不仅仅是蛮力的单词搜索。

如果句子使用不同的单词,那么它也应该能够找到它。

我们已经尝试过的事情:

  1. 开放式语义搜索我们面临的问题是从我们拥有的数据中生成本体,或者为此而从我们感兴趣的不同领域中搜索可用的本体。

  2. 弹性搜索(BM25 + Vectors(tf-idf)),我们尝试了一下,它给出了一些句子,但精度却不高。准确性也很差。我们尝试使用人类策划的数据集,该数据集只能获得大约10%的句子。

  3. 我们尝试了不同的嵌入,例如曾经在句子变形器中提到的嵌入,并且还通过了示例,并尝试根据我们人类策划的集合进行评估,而且准确性也很低。

  4. 我们尝试了ELMO。这比我们预期的要好,但准确性仍然较低,并且存在决定余弦值的认知负担,低于该值我们不应考虑这些句子。这甚至适用于第3点。

任何帮助将不胜感激。非常感谢您的提前帮助


写得很好的问题-您可以再添加5个搜索字词示例吗?他们总是一到三个单词的短语,还是搜索词可以更长?您处在正确的轨道上
Adnan S

嗨,Adnan,搜索词将始终是一到三个词的短语。例如:购买体验,驾驶舒适性,信息娱乐系统,内饰,里程,性能,座椅舒适性,员工行为。
杰克森

本文对您的情况可能很有趣:elastic.co/blog/…(提示:杠杆作用word2vec)
Val

@Val这实际上很有趣,我要提到您提到的同一篇文章,然后再看您的评论。我认为这种方法将使您更接近所需的内容。
尼玛

您可能需要研究余弦相似度。如下所述,它涉及将字符串转换为可以在2D空间中表示的向量。计算这两个向量的余弦角。该角度表示两个字符串之间的“相似性”。这是一篇不错的文章 medium.com/swlh/playing-with-word-vectors-308ab2faa519
sagar1025

Answers:


5

我强烈建议您观看Trey Grainger关于如何构建语义搜索系统的演讲=> https://www.youtube.com/watch?v=4fMZnunTRF8。他谈论了语义搜索系统的解剖结构,以及用于组合在一起以提供最终解决方案的每个部分。

上下文相似性的一个很好的例子是Bing的搜索引擎: 在此处输入图片说明

原始查询中有{罐装汽水}一词,bing的搜索结果可以引用{罐装汽水},{汽水},{未开封的室温汽水}或{碳酸饮料}。bing是如何做到的?:

好吧,具有相似含义的单词会获得相似的向量,然后可以将这些向量投影到二维图上以轻松查看。通过确保具有相似含义的词在物理上彼此靠近来训练这些向量。您可以通过训练GloVe模型来训练自己的基于矢量的模型在此处输入图片说明

向量之间的距离越近越好。现在,您可以根据其向量的距离搜索最近的邻居查询。例如,对于查询{如何阻止动物破坏我的花园},最近的邻居给出以下结果:

在此处输入图片说明

您可以在此处了解更多信息。对于您的情况,您可以找到一个句子的向量与原始搜索查询之间的最大距离的阈值,以将其视为上下文相似的句子。

通过使用诸如LSI(潜在语义索引)之类的方法来减少词汇量,也可以实现上下文相似性。为此,我强烈建议您检查python的genism库:https : //radimrehurek.com/gensim/about.html


1

您可能有兴趣研究Weaviate以帮助您解决此问题。它是一个基于数据对象矢量化的智能图。

如果您使用特定领域的语言(例如缩写),则可以使用自定义概念扩展Weaviate 。

您也许可以使用语义搜索功能(即Explore{})或自动分类功能解决您的问题。

探索功能

因为所有数据对象都被矢量化了,所以您可以像下面这样进行语义搜索(此示例来自docs,您可以在这里使用GraphQL进行尝试):

{
  Get{
    Things{
      Publication(
        explore: {
          concepts: ["fashion"],
          certainty: 0.7,
          moveAwayFrom: {
            concepts: ["finance"],
            force: 0.45
          },
          moveTo: {
            concepts: ["haute couture"],
            force: 0.85
          }
        }
      ){
        name
      }
    }
  }
}

如果基于(例如)类名称“ Sentence” 构造图形架构,则类似的查询可能类似于以下内容:

{
  Get{
    Things{
      Sentence(
        # Explore (i.e., semantically) for "Buying Experience"
        explore: {
          concepts: ["Buying Experience"]
        }
        # Result must include the word "car" 
        where: {
          operator: Like
          path: ["content"]
          valueString: "*car*"
        }
      ){
        content
      }
    }
  }
}

注意:
您也可以从语义上整体浏览图

自动分类

一种替代方法可能是使用上下文KNN分类功能。

对于您的情况,您可以使用Sentence类,并将它们与一个名为Experience的类相关联,该类具有以下属性:(buying当然,您可以选择许多其他配置和策略)。

PS:如果您愿意,
该视频将提供更多背景信息。


0

据我所知,我认为不存在用于构建语义搜索引擎的任何理论模型。但是,我认为应该设计语义搜索引擎来满足当前的特定要求。话虽如此,任何能够成功理解用户意图以及搜索词上下文的语义搜索引擎都需要使用自然语言处理(NLP)和机器学习作为构建模块。

即使搜索引擎与搜索工具的工作方式不同,您也可以参考企业搜索工具来了解有关有效语义搜索模型的想法。3RDi Search这样的新时代平台基于语义搜索原理,并且已被证明是企业必须处理的非结构化数据的理想解决方案。Google很可能正在研究一种在搜索引擎中引入高级语义的模型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.