首页 > 解决方案 > 如果两个字符串的含义相同,如何获得概率

问题描述

我已经访问了几乎所有与此相关的帖子,但其中大多数都是根据相似的单词计算概率,但是如果两个语句含义相同但可能包含不同的单词,是否有任何方法可以获得概率。例如。“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) 

提前致谢。

标签: pythonnltk

解决方案


如果您想使用文本语义,则必须使用处理它的算法,例如 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


推荐阅读