我有一个目标字符串,比如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')
来计算字符而不是单词,因为它似乎更适合您的示例数据。