Scikit learn 计算目标字符串与字符串列表之间余弦相似性的最佳方法-Python
我有一个目标字符串,比如说Scikit learn 计算目标字符串与字符串列表之间余弦相似性的最佳方法-Python,scikit-learn,Scikit Learn,我有一个目标字符串,比如说target='apple',我有一个候选字符串列表,比如说candidate\u list=['orange'、'banana'、'apple1'、'菠萝']。我正在计算目标之间的余弦相似性,并使用以下代码迭代候选列表中的每个字符串 def calculate_cosine(c, h): vec = CountVectorizer() label_dictionary = vec.fit([c, h]) c_vector = label_dictio
target='apple'
,我有一个候选字符串列表,比如说candidate\u list=['orange'、'banana'、'apple1'、'菠萝']
。我正在计算目标
之间的余弦相似性,并使用以下代码迭代候选列表
中的每个字符串
def calculate_cosine(c, h):
vec = CountVectorizer()
label_dictionary = vec.fit([c, h])
c_vector = label_dictionary.transform([c]).toarray()
h_vector = label_dictionary.transform([h]).toarray()
cx = lambda curr, hist: round(
numpy.inner(curr, hist) / numpy.LA.norm(curr) * numpy.LA.norm(hist), 3)
return cx(c_vector, h_vector)
我的问题是,有没有一种方法可以做到这一点,而不必在矩阵运算或类似矩阵运算的行上迭代candidate\u list
。
我这样问是因为我当前的实现(在候选列表上循环)对于我的应用程序来说不够快。
谢谢。Scikit learn包含计算向量组之间余弦相似性的高效代码;它位于sklearn.metrics.pairwise
子模块中
以下是解决问题的快速方法:
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import pairwise_kernels
candidate_list = ['orange', 'banana', 'apple1', 'pineapple']
target = 'apple'
vec = CountVectorizer(analyzer='char')
vec.fit(candidate_list)
pairwise_kernels(vec.transform([target]),
vec.transform(candidate_list),
metric='cosine')
# array([[ 0.3086067 , 0.30304576, 0.93541435, 0.9166985 ]])
请注意,我使用了CountVectorizer(analyzer='char')
来计算字符而不是单词,因为它似乎更适合您的示例数据。一个注意:您的余弦相似度计算不正确:您可能指的是numpy.inner(curr,hist)/(numpy.LA.norm(curr)*numpy.LA.norm(hist))