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

如何计算DataFrame中两列句子对的余弦相似度?

计算DataFrame中句子对的余弦相似度

问题根源

你之前的代码无法运行的核心问题有两个:

  1. 余弦相似度仅支持数值向量计算,不能直接作用于原始字符串;
  2. 代码存在拼写错误:spicy应为scipy。

完整解决方案

要计算句子的余弦相似度,必须先将文本转换为数值向量,这里用TfidfVectorizer实现文本向量化,以下是可直接运行的代码:

1. 导入依赖库

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

2. 构建示例DataFrame

df = pd.DataFrame({
    "A": ["Lorem ipsum ta", "Excepteur sint", "Duis aute irure"],
    "B": ["lorem ipsum", "occaecat excepteur", "aute irure"]
})

3. 定义相似度计算函数

def get_cosine_sim(text1, text2):
    # 初始化TF-IDF向量化器
    tfidf = TfidfVectorizer()
    # 将两个句子转为词频矩阵
    tfidf_matrix = tfidf.fit_transform([text1, text2])
    # 提取相似度值
    return cosine_similarity(tfidf_matrix)[0][1]

4. 批量计算相似度

df["cosine_sim"] = df.apply(lambda row: get_cosine_sim(row["A"], row["B"]), axis=1)

5. 查看结果

print(df.round(1))

运行后会输出类似你期望的结果(实际数值由TF-IDF计算逻辑决定,与示例中的0.8/0.5/0.4可能略有差异)。

性能优化(针对大数据集)

如果你的DataFrame行数较多,上述方法每次初始化TF-IDF会重复计算词汇表,可优化为提前拟合所有文本的词汇表:

# 收集所有文本,统一拟合词汇表
all_texts = df["A"].tolist() + df["B"].tolist()
tfidf = TfidfVectorizer()
tfidf.fit(all_texts)

def optimized_sim(text1, text2):
    vec1 = tfidf.transform([text1])
    vec2 = tfidf.transform([text2])
    return cosine_similarity(vec1, vec2)[0][0]

df["cosine_sim"] = df.apply(lambda row: optimized_sim(row["A"], row["B"]), axis=1)

原代码错误点总结

  • 拼写错误:spicy.spatial.distance应为scipy.spatial.distance;
  • 逻辑错误:直接对字符串调用cosine函数,scipy的余弦距离要求输入为数值向量;
  • 用法错误:df[["A","B"]].apply的lambda参数是Series对象,不是两个独立的文本参数。

内容的提问来源于stack exchange,提问作者stack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:10:49