本文目录导读:

- 核心思路
- 方案一: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 结构)来存储哈希值。
你可以根据具体的数据来源和重复形式,选择最合适的脚本,如果需要针对特定场景(如网页爬虫去重)进行调整,可以提供更多细节。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播