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



我有一个目标字符串,比如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) 

我的问题是,有没有一种方法可以做到这一点,而不需要在数组广播或矩阵操作的行上迭代candidate_list。我问这个,因为我目前的实现(在candidate_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')来计算字符而不是单词,因为它似乎更适合您的示例数据。

相关内容

  • 没有找到相关文章

最新更新