Python求助:如何移除CSV文件中内容部分相似的推文?
移除CSV中部分相似推文的Python实现方案
嘿,作为刚接触Python和Stack Overflow的新手,你已经搞定了完全重复推文的移除,这一步做得相当不错!接下来要处理部分相似的推文,核心思路是通过计算文本之间的相似度,设定一个阈值来判断是否属于相似内容,然后保留其中一条即可。下面给你几个实用的实现方案,结合你现有的CSV操作代码来调整:
方法一:基于Jaccard相似度的简单匹配
Jaccard相似度通过计算两个文本词集合的交集与并集的比值来衡量相似度,值越接近1越相似。适合短文本(比如推文)的快速匹配。
实现步骤:
- 先把每条推文的文本预处理成词集合(比如转小写、去除标点、分词)
- 遍历所有推文,计算两两之间的Jaccard相似度
- 设定相似度阈值(比如0.7),超过阈值则判定为相似,移除重复项
代码示例:
import csv from sklearn.feature_extraction.text import CountVectorizer from sklearn.metrics.pairwise import jaccard_score def preprocess_text(text): # 简单预处理:转小写、去除标点(可根据需求扩展) text = text.lower().strip() # 这里可以添加去除停用词、特殊字符等操作 return text def remove_similar_tweets(input_path, output_path, threshold=0.7): # 读取所有数据 with open(input_path, 'r', encoding="utf-8", newline='') as csvInputFile: csvReader = csv.reader(csvInputFile) header = next(csvReader) rows = list(csvReader) # 预处理文本并提取特征 texts = [preprocess_text(row[2]) for row in rows] vectorizer = CountVectorizer(binary=True) text_vectors = vectorizer.fit_transform(texts) # 标记需要保留的行 keep_indices = [] n = len(rows) for i in range(n): # 如果当前行还没被标记为移除 if i not in keep_indices: keep_indices.append(i) # 对比后面的行 for j in range(i+1, n): sim = jaccard_score(text_vectors[i].toarray()[0], text_vectors[j].toarray()[0]) if sim >= threshold: continue # 跳过相似的行,不加入保留列表 # 写入结果 with open(output_path, 'w', encoding="utf-8", newline='') as csvOutputFile: csvWriter = csv.writer(csvOutputFile) csvWriter.writerow(header) for idx in keep_indices: csvWriter.writerow(rows[idx]) # 调用函数 remove_similar_tweets('inputFile.csv', 'outputFile.csv', threshold=0.7)
方法二:基于TF-IDF+余弦相似度的精准匹配
如果Jaccard的效果不够理想,可以用TF-IDF将文本转换成向量,再计算余弦相似度,这种方法更能体现词的重要性,适合区分语义相似的推文。
代码示例:
import csv from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity def preprocess_text(text): text = text.lower().strip() # 可添加更多预处理步骤:比如去除URL、@提及、停用词等 return text def remove_similar_tweets_tfidf(input_path, output_path, threshold=0.8): with open(input_path, 'r', encoding="utf-8", newline='') as csvInputFile: csvReader = csv.reader(csvInputFile) header = next(csvReader) rows = list(csvReader) texts = [preprocess_text(row[2]) for row in rows] vectorizer = TfidfVectorizer(stop_words='english') # 去除英文停用词,中文的话需要替换成中文停用词表 tfidf_matrix = vectorizer.fit_transform(texts) keep_indices = [] n = len(rows) for i in range(n): if i not in keep_indices: keep_indices.append(i) # 计算当前行与后续所有行的余弦相似度 similarities = cosine_similarity(tfidf_matrix[i], tfidf_matrix[i+1:])[0] for j_idx, sim in enumerate(similarities): j = i + 1 + j_idx if sim >= threshold: continue with open(output_path, 'w', encoding="utf-8", newline='') as csvOutputFile: csvWriter = csv.writer(csvOutputFile) csvWriter.writerow(header) for idx in keep_indices: csvWriter.writerow(rows[idx]) # 调用函数 remove_similar_tweets_tfidf('inputFile.csv', 'outputFile.csv', threshold=0.8)
方法三:用fuzzywuzzy库做模糊字符串匹配
如果你不想用机器学习的向量方法,可以用fuzzywuzzy库直接计算字符串的编辑距离相似度,操作更简单。
先安装库:
pip install fuzzywuzzy python-Levenshtein
代码示例:
import csv from fuzzywuzzy import fuzz def remove_similar_tweets_fuzzy(input_path, output_path, threshold=80): with open(input_path, 'r', encoding="utf-8", newline='') as csvInputFile: csvReader = csv.reader(csvInputFile) header = next(csvReader) rows = list(csvReader) keep_indices = [] n = len(rows) for i in range(n): if i not in keep_indices: keep_indices.append(i) current_text = rows[i][2] for j in range(i+1, n): compare_text = rows[j][2] # 用ratio计算整体相似度,也可以用partial_ratio匹配部分内容 sim_score = fuzz.ratio(current_text.lower(), compare_text.lower()) if sim_score >= threshold: continue with open(output_path, 'w', encoding="utf-8", newline='') as csvOutputFile: csvWriter = csv.writer(csvOutputFile) csvWriter.writerow(header) for idx in keep_indices: csvWriter.writerow(rows[idx]) # 调用函数 remove_similar_tweets_fuzzy('inputFile.csv', 'outputFile.csv', threshold=80)
注意事项:
- 阈值调整:你需要根据自己的数据集调整相似度阈值,比如先测试小部分数据,找到最合适的数值(比如0.7-0.9之间)
- 预处理优化:推文里通常有URL、@用户名、话题标签等,可以先移除这些无关内容,提升相似度计算的准确性
- 性能优化:25000条数据两两对比的时间复杂度是O(n²),如果觉得慢,可以考虑先按日期分组,只对比同一天的推文,或者用近似最近邻算法来加速匹配
内容的提问来源于stack exchange,提问作者ToBeEXP
相关产品推荐
相关产品推荐

