计算目标字符串与字符串列表之间余弦相似度的最佳方法 - Python

时间:2015-10-21 18:29:47

标签: scikit-learn

我有一个目标字符串,比如target = 'apple',我有一个候选字符串列表,比如candidate_list = ['orange', 'banana', 'apple1', 'pineapple']。我正在计算target之间的余弦相似度,并使用以下代码迭代candidate_list中的每个字符串。

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) 

我的问题是,有没有办法做到这一点,而不是在Array Broadcasting或类似Matrix Operation的行candidate_list上进行迭代。 我问这个,因为我当前的实现(循环遍历candidate_list)对我的应用程序来说不够快。 感谢。

1 个答案:

答案 0 :(得分:3)

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')来计算字符而非字数,因为它似乎更适合您的示例数据。