我想为一列行的所有组合计算余弦相似度
我的输入数据框
1 Text1
2 Text2
3 Text3
4 Text4
5 Text5
像这样,我有30000行 我的输出应包含一个新列,该列包含相似度大于90的索引列表
输出数据帧
1 Text1 [2,3]
2 Text2 [1,3]
3 Text3 [1,2]
4 Text4 [5]
5 Text5 [4]
我已经尝试过
def get_cosine(vec1, vec2):
intersection = set(vec1.keys()) & set(vec2.keys())
numerator = sum([vec1[x] * vec2[x] for x in intersection])
sum1 = sum([vec1[x] ** 2 for x in list(vec1.keys())])
sum2 = sum([vec2[x] ** 2 for x in list(vec2.keys())])
denominator = math.sqrt(sum1) * math.sqrt(sum2)
if not denominator:
return 0.0
else:
return float(numerator) / denominator
def text_to_vector(text):
words = WORD.findall(text)
return Counter(words)
for i in tqdm(range(0,20)):
list_req_90 = []
list_req_85 = []
text1 = data.loc[i,'Text']
vector1 = text_to_vector(text1)
for j in range(0,20):
if (i != j):
text2 = data.loc[j,'Text']
vector2 = text_to_vector(text2)
cosine = get_cosine(vector1, vector2)
if cosine >= 0.90:
list_req_90.append(j)
if cosine >= 0.85:
list_req_85.append(j)
data.at[i,'similar_cosine_90'] = list_req_90
data.at[i,'similar_cosine_85'] = list_req_85
这对我有用,但是它的作用是计算1,2和2,1的相似度 有什么方法可以只计算1,2的相似度,当它是2,1时,使用已经生成的输入1,2 在大型数据集上花费大量时间