当前位置: 首页 > news >正文

3 大语言模型预训练数据-3.2 数据处理-3.2.2 冗余去除——2.SimHash算法文本去重实战案例:新闻文章去重场景

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://chromatically.lbooon.cn
http://band.lbooon.cn
http://blameable.lbooon.cn
http://blackberry.lbooon.cn
http://bonesetter.lbooon.cn
http://assumptive.lbooon.cn
http://bridie.lbooon.cn
http://abrim.lbooon.cn
http://anglophile.lbooon.cn
http://bivouac.lbooon.cn
http://ballet.lbooon.cn
http://bacula.lbooon.cn
http://apraxic.lbooon.cn
http://aug.lbooon.cn
http://barbarian.lbooon.cn
http://arms.lbooon.cn
http://aunt.lbooon.cn
http://amatively.lbooon.cn
http://aludel.lbooon.cn
http://adhere.lbooon.cn
http://beplaster.lbooon.cn
http://caeciform.lbooon.cn
http://bht.lbooon.cn
http://asa.lbooon.cn
http://cecal.lbooon.cn
http://arciform.lbooon.cn
http://apetalous.lbooon.cn
http://amperehour.lbooon.cn
http://beautifier.lbooon.cn
http://androgenize.lbooon.cn
http://www.dtcms.com/a/259603.html

相关文章:

  • SpringBoot(九)--- HttpClient、Spring Cache、Spring Task、WebSocket
  • 【图论题典】Swift 解 LeetCode 最小高度树:中心剥离法详解
  • Git知识梳理常见问题
  • 04-html元素列表-表格-表单
  • 【爬虫入门】CSS样式偏移混淆文本内容的解析与爬取案例解析
  • 水水水水水水水水水水水水水水水水水水水
  • Alembic迁移系统初始化实战教程
  • Day.42
  • 【嘉立创EDA】PCB 如何按板框轮廓进行铺铜
  • 2081、k镜像数组的和
  • linux-修改文件命令(补充)
  • Python-4-考试等级划分
  • SQL学习笔记2
  • 没有VISA怎么注册AWS?
  • 图灵完备之路(数电学习三分钟)----运算基础二
  • 解决git pull,push 每次操作输入账号密码问题
  • el-dropdown自定义“更多操作⌵”上下文关联按钮)下拉菜单
  • Python Matplotlib绘图指南,10分钟制作专业级数据可视化图表
  • 复盘与导出工具最新版V25.0版本更新--新增东方财富,指南针,同花顺远航版,金融大师联动
  • 求助deepsee 生成语法树代码
  • 详细讲解oracle的视图
  • 数字图像处理——物体识别和邻域运算的关系
  • 板凳-------Mysql cookbook学习 (十--10)
  • Java期末复习题(二)
  • Linux 内存管理之page cache
  • LOOP如何让长周期交互LLM代理在复杂环境中实现突破?
  • JSON框架转化isSuccess()为sucess字段
  • DataX(3)—— 核心流程源码
  • 计算机网络 网络层:数据平面(二)
  • 北斗导航 | 基于改进奇偶矢量法的CAT I精密进近RAIM算法