首页 > 解决方案 > 查找 2 个语句之间的语义相似性

问题描述

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

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

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

我想要什么?

假设我的数据库有语句display classes并且用户输入show, showed, displayed,displayed classshow types是相同的。如果以上 2 个陈述相同,那么我也不在乎。displayed并且displayed class已经显示在 difflib 中。

需要注意的点

标签: python-3.xnlp

解决方案


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

你需要 tensorflow_hub

Universal Sentence Encoder将文本编码为high-dimensional vectors可用于text classificationsemantic similarityclustering其他自然语言任务的文本。

我相信您在这里需要的是文本分类语义相似性,因为您想找到最接近用户给出的前 5 或 10 个语句。

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

代码

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.999999之间的距离。第二是和之间的距离,最后是和之间的距离。display classesdisplay classes0.5633253display classesshow0.61701006display classesshow types

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


推荐阅读