1、nshash,他的原理就是对一篇文章的最长n句话分别计算hash值,作为该文章的n个指纹,两篇文章只要有一个指纹相同就认为这两篇文章相同,从而达到文章去重的目的。
github地址:https://github.com/chenghao00/nshash
示例代码:
#!/usr/local/python3/bin/python32、Simhash
# -*- coding: utf-8 -*
import sys
sys.path.append("/data/wwwroot/default/lib/python")
import nshash
nsh = nshash.NSHash(name='test', hashfunc='farmhash', hashdb='memory')
similar_id = nsh.get_similar("BFW是互联网技术培训学习开发交流一站式平台,秉承追求极致的用户开发体验,从技术入门培训及求职,到项目在线开发,再到项目管理11、代码托管、模板交易、代码部署33,bug测试33,体验从学习开发再到部署一站式服务。")
similar_id2 = nsh.get_similar("BFW是互联网技术培训学习开发交流一站式平台,秉承追求极致的用户开发体验,从技术入门培训及求职,到项目在线开发,再到项目管理、代码托管22、模板交易33、代码部署,bug测试,体验从学习开发再到部署一站式服务。")
if similar_id2==similar_id:
print("两者相似重复")
elif similar_id2!=similar_id:
print("两者不相似重复")
simhash核心思想就是,对文本进行分词,并统计词频(相当于权重),然后,进行对每个词进行hash操作,并将结果按二进制位乘以权重;然后将所有结果,按位相加,统计出文本的“指纹”。
此处以一个例子进行介绍更为形象:
假设,需要进行simhash的文本为:“我很想要打游戏,但是女朋友会生气!”;
首先,就是对文本进行分词操作,使用结巴分词的全分词模式,结果为:['我', '很', '想要', '打游戏', '游戏', '但是', '女朋友', '朋友', '会生', '生气'];
然后,进行词频统计,得到:{'会生': 1, '但是': 1, '女朋友': 1, '很': 1, '想要': 1, '我': 1, '打游戏': 1, '朋友': 1, '游戏': 1, '生气': 1};
然后,对以上每个词进行 HASH操作,比如md5,比如,'会生'的md5是 f3ab426bf0c05aa49cd0903c31adcb38,然后,以二进制位的方式,进行处理,如果 bit == 1,则 为 1x1;如果,bit == 0,则 为-1x1;
计算完,每一个词之后,将所有的结果按位相加,并生成唯一的HASH,结果为:1459185014329402212;
示例代码:
#!/usr/local/python3/bin/python33、Word2Vec训练词向量,通过jieba对文章内容进行分词训练模型,最后再调用similarity方法来判断相似性。
# -*- coding: utf-8 -*
from simhash import Simhash
def simhash_similarity(text1, text2):
"""
:param text1: 文本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))))
# 汉明距离
distince = aa_simhash.distance(bb_simhash)
similar = 1 - distince / max_hashbit
return similar
if __name__ == '__main__':
print(simhash_similarity('在历史上有著许多数学发现', '在历史上有著许多科学发现'))
示例代码:
#!/usr/local/python3/bin/python34、人工智能训练自己的模型识别文章是否雷同及相似。
# -*- coding: utf-8 -*
import jieba
from gensim.models import word2vec
import logging
#分词
f1 =open("/data/wwwroot/default/asset/fenci.txt",encoding = 'utf-8')
f2 =open("fenci_result.txt", 'a',encoding = 'utf-8')
lines =f1.readlines() # 读取全部内容
for line in lines:
line.replace('\t', '').replace('\n', '').replace(' ','')
seg_list = jieba.cut(line, cut_all=False)
f2.write(" ".join(seg_list))
f1.close()
f2.close()
# 主程序
logging.basicConfig(format='%(asctime)s:%(levelname)s: %(message)s', level=logging.INFO)
sentences =word2vec.Text8Corpus(u"fenci_result.txt") # 加载语料
model =word2vec.Word2Vec(sentences) #训练skip-gram模型,默认window=5
# 计算两个词的相似度/相关程度
try:
y1 = model.wv.similarity(u"中方", u"中国")
except KeyError:
y1 = 0
print(u"【中方】和【中国】的相似度为:", y1)
print("-----\n")
网友回复