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))