文档去重(TF-IDF,MinHash, SimHash)

news2024/9/23 3:11:44

2个doc有些相似有些不相似,如何衡量这个相似度;

直接用Jaccard距离,计算量太大

TF-IDF: TF*IDF

TF:该词在该文档中的出现次数,

IDF:该词在所有文档中的多少个文档出现是DF,lg(N/(1+DF))

MinHash

代码:

import random
from typing import List, Set, Tuple

class MinHash:
    def __init__(self, num_hashes: int = 100):
        self.num_hashes = num_hashes
        self.hash_functions = self._generate_hash_functions()

    def _generate_hash_functions(self) -> List[Tuple[int, int, int]]:
        """Generate hash functions of the form (a*x + b) % c."""
        max_prime = 2**31 - 1  # Mersenne prime
        return [(random.randint(1, max_prime), random.randint(0, max_prime), max_prime)
                for _ in range(self.num_hashes)]

    def _minhash(self, document: Set[str]) -> List[int]:
        """Compute MinHash signature for a document."""
        signature = [float('inf')] * self.num_hashes
        for word in document:
            for i, (a, b, c) in enumerate(self.hash_functions):
                hash_value = (a * hash(word) + b) % c
                signature[i] = min(signature[i], hash_value)
        return signature

    def jaccard_similarity(self, sig1: List[int], sig2: List[int]) -> float:
        """Estimate Jaccard similarity from MinHash signatures."""
        return sum(s1 == s2 for s1, s2 in zip(sig1, sig2)) / self.num_hashes

    def deduplicate(self, documents: List[str], threshold: float = 0.5) -> List[str]:
        """Deduplicate documents based on MinHash similarity."""
        # Preprocess documents into sets of words
        doc_sets = [set(doc.lower().split()) for doc in documents]
        
        # Compute MinHash signatures for all documents
        signatures = [self._minhash(doc_set) for doc_set in doc_sets]
        
        # Find unique documents
        unique_docs = []
        for i, doc in enumerate(documents):
            is_duplicate = False
            for j in range(len(unique_docs)):
                if self.jaccard_similarity(signatures[i], signatures[j]) >= threshold:
                    is_duplicate = True
                    break
            if not is_duplicate:
                unique_docs.append(doc)
        
        return unique_docs

100个hash函数;

在某个hash函数上,1个doc里的所有word,在该函数上的hash值,其中最小的那个,记下来;

该doc得到100个最小hash值,该100维向量,作为其signature;

2个doc的相似度,就是100个维度里的相等数目,除以100;

SimHash

MinHash和SimHash_minhash simhash-CSDN博客

海量文本去重(允许一定的噪声);文档里权重最大的前N个词(或词组)进行Hash编码,1正0负乘以词的权重,N个词的向量按位相加,再反编码(正1负0),得到该文档的编码;两篇文档的距离用编码的海明距离,小于Bar(例如3)则认为二者相似;

import hashlib
from typing import List, Tuple

class SimHash:
    def __init__(self, hash_bits: int = 64):
        self.hash_bits = hash_bits

    def _string_hash(self, text: str) -> int:
        """Create a hash for a given string."""
        return int(hashlib.md5(text.encode('utf-8')).hexdigest(), 16)

    def _create_shingles(self, text: str, k: int = 2) -> List[str]:
        """Create k-shingles from the text."""
        return [text[i:i+k] for i in range(len(text) - k + 1)]

    def _compute_simhash(self, features: List[str]) -> int:
        """Compute the SimHash of a list of features."""
        v = [0] * self.hash_bits
        
        for feature in features:
            feature_hash = self._string_hash(feature)
            for i in range(self.hash_bits):
                bitmask = 1 << i
                if feature_hash & bitmask:
                    v[i] += 1
                else:
                    v[i] -= 1
        
        fingerprint = 0
        for i in range(self.hash_bits):
            if v[i] >= 0:
                fingerprint |= 1 << i
        
        return fingerprint

    def _hamming_distance(self, hash1: int, hash2: int) -> int:
        """Compute the Hamming distance between two hashes."""
        xor = hash1 ^ hash2
        return bin(xor).count('1')

    def compute_similarity(self, hash1: int, hash2: int) -> float:
        """Compute the similarity between two SimHashes."""
        distance = self._hamming_distance(hash1, hash2)
        return 1 - (distance / self.hash_bits)

    def deduplicate(self, documents: List[str], threshold: float = 0.9) -> List[Tuple[str, int]]:
        """Deduplicate documents based on SimHash similarity."""
        unique_docs = []
        
        for doc in documents:
            shingles = self._create_shingles(doc.lower())
            doc_hash = self._compute_simhash(shingles)
            
            is_duplicate = False
            for unique_doc, unique_hash in unique_docs:
                if self.compute_similarity(doc_hash, unique_hash) >= threshold:
                    is_duplicate = True
                    break
            
            if not is_duplicate:
                unique_docs.append((doc, doc_hash))
        
        return unique_docs

# Example usage
if __name__ == "__main__":
    simhash = SimHash(hash_bits=64)
    
    documents = [
        "The quick brown fox jumps over the lazy dog",
        "The quick brown fox jumps over the sleeping dog",
        "The lazy dog is sleeping",
        "A completely different document"
    ]
    
    unique_docs = simhash.deduplicate(documents, threshold=0.7)
    
    print("Original documents:")
    for doc in documents:
        print(f"- {doc}")
    
    print("\nUnique documents:")
    for doc, _ in unique_docs:
        print(f"- {doc}")

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用级数公式计算圆周率(π)

π是是指圆的周长与直径的比值&#xff0c;是无限不循环小数&#xff0c;有很多种方法可以求得它的近似值。这里用比较容易实现的关于π的无穷级数来求它的前10000位的取值。 π / 2 π 具体的&#xff0c;用两个字符数组x,z分别存放当前计算得到的pi值&#xff0c;数组…

Android面试题自定义View之Window、ViewRootImpl和View的三大流程

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 View的三大流程指的是measure(测量)、layout(布局)、draw(绘制)。 下面我们来分别看看这三大流程 View的measure(测量) MeasureSpec Measur…

前后端的导入、导出、模板下载等写法

导入&#xff0c;导出、模板下载等的前后端写法 文章目录 导入&#xff0c;导出、模板下载等的前后端写法一、导入实现1.1 后端的导入1.2 前端的导入 二、基础的模板下载2.1 后端的模板下载-若依基础版本2.2 前端的模板下载2.3 后端的模板下载 - 基于资源文件读取2.4 excel制作…

CTFShow的RE题(二)

逆向5 附件无后缀&#xff0c;查一下是zip&#xff0c;解压得到一个exe一个dll文件。 往下继续看 但也根进去看看 发现是在加载的dll文件 还有一个返回时调用的函数 发现是打印函数 根据以往的经验应该是要跳转到这里&#xff0c;动调一下。 发现exe链接了dll&#xff0c;…

R语言4.3.0保姆级安装教程,包含安装包

[软件名称]&#xff1a;R语言4.3.0 R是用于统计分析、绘图的语言和操作环境。R是属于GNU系统的一个自由、免费、源代码开放的软件&#xff0c;它是一个用于统计计算和统计制图的优秀工具。 获取链接: https://pan.quark.cn/s/180306f47179 安装步骤: 1.解压压缩包。 2.进入…

python如何设计窗口

PyQt是一个基于Qt的接口包&#xff0c;可以直接拖拽控件设计UI界面&#xff0c;下面我简单介绍一下这个包的安装和使用&#xff0c;感兴趣的朋友可以自己尝试一下&#xff1a; 1、首先&#xff0c;安装PyQt模块&#xff0c;这个直接在cmd窗口输入命令“pip install pyqt5”就行…

24.6.30

星期一&#xff1a; 补cf global round26 D cf传送门 思路&#xff1a;把s中非a字符存下来&#xff0c;共m个&#xff0c;然后暴力检测&#xff0c;复杂度有点迷 代码如下&#xff1a; ll n;void solve(){string s; cin &…

【Python基础篇】你了解python中运算符吗

文章目录 1. 算数运算符1.1 //整除1.2 %取模1.3 **幂 2. 赋值运算符3. 位运算符3.1 &&#xff08;按位与&#xff09;3.2 |&#xff08;按位或&#xff09;3.3 ^&#xff08;按位异或&#xff09;3.4 ~&#xff08;按位取反&#xff09;3.5 <<&#xff08;左移&#…

SpringBoot新手快速入门系列教程一:window上编程环境安装和配置

首先编译器&#xff0c;建议各位不要去尝试AndroidStudio和VisualStudio来做SpringBoot项目。乖乖的直接下载最新版即可 https://www.jetbrains.com.cn/idea/ 当然这是一个收费的IDE&#xff0c;想要便宜可以想办法去某宝买授权&#xff0c;仅供学习参考用&#xff01;赚了钱…

AI老照片生成视频

地址&#xff1a;AI老照片 让你的图片动起来, 老照片修复与动态化

52-4 内网代理1 - 内网代理简介

一、正向连接 正向连接是指受控端主机监听一个端口,由控制端主机主动发起连接的过程。这种连接方式适用于受控主机拥有公网IP地址的情况。例如,在攻击者和受害者都具有公网IP的情况下,攻击者可以直接通过受害者的公网IP地址访问受害者主机,因此可以使用正向连接来建立控制通…

Linux进程(1)(结构-操作系统-进程)

目录 1.体系结构 2.操作系统&#xff08;Operator System&#xff09; 1&#xff09;概念&#xff1a; 2&#xff09;结构 示意图&#xff08;不完整&#xff09; 3&#xff09;尝试理解操作系统 4&#xff09;系统调用和库函数概念 3.认识进程 1.启动 2.进程创建的代码…

[单master节点k8s部署]20.监控系统构建(五)Alertmanager

prometheus将监控到的异常事件发送给Alertmanager&#xff0c;然后Alertmanager将报警信息发送到邮箱等设备。可以从下图看出&#xff0c;push alerts是由Prometheus发起的。 安装Alertmanager config文件 [rootmaster prometheus]# cat alertmanager-cm.yaml kind: ConfigMa…

小白必看!推荐三本高质量python书籍,让你直接原地起飞

Python是一种多功能语言。它经常用作Web应用程序的脚本语言&#xff0c;嵌入到软件产品中&#xff0c;以及人工智能和系统任务管理。它既简单又强大&#xff0c;非常适合初学者和专业程序员。 python的自学书籍非常多&#xff0c;涉及基础入门、web开发、机器学习、数据分析、…

C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例

C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例 文章目录 C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例1、概述2、实现效果3、主要代码4、源码地址 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 &#x1f448; 1、概述 支持多线程加…

2025湖北武汉智慧教育装备信息化展/智慧校园展/湖北高博会

2025武汉教育装备展,2025武汉智慧教育展,2025武汉智慧校园展,2025武汉教育信息化展,2025武汉智慧教室展,湖北智慧校园展,湖北智慧教室展,武汉教学设备展,湖北高教会,湖北高博会 2025湖北武汉智慧教育装备信息化展/智慧校园展/湖北高博会 2025第10届武汉国际教育装备及智慧校园…

uni-app组件 子组件onLoad、onReady事件无效

文章目录 导文解决方法 导文 突然发现在项目中&#xff0c;组件 子组件的onLoad、onReady事件无效 打印也出不来值 怎么处理呢&#xff1f; 解决方法 mounted() {console.log(onLoad, this.dateList);//有效// this.checkinDetails()},onReady() {console.log(onReady, this.da…

connect to github中personal access token生成token方法

一、问题 执行git push时弹出以下提示框 二、解决方法 去github官网生成Token&#xff0c;步骤如下 选择要授予此 令牌token 的 范围 或 权限 要使用 token 从命令行访问仓库&#xff0c;请选择 repo 。 要使用 token 从命令行删除仓库&#xff0c;请选择 delete_repo 其他根…

第9章 项目总结01:项目流程,每个模块的介绍

1 请介绍一下你的项目 学成在线项目是一个B2B2C的在线教育平台&#xff0c;本项目包括了用户端、机构端、运营端。 核心模块包括&#xff1a;内容管理、媒资管理、课程搜索、订单支付、选课管理、认证授权等。 下图是项目的功能模块图&#xff1a; 项目采用前后端分离的技…

使用Python绘制堆积柱形图

使用Python绘制堆积柱形图 堆积柱形图效果代码 堆积柱形图 堆积柱形图&#xff08;Stacked Bar Chart&#xff09;是一种数据可视化图表&#xff0c;用于显示不同类别的数值在某一变量上的累积情况。每一个柱状条显示多个子类别的数值&#xff0c;子类别的数值在柱状条上堆积在…