脚本怎样过滤重复资讯内容

wen 实用脚本 28

本文目录导读:

脚本怎样过滤重复资讯内容

  1. 核心思路
  2. 方案一:Python 脚本——文本精确去重(适合处理大量文字内容)
  3. 方案二:Python 脚本——基于 Simhash 的近似去重(适合标题相似、内容稍作修改)
  4. 方案三:Shell 脚本——命令行下对文件内容去重(适合Linux/Mac)
  5. 方案四:针对 CSV 或数据库记录的简单去重(Python + Pandas)
  6. 如何选择适合你的脚本?
  7. 关键点提示

(去重)是数据处理中的常见需求,根据你的具体场景(是处理、数据库记录还是文件列表),脚本的实现方式会有所不同。

以下提供几种主流且实用的脚本方案,涵盖从简单到智能的去重方法。

核心思路

  1. 精确匹配:比较两段文本是否“一模一样”。
  2. 模糊匹配:比较两段文本的“相似度”是否超过阈值(例如80%),这通常用于处理标题略有不同或内容被改写的“伪原创”新闻。

Python 脚本——文本精确去重(适合处理大量文字内容)

这是最基础且高效的方法,适用于从网页抓取到的完全相同的新闻。

# -*- coding: utf-8 -*-
import hashlib
def remove_duplicate_articles(input_file, output_file):
    """
    根据文件内容的MD5哈希值进行精确去重
    :param input_file: 输入文件,每行一篇资讯内容
    :param output_file: 输出去重后的文件
    """
    seen_hashes = set()
    with open(input_file, 'r', encoding='utf-8') as f_in, \
         open(output_file, 'w', encoding='utf-8') as f_out:
        for line in f_in:
            content = line.strip()
            if not content:
                continue  # 跳过空行
            # 计算内容的哈希值(更高效),或者直接用字符串作为key
            content_hash = hashlib.md5(content.encode('utf-8')).hexdigest()
            if content_hash not in seen_hashes:
                seen_hashes.add(content_hash)
                f_out.write(content + '\n')
            else:
                print(f"发现重复并被过滤: {content[:50]}...") # 打印前50字符提示
    print(f"去重完成!原始文件已处理,输出至 {output_file}")
# 使用示例
remove_duplicate_articles('news_list.txt', 'unique_news.txt')

优点:速度极快,适合百万级数据。 缺点:无法识别“标题相同但来源不同”或“内容近似”的重复。


Python 脚本——基于 Simhash 的近似去重(适合标题相似、内容稍作修改)

很多重复新闻是“标题党”或“转载改写”,内容不完全一样,这时需要使用 Simhash 算法进行指纹比对

需要安装库pip install simhash

# -*- coding: utf-8 -*-
from simhash import Simhash
from collections import defaultdict
def simhash_distance(text1, text2):
    """计算两段文本的Simhash距离,值越小越相似"""
    hash1 = Simhash(text1)
    hash2 = Simhash(text2)
    return hash1.distance(hash2)
def remove_similar_articles(article_list, threshold=3):
    """
    根据Simhash距离进行相似去重
    :param article_list: 资讯内容列表
    :param threshold: 距离阈值,建议值3~5(值越小,要求越精确)
    :return: 去重后的唯一文章列表
    """
    unique_articles = []
    seen_hashes = []
    for article in article_list:
        current_hash = Simhash(article)
        is_duplicate = False
        # 与所有已保留的文章比较
        for seen_hash in seen_hashes:
            distance = current_hash.distance(seen_hash)
            if distance < threshold:  # 如果距离小于阈值,认为是重复
                is_duplicate = True
                break
        if not is_duplicate:
            unique_articles.append(article)
            seen_hashes.append(current_hash)
    return unique_articles
# 使用示例
news = [
    "突发!美国宣布加息0.25个百分点",
    "突发!美国宣布加息0.25个百分点",  # 这是精确重复
    "突发:美联储加息25个基点,股市震荡", # 这是近似重复,标题稍改
    "今日天气晴朗,适合出行",  # 这是不同的新闻
]
result = remove_similar_articles(news, threshold=3)
print("去重后保留的内容:")
for item in result:
    print(item)

输出结果:你会看到,第一条和第二条被合并,第三条被保留(因为距离可能较大),第四条保留。


Shell 脚本——命令行下对文件内容去重(适合Linux/Mac)

如果你不需要复杂的算法,只是在文本文件中去除完全相同的行,用命令行最快。

#!/bin/bash
# 脚本名称:dedup_news.sh
# 用法:./dedup_news.sh input.txt output.txt
input_file="$1"
output_file="$2"
echo "正在对文件进行精确去重..."
sort "$input_file" | uniq > "$output_file"
echo "去重完成!原始行数: $(wc -l < $input_file),输出行数: $(wc -l < $output_file)"

注意sort | uniq 会打乱原始顺序,如果要保留原始顺序,可以使用 awk

awk '!seen[$0]++' input.txt > output.txt

这个 awk 命令会保留第一次出现的行,并删除后续的重复行。


针对 CSV 或数据库记录的简单去重(Python + Pandas)

如果你的资讯存储在 CSV 文件中(标题, 作者, 内容),可以指定按列去重。

import pandas as pd
# 读取CSV
df = pd.read_csv('news_data.csv')
# 查看原始数量
print(f"原始记录数: {len(df)}")
列进行精确去重,保留第一个出现的记录
df_unique = df.drop_duplicates(subset=['内容'], keep='first')
# 重置索引
df_unique = df_unique.reset_index(drop=True)
print(f"去重后记录数: {len(df_unique)}")
# 保存到新文件
df_unique.to_csv('unique_news_data.csv', index=False, encoding='utf-8-sig')

如何选择适合你的脚本?

你的场景 推荐方案
完全相同 (同一篇新闻稿被完全复制) 方案一 (基于Hash) 或 方案三 (Shell/AWK)
或内容存在微小差异 (转载时改了标题或首段) 方案二 (基于Simhash)
数据量大,但只需要简单地按列去重 (按“标题”列去重) 方案四 (Pandas)
需要在命令行快速处理 方案三 (Shell)

关键点提示

  1. 处理中文:确保脚本编码为 UTF-8,并在读写文件时指定 encoding='utf-8'
  2. 预处理:在去重之前,最好对文本进行清洗(去除空格、HTML标签、标点符号差异),这样可以提高去重准确率。
    import re
    def clean_text(text):
       text = re.sub(r'<[^>]+>', '', text)  # 去HTML标签
       text = re.sub(r'\s+', ' ', text)    # 合并空格
       return text.strip()
  3. 性能优化:对于海量数据(百万级以上),建议使用方案一的哈希法,或使用专门的数据库(如 Redis 的 Set 结构)来存储哈希值。

你可以根据具体的数据来源和重复形式,选择最合适的脚本,如果需要针对特定场景(如网页爬虫去重)进行调整,可以提供更多细节。

抱歉,评论功能暂时关闭!