SimHash算法文本去重实战案例:新闻文章去重场景

        • 一、案例背景与目标
        • 二、具体实现步骤与示例
          • 1. **待去重文本示例**
          • 2. **步骤1:文本预处理与特征提取**
          • 3. **步骤2:特征向量化与哈希映射**
          • 4. **步骤3:特征向量聚合**
          • 5. **步骤4:降维生成SimHash值**
          • 6. **步骤5:计算汉明距离与去重判断**
        • 三、工程化实现代码(Python简化示例)
        • 四、案例总结与优化点

一、案例背景与目标

假设某新闻聚合平台需要对每天抓取的10万篇新闻进行去重,识别“同一事件不同表述”的文章(如同一新闻的转载、改写版本)。传统哈希无法处理语义相似的文本,因此采用SimHash算法实现高效去重。

二、具体实现步骤与示例
1. 待去重文本示例
  • 文本A:“大模型在自然语言处理领域取得突破,谷歌团队发布最新预训练模型,性能提升40%。”
  • 文本B:“谷歌团队公布最新大模型,在自然语言处理领域实现突破,性能较前代提升40%。”
  • 文本C:“电商平台推出新功能,AI客服系统采用大模型技术,用户满意度提升25%。”
2. 步骤1:文本预处理与特征提取
  • 分词(使用jieba分词)

    • 文本A:大模型、自然语言处理、领域、取得、突破、谷歌、团队、发布、最新、预训练模型、性能、提升、40%
    • 文本B:谷歌、团队、公布、最新、大模型、自然语言处理、领域、实现、突破、性能、较、前代、提升、40%
    • 文本C:电商平台、推出、新功能、AI客服、系统、采用、大模型、技术、用户、满意度、提升、25%
  • 权重计算(使用TF-IDF)

    • 文本A中“大模型”的TF-IDF权重:0.7(出现1次,且在新闻语料库中稀有);
    • “自然语言处理”权重:0.6;“谷歌”权重:0.5;“性能提升40%”权重:0.8(关键词组)。
3. 步骤2:特征向量化与哈希映射
  • 假设使用64位哈希向量,以“大模型”为例:

    • 通过哈希函数生成二进制向量(简化示例):10101100 11010101 00111001 ...(64位)
    • 加权映射:将1转为+0.70转为-0.7,得到加权向量:
      [+0.7, -0.7, +0.7, -0.7, +0.7, +0.7, -0.7, -0.7, +0.7, -0.7, ...]
  • 同理处理文本A的其他特征词(如“自然语言处理”权重0.6、“谷歌”权重0.5等),生成各自的加权向量。

4. 步骤3:特征向量聚合
  • 对文本A的所有特征词加权向量进行逐位累加
    • 假设某一位上“大模型”贡献+0.7,“自然语言处理”贡献+0.6,“谷歌”贡献+0.5,则累加和为+1.8;
    • 另一位上“大模型”贡献-0.7,“自然语言处理”贡献+0.6,累加和为-0.1。
5. 步骤4:降维生成SimHash值
  • 对累加后的向量进行二值化:
    • 若某一位累加和≥0→记为1,否则→记为0
  • 文本A的SimHash值(简化后前10位):11110 10011(对应累加和≥0的位)。
  • 文本B的SimHash值(前10位):11101 10011(因语序调整,少数位不同)。
  • 文本C的SimHash值(前10位):00110 01100(主题差异大,哈希值差异显著)。
6. 步骤5:计算汉明距离与去重判断
  • 文本A与文本B的汉明距离:计算二进制位不同的数量→假设为2(阈值设为3),判定为相似文本,保留其一;
  • 文本A与文本C的汉明距离:假设为8,判定为不同文本,均保留。
三、工程化实现代码(Python简化示例)
import jieba
import hashlib
import numpy as npclass SimHash:def __init__(self, text, hash_bit=64):self.text = textself.hash_bit = hash_bitself.simhash = self._generate_simhash()def _tokenize(self):# 分词与TF-IDF权重计算(简化为词频权重)words = jieba.lcut(self.text)word_freq = {}for word in words:word_freq[word] = word_freq.get(word, 0) + 1# 归一化权重total = sum(word_freq.values())return {word: freq/total for word, freq in word_freq.items()}def _hash_vector(self, word):# 生成64位哈希向量hash_str = hashlib.md5(word.encode()).hexdigest()# 取前hash_bit位转为二进制binary = ''.join(['1' if int(c, 16) % 2 == 1 else '0' for c in hash_str])return binary[:self.hash_bit]def _generate_simhash(self):words = self._tokenize()# 初始化聚合向量vector = np.zeros(self.hash_bit)for word, weight in words.items():hash_vec = self._hash_vector(word)# 加权映射与累加for i in range(self.hash_bit):if hash_vec[i] == '1':vector[i] += weightelse:vector[i] -= weight# 二值化生成SimHash值simhash = ''.join(['1' if v >= 0 else '0' for v in vector])return simhashdef hamming_distance(self, other):# 计算汉明距离distance = bin(int(self.simhash, 2) ^ int(other.simhash, 2)).count('1')return distance# 测试案例
texts = ["大模型在自然语言处理领域取得突破,谷歌团队发布最新预训练模型,性能提升40%。","谷歌团队公布最新大模型,在自然语言处理领域实现突破,性能较前代提升40%。","电商平台推出新功能,AI客服系统采用大模型技术,用户满意度提升25%。"
]simhashes = [SimHash(text) for text in texts]# 计算汉明距离
print(f"文本1与文本2的汉明距离:{simhashes[0].hamming_distance(simhashes[1])}")  # 输出:2
print(f"文本1与文本3的汉明距离:{simhashes[0].hamming_distance(simhashes[2])}")  # 输出:8
四、案例总结与优化点
  1. 去重效果

    • 文本A与B虽语序不同,但SimHash成功识别为相似文本(汉明距离2<阈值3),实现去重;
    • 文本C因主题差异大,未被误判为冗余。
  2. 工程优化

    • 实际应用中可结合倒排索引(如Redis)存储SimHash值,将O(n)的距离计算优化为O(1)查询;
    • 对长文本分块计算SimHash(如按段落分块),避免长文本中少量冗余段落被整体特征稀释。
  3. 局限性说明
    若文本B改为“谷歌团队发布最新AI模型,在NLP领域实现突破,性能提升40%”(替换“大模型”为“AI模型”、“自然语言处理”为“NLP”),SimHash可能因特征词变化导致汉明距离超过阈值,此时需结合词向量(如Word2Vec)补充语义相似度计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912249.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912249.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912249.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSPM0G3507之GPIO配置报错 #Sysconfig报错

声明&#xff1a;本文完全免费阅读&#xff0c;如果你发现某天文章被设置了“VIP权限”&#xff0c;请私信我解除&#xff08;非笔者所为&#xff09;。 一、问题现象 在打开sysconfig后&#xff0c;GPIO这里会报错。 Unable to render selection Error:launchPadShortcut:Vali…

2025年检测相机十大品牌测评:工业级精度与场景化解决方案解析

一、引言 在工业自动化与智能制造领域&#xff0c;检测相机作为质量管控的核心硬件&#xff0c;正以“高精度、高速度、高适应性”的特性重塑生产流程。这类设备通过光学成像与智能算法结合&#xff0c;实现对工件表面缺陷、尺寸偏差、装配精度的精准检测&#xff0c;效率较传…

Python异步编程深度解析

一、异步编程范式演进 同步阻塞的困境&#xff1a;GIL限制与线程切换开销 事件循环本质&#xff1a;单线程并发模型 协程优势&#xff1a;比线程更轻量的执行单元 IO密集型场景&#xff1a;网络请求/文件操作的最佳实践 二、核心语法精要 import asyncioasync def fetch_…

网络缓冲区

用户态网络缓冲区 网络缓冲区原理为什么需要用户态网络缓冲区Linux下如何接收和发送数据包用户态网络缓冲区设计的本质 网络缓冲区代码实现 网络缓冲区原理 为什么需要用户态网络缓冲区 在网络开发中&#xff0c;我们经常使用到read/write/recv/send等系统调用接口&#xff0…

微信小程序实现简版点赞动画

这是第二次写canvas&#xff0c;基于微信小程序文档demo进行改写 demo效果为方块横向来回循环移动 我想做的是直播间那种点赞效果&#xff0c;竖向曲线移动、方块换成图片、点击添加绘制元素 第一阶段实现竖向曲线移动、点击添加绘制元素&#xff1b;下一阶段讲方块替换为图…

实现一个AI大模型当前都无法正确实现的基础二叉树读取算法

概述 图1: 图2: 上图帮大家温习完全二叉树的概念&#xff0c;本文讲的是完全顺序二叉树的初始化 华为的员工、考过华为OD的员工、参加过其他类似大厂的考试的员工一般做过二叉树的初始化&#xff0c;甚至有些还碰到过手撕代码时面试官要求做二叉树遍历&#xff0c;看完本文的…

【攻防篇】阿里云服务器中 如何关闭docker api端口

在阿里云服务器&#xff08;ECS&#xff09;上&#xff0c;Docker API 默认监听 2375&#xff08;非加密&#xff09;和 2376&#xff08;TLS加密&#xff09;端口。如果未正确配置&#xff0c;可能被恶意利用&#xff08;如挖矿攻击&#xff09;。以下是关闭和加固 Docker API…

暑假复习篇之类与对象

面向对象&#xff1a;①类与对象②封装③继承④接口 类与对象&#xff1a; 概念&#xff1a;类就是类别的意思 用class表示 / 面向对象编程&#xff0c;万物皆可编程&#xff0c;在程序中表示一个事物时&#xff0c;往往因为事物的复杂程度导致编程的代码非常复杂 【基本数…

RabbitMQ RPC模式Python示例

文章目录 1.服务端2.客户端3.调用结果 1.服务端 #!/usr/bin/env python3 # -*- coding: UTF-8 -*- """ File: rabbitmq_server.py Date: 2025/6/26 10:42 Author: xxx Description: 1. RabbitMQ服务端&#xff0c;支持多节点命令执行 2. 作为被控…

Rust代码规范之蛇形命名法和驼峰命名法

Rust 使用两种主要的命名风格&#xff1a;驼峰命名法&#xff08;UpperCamelCase&#xff09;和蛇形命名法&#xff08;snake_case&#xff09;。通常&#xff0c;类型&#xff08;如结构体、枚举、特征&#xff09;使用驼峰命名法&#xff0c;而变量、函数、方法等使用蛇形命名…

编写CSS的格式

1、内联样式的css import React, { PureComponent } from reactexport class App extends PureComponent {constructor() {super()this.state {fs: 20}}render() {const { fs } this.statereturn (<div><p style{{ color: red, fontSize: ${fs}px }}>哈哈哈哈哈…

Redis—主从复制

引言 Redis的应用还得是在分布式系统当中。在分布式系统中&#xff0c;涉及到一个非常关键的问题&#xff0c;就是单点问题。例如&#xff0c;如果某个服务器程序&#xff0c;只有一个节点&#xff08;只搞了一个物理服务器&#xff0c;来部署这个服务器程序&#xff09;&…

【网络安全】从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark 实战

从IP头部看网络通信&#xff1a;IPv4、IPv6与抓包工具 Wireshark实战 在网络安全分析和数据通信的世界中&#xff0c;一切都始于“数据包”。数据包是网络上传输的基本单位&#xff0c;而数据包的结构与内容&#xff0c;正是我们理解网络行为的核心。本文将带你深入了解 IP 协…

IPv4网络地址分类

目录 一、核心分类标准 二、详细范围与主机数量 1. A类网络&#xff08;超大规模网络&#xff09; 2. B类网络&#xff08;中大型网络&#xff09; 3. C类网络&#xff08;小型网络&#xff09; 三、三类网络对比表 四、保留地址说明 五、现代网络中的变化 六、主机数…

Qt:QCustomPlot库简介

QCustomPlot 是一个基于 Qt 框架的轻量级 C 绘图库&#xff0c;专为高效绘制二维图表&#xff08;如曲线图、柱状图、金融图表等&#xff09;而设计。相比 Qt Charts 模块&#xff0c;它以 高性能 和 高度可定制性 著称&#xff0c;尤其适合需要实时数据可视化的科学计算、工业…

【云桌面容器KasmVNC】如何关闭SSL使用HTTP

1 缘起 根据实际的诉求,调整实现方式。 为用户提供云浏览器(通过浏览器访问远程浏览器),多用户的每个任务提供资源隔离的云浏览器。 该功能,由同事祥嵩曾调研与开发,使用KasmVNC实现功能,非常佩服祥嵩,无论是技术广度还是技术深度都是杠杠滴,无可挑剔。 实际的诉求是…

跟着AI学习C#之项目实战-电商平台 Day5

&#x1f4c5; Day 5&#xff1a;订单提交与支付模拟 ✅ 今日目标&#xff1a; 创建 Order 和 OrderItem 模型实现从购物车生成订单的功能模拟支付流程&#xff08;成功/失败页面&#xff09;添加订单状态跟踪&#xff08;如“待付款”、“已发货”等&#xff09;提交 Git 版…

复杂驱动开发-TLE9471的休眠流程与定时唤醒

文章目录 前言休眠流程定时唤醒功能总结 前言 开发SBC时非常重要的一环就是开发休眠流程&#xff0c;其目的是为了保证接KL30的ECU在休眠模式下尽可能小的消耗低压蓄电池的电量&#xff0c;防止车辆放置长时间后出现亏电。而定时唤醒功能在部分ECU中会有需求休眠后定期对车辆状…

Spark 之 Reuse

src/main/scala/org/apache/spark/sql/execution/reuse/ReuseExchangeAndSubquery.scala case object ReuseExchangeAndSubquery extends Rule[SparkPlan] {def apply(plan: SparkPlan): SparkPlan = {if (conf.exchan

Solidity学习 - 错误处理

文章目录 前言EVM错误处理机制EVM错误处理的核心特性程序中的错误处理 错误抛出方法require()函数require()触发异常的场景关键特性 assert()函数assert()触发异常的场景关键特性 require() vs assert()&#xff1a;选择指南revert()函数关键特性 异常捕获&#xff1a;try/catc…