python - 如果两个字符串的含义相同,如何获得概率
问题描述
我已经访问了几乎所有与此相关的帖子,但其中大多数都是根据相似的单词计算概率,但是如果两个语句含义相同但可能包含不同的单词,是否有任何方法可以获得概率。例如。“Python 是 ML 的正确选择”和“机器学习的最佳语言是 Python”。此示例应返回 True(在此概率应至少为 0.5),因为两个句子的含义相同。
在此代码中,它只是使用两个字符串中存在的相似词来计算相似度。
# Program to measure the similarity between
# two sentences using cosine similarity.
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
# X = input("Enter first string: ").lower()
# Y = input("Enter second string: ").lower()
X ="I love horror movies"
Y ="Lights out is a horror movie"
# tokenization
X_list = word_tokenize(X)
Y_list = word_tokenize(Y)
# sw contains the list of stopwords
sw = stopwords.words('english')
l1 =[];l2 =[]
# remove stop words from the string
X_set = {w for w in X_list if not w in sw}
Y_set = {w for w in Y_list if not w in sw}
# form a set containing keywords of both strings
rvector = X_set.union(Y_set)
for w in rvector:
if w in X_set: l1.append(1) # create a vector
else: l1.append(0)
if w in Y_set: l2.append(1)
else: l2.append(0)
c = 0
# cosine formula
for i in range(len(rvector)):
c+= l1[i]*l2[i]
cosine = c / float((sum(l1)*sum(l2))**0.5)
print("similarity: ", cosine)
提前致谢。
解决方案
如果您想使用文本语义,则必须使用处理它的算法,例如 word2vec、glove、fasttext。
您可以使用经过大量数据训练的预训练词嵌入,并根据词与句子中其他词的共现情况对词之间的上下文/语义相似性进行编码。
这些词嵌入是n-dimensional vector
大量词汇的表示。这些向量可以相加来创建句子嵌入的表示。具有相似语义的单词的句子将具有相似的向量,因此它们的句子嵌入也将相似。
您可以使用以下方法检查这些句子嵌入之间的相似性cosine_similarity
from scipy import spatial
import gensim.downloader as api
model = api.load("glove-wiki-gigaword-50") #choose from multiple models https://github.com/RaRe-Technologies/gensim-data
s0 = 'Mark zuckerberg owns the facebook company'
s1 = 'Facebook company ceo is mark zuckerberg'
s2 = 'Microsoft is owned by Bill gates'
s3 = 'How to learn japanese'
def preprocess(s):
return [i.lower() for i in s.split()]
def get_vector(s):
return np.sum(np.array([model[i] for i in preprocess(s)]), axis=0)
print('s0 vs s1 ->',1 - spatial.distance.cosine(get_vector(s0), get_vector(s1)))
print('s0 vs s2 ->', 1 - spatial.distance.cosine(get_vector(s0), get_vector(s2)))
print('s0 vs s3 ->', 1 - spatial.distance.cosine(get_vector(s0), get_vector(s3)))
#Semantic similarity between sentence pairs
s0 vs s1 -> 0.965923011302948
s0 vs s2 -> 0.8659112453460693
s0 vs s3 -> 0.5877998471260071
您可以选择比我在这里使用的模型更好的模型 - https://github.com/RaRe-Technologies/gensim-data
推荐阅读
- discord.js - Discord.Js 机器人不等待响应
- javascript - 如何在 JavaScript 中的多维(2D)数组中的关联数组中设置/获取值
- javascript - 我无法从对象中检索变量
- java - 在相对布局中限制自定义视图
- sql - 我的 SQL 查询正在创建新表,如何改为更新现有表
- javascript - 遵循 OOP 范式和 DRY 原则,如何最好地重构这个计时器/秒表代码库以实现更好的代码重用?
- python - 大熊猫抓取价值以填充新列
- flutter - 键盘在 modalBottomSheet 中立即关闭
- javascript - 如何在不使用相同音频 ID 的情况下播放从数据库中获取的多个音频文件
- reactjs - 为什么这些元组类型是联合的?