如何使用Pandas基于文本相似度百分比实现CSV重复行检测与删除
基于文本相似度的CSV去重实现方案
实现思路
- 优先保留数据中顺序靠前的行,后续行仅在和所有已保留行的
text相似度都低于设定阈值时才会被保留 - 可选对
text内容做预处理,移除末尾的无关链接,避免无关内容干扰相似度计算 - 采用莱文斯坦距离计算文本相似度,支持自定义阈值,适配不同去重严格度需求
前置依赖
需要先安装相似度计算相关库:
pip install fuzzywuzzy python-Levenshtein
完整实现代码
import re import pandas as pd from fuzzywuzzy import fuzz # 配置项:相似度阈值,范围0-100,比如70代表相似度≥70%判定为重复 SIMILARITY_THRESHOLD = 70 # 预处理函数:移除文本中的链接,不需要可删除该函数相关调用 def remove_url(text): return re.sub(r'https?://\S+', '', str(text)).strip() # 读取数据 df = pd.read_csv('data/resultsg_small.csv') df = df[['id','created_at','text','author_id']] # 先做完全去重,减少后续相似度计算量 df.drop_duplicates(subset ="text",keep = 'first', inplace = True) df.reset_index(drop=True, inplace=True) # 存储已保留的预处理后的文本 kept_texts = [] # 存储要保留的行索引 keep_indexes = [] for idx, row in df.iterrows(): current_text = remove_url(row['text']) # 标记当前行是否为重复 is_duplicate = False for kept in kept_texts: # 计算相似度 similarity = fuzz.ratio(current_text, kept) if similarity >= SIMILARITY_THRESHOLD: is_duplicate = True break if not is_duplicate: keep_indexes.append(idx) kept_texts.append(current_text) # 筛选保留的行 df_result = df.loc[keep_indexes] # 输出结果 df_result.to_csv('new.csv', index=False)
参数调整说明
- 修改
SIMILARITY_THRESHOLD的数值即可调整去重严格程度,数值越高去重越松,反之越严格 - 若不需要预处理移除链接,直接删除
remove_url相关调用,直接用原始text计算相似度即可 - 若数据量极大(超过10万行),可改用向量检索类方案提升计算效率,当前实现适配万级以下小批量数据使用
内容的提问来源于stack exchange,提问作者jms
相关产品推荐
相关产品推荐

