You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:32:47