如何使用PySpark计算两个DataFrame中文本列的相似度
实现方案
我们可以通过构造两个DataFrame的全量笛卡尔积实现所有行两两配对,再对配对后的文本计算相似度,具体实现步骤如下:
步骤1:生成全配对数据集(笛卡尔积)
这一步完成后数据集行数等于df1行数 × df2行数,每一行都是一组df1行和df2行的配对。
import pandas as pd # 给两个DataFrame添加相同的临时键,用于全连接 df1['tmp_key'] = 0 df2['tmp_key'] = 0 # 全连接后删除临时键,得到全配对数据集 full_df = pd.merge(df1, df2, on='tmp_key').drop('tmp_key', axis=1)
步骤2:计算文本相似度
根据你的文本长度和业务场景,可以选择以下两种常用的相似度计算方案:
方案1:TF-IDF+余弦相似度(适合长文本、语义层面匹配)
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity # 合并两个文本列训练TF-IDF模型,保证词表统一 all_text = pd.concat([df1['title'], df2['headline']]) tfidf_model = TfidfVectorizer().fit(all_text) # 分别将两个文本列转为向量 title_vec = tfidf_model.transform(full_df['title']) headline_vec = tfidf_model.transform(full_df['headline']) # 逐行计算余弦相似度,得分范围[0,1],值越高越相似 full_df['similarity_score'] = [cosine_similarity(v1, v2)[0][0] for v1, v2 in zip(title_vec, headline_vec)]
方案2:Levenshtein编辑距离相似度(适合短文本、字符层面匹配)
先安装依赖:pip install python-Levenshtein
from Levenshtein import ratio # 逐行计算编辑距离相似度,得分范围[0,1],值越高越相似 full_df['similarity_score'] = full_df.apply(lambda row: ratio(row['title'], row['headline']), axis=1)
最终得到的full_df已经包含两个原数据集的所有字段和对应的相似度得分,完全符合需求。
内容的提问来源于stack exchange,提问作者FATMA BERRAK GUNGOR
相关产品推荐
相关产品推荐

