【python 走进NLP】simhash 算法计算两篇文章相似度

互联网网页存在大量的重复内容网页,无论对于搜索引擎的网页去重和过滤、新闻小说等内容网站的内容反盗版和追踪,还是社交媒体等文本去重和聚类,都需要对网页或者文本进行去重和过滤。最简单的文本相似性计算方法可以利用空间向量模型,计算分词后的文本的特征向量的相似性,这种方法存在效率的严重弊端,无法针对海量的文本进行两两的相似性判断。模仿生物学指纹的特点,对每个文本构造一个指纹,来作为该文本的标识,从形式上来看指纹一般为固定长度较短的字符串,相同指纹的文本可以认为是相同文本。

最简单的指纹构造方式就是计算文本的 md5 或者 sha 哈希值,除非输入相同的文本,否则会发生“雪崩效应”,极小的文本差异通过 md5 或者 sha计算出来的指纹就会不同(发生冲撞的概率极低),那么对于稍加改动的文本,计算出来的指纹也是不一样。因此,一个好的指纹应该具备如下特点:
1、指纹是确定性的,相同的文本的指纹是相同的;
2、 指纹越相似,文本相似性就越高;
3、 指纹生成和匹配效率高。

业界关于文本指纹去重的算法众多,如 k-shingle 算法、google 提出的simhash 算法、Minhash 算法、百度top k 最长句子签名算法等等。
下面介绍下simhash算法以及python应用

SimHash算法
simhash算法的主要思想是降维,将高维的特征向量映射成一个f-bit的指纹(fingerprint),通过比较两篇文章的f-bit指纹的Hamming Distance来确定文章是否重复或者高度近似。

主要分以下几步:

1、抽取文本中的关键词及其权重。

2、对关键词取传统hash,并与权重叠加,算出文本的fingerprint值。

3、计算出两个文本之间fingerprint值的海明距离。

python 前辈们早已实现该算法,我们安装相应的包即可。

pip install simhash

使用例子:

# -*- coding:utf-8 -*-
from simhash import Simhash
import re



def filter_html(html):
    """
    :param html: html
    :return: 返回去掉html的纯净文本
    """
    dr = re.compile(r'<[^>]+>',re.S)
    dd = dr.sub('',html).strip()
    return dd


# 求两篇文章相似度
def simhash_similarity(text1,text2):
    """
    :param tex1: 文本1
    :param text2: 文本2
    :return: 返回两篇文章的相似度
    """
    aa_simhash = Simhash(text1)
    bb_simhash = Simhash(text2)

    max_hashbit=max(len(bin(aa_simhash.value)), (len(bin(bb_simhash.value))))
    
    print(max_hashbit)

    # 汉明距离
    distince = aa_simhash.distance(bb_simhash)
    print(distince)

    similar=1-distince/max_hashbit


    return similar


if __name__ == '__main__':


    text1="simhash算法的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。"

    text2="simhash算法的主要思想是降维,将高维的特征向量映射成一个低维的特征向量,通过两个向量的Hamming Distance来确定文章是否重复或者高度近似。"

    similar=simhash_similarity(text1,text2)
    print(similar)




运行结果:

0b1110001100110011110000001000001110110100111000011010110110100101
0b1110001100110011110000001000001110110100111000011010110110100101
0
1.0

Process finished with exit code 0

你可能感兴趣的:(数据科学--机器学习)