本文目录导读:

- 核心思路
- 方案一:Python 脚本——文本精确去重(适合处理大量文字内容)
- 方案二:Python 脚本——基于 Simhash 的近似去重(适合标题相似、内容稍作修改)
- 方案三:Shell 脚本——命令行下对文件内容去重(适合Linux/Mac)
- 方案四:针对 CSV 或数据库记录的简单去重(Python + Pandas)
- 如何选择适合你的脚本?
- 关键点提示
(去重)是数据处理中的常见需求,根据你的具体场景(是处理、数据库记录还是文件列表),脚本的实现方式会有所不同。
以下提供几种主流且实用的脚本方案,涵盖从简单到智能的去重方法。
核心思路
- 精确匹配:比较两段文本是否“一模一样”。
- 模糊匹配:比较两段文本的“相似度”是否超过阈值(例如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) |
关键点提示
- 处理中文:确保脚本编码为 UTF-8,并在读写文件时指定
encoding='utf-8'。 - 预处理:在去重之前,最好对文本进行清洗(去除空格、HTML标签、标点符号差异),这样可以提高去重准确率。
import re def clean_text(text): text = re.sub(r'<[^>]+>', '', text) # 去HTML标签 text = re.sub(r'\s+', ' ', text) # 合并空格 return text.strip()
- 性能优化:对于海量数据(百万级以上),建议使用方案一的哈希法,或使用专门的数据库(如 Redis 的 Set 结构)来存储哈希值。
你可以根据具体的数据来源和重复形式,选择最合适的脚本,如果需要针对特定场景(如网页爬虫去重)进行调整,可以提供更多细节。