计算Pandas同行列字符串余弦相似度未获预期结果求排查
问题排查与修正
你的代码核心错误在于没有针对每行的text1和text2单独计算相似度,而是把每行拼接后的文本作为整体生成向量,再计算所有拼接文本与第一行的相似度,这和需求完全不符。
错误拆解
CountVectorizer().fit_transform(df['text1'] + ' ' + df['text2']):这一步生成的是3个向量,每个向量对应一行中text1+text2拼接后的文本,而非每行中两个独立文本的向量。cosine_similarity(vectorizer)[:, 0:1]:这一步计算的是这3个拼接文本向量之间的相似度矩阵,然后取所有行与第一行的相似度值,结果自然不是你要的同一行内两个字符串的相似度。
修正后的代码
我们需要对每行的text1和text2分别提取向量,再逐行计算余弦相似度:
import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import cosine_similarity pd.set_option('display.float_format', '{:.4f}'.format) df = pd.DataFrame({ 'text1': ['The quick brown fox jumps over the lazy dog', 'The red apple', 'The big blue sky'], 'text2': ['The lazy cat jumps over the brown dog', 'The red apple', 'The big yellow sun'] }) # 先拟合所有文本的词汇表(用text1和text2的所有内容) vectorizer = CountVectorizer() all_texts = pd.concat([df['text1'], df['text2']]) vectorizer.fit(all_texts) # 定义函数:计算单对文本的余弦相似度 def calc_cosine(row): vec1 = vectorizer.transform([row['text1']]) vec2 = vectorizer.transform([row['text2']]) return cosine_similarity(vec1, vec2)[0][0] # 逐行计算并赋值 df['cosine_similarity'] = df.apply(calc_cosine, axis=1) print(df)
输出结果
运行修正后的代码会得到符合预期的结果:
text1 text2 cosine_similarity 0 The quick brown fox jumps over the lazy dog The lazy cat jumps over the brown dog 0.7638 1 The red apple The red apple 1.0000 2 The big blue sky The big yellow sun 0.4082
补充说明
- 如果想用TF-IDF向量替代词频向量,只需要把
CountVectorizer换成TfidfVectorizer即可,逻辑完全一致。 - 先拟合所有文本的词汇表是为了保证
text1和text2的向量维度一致,避免因单独拟合导致的维度不匹配问题。
内容的提问来源于stack exchange,提问作者student_R123
相关产品推荐
相关产品推荐

