如何计算DataFrame中两列句子对的余弦相似度?
计算DataFrame中句子对的余弦相似度
问题根源
你之前的代码无法运行的核心问题有两个:
- 余弦相似度仅支持数值向量计算,不能直接作用于原始字符串;
- 代码存在拼写错误:
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
相关产品推荐
相关产品推荐

