26

我们正在尝试解决一个问题,我们希望在我们的数据集上进行语义搜索,即我们有一个特定于域的数据(例如:关于汽车的句子)

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

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


让我试着给你一个例子,假设我搜索短语“购买体验”,我应该得到如下句子:

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

  • 我绝对讨厌去汽车购物,但今天我很高兴我做到了


我想强调一个事实,即我们正在寻找上下文相似性,而不仅仅是暴力搜索。

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

我们已经尝试过的事情:

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

  2. Elastic Search(BM25 + Vectors(tf-idf)),我们尝试了这个,它给出了几句话,但精度不是很好。准确性也很差。我们尝试了一个人工管理的数据集,它只能得到大约 10% 的句子。

  3. 我们尝试了不同的嵌入,就像曾经在句子转换器中提到的那样,还通过了这个例子并尝试对我们的人工管理集进行评估,但准确性也非常低。

  4. 我们试过ELMO。这比我们预期的要好,但仍然比我们预期的要低,并且有一个认知负荷来决定我们不应该考虑句子的余弦值。这甚至适用于第 3 点。

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

4

3 回答 3

9

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

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

最初的查询有 {canned soda} 和 bing 的搜索结果可以引用 {canned Diet soda}、{soft Drinks}、{unopened room temperature pop} 或 {carbonated beverage}。必应是如何做到这一点的?:

好吧,具有相似含义的单词会得到相似的向量,然后这些向量可以投影到二维图上以便于可视化。这些向量是通过确保具有相似含义的单词在物理上彼此靠近来训练的。您可以通过训练GloVe 模型来训练自己的基于向量的模型在此处输入图像描述

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

在此处输入图像描述

你可以在这里了解更多。对于您的情况,您可以找到句子向量与原始搜索查询的最大距离阈值,以便将其视为上下文相似的句子。

上下文相似性也可以通过使用 LSI(潜在语义索引)之类的东西来减少词汇量来完成。要在 Python 中执行此操作,我强烈建议您查看 python 的 genism 库:https ://radimrehurek.com/gensim/about.html 。

于 2020-02-20T03:08:47.577 回答
1

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

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

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

探索功能

因为所有的数据对象都被向量化了,你可以像下面这样进行语义搜索(这个例子来自文档,你可以在这里使用 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:如果您愿意,
此视频会提供更多背景信息。

于 2020-02-23T11:42:00.567 回答
0

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

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

于 2020-02-21T10:11:06.647 回答