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

Python求助:如何移除CSV文件中内容部分相似的推文?

移除CSV中部分相似推文的Python实现方案

嘿,作为刚接触Python和Stack Overflow的新手,你已经搞定了完全重复推文的移除,这一步做得相当不错!接下来要处理部分相似的推文,核心思路是通过计算文本之间的相似度,设定一个阈值来判断是否属于相似内容,然后保留其中一条即可。下面给你几个实用的实现方案,结合你现有的CSV操作代码来调整:


方法一:基于Jaccard相似度的简单匹配

Jaccard相似度通过计算两个文本词集合的交集与并集的比值来衡量相似度,值越接近1越相似。适合短文本(比如推文)的快速匹配。

实现步骤:

  1. 先把每条推文的文本预处理成词集合(比如转小写、去除标点、分词)
  2. 遍历所有推文,计算两两之间的Jaccard相似度
  3. 设定相似度阈值(比如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:12:56