欢迎访问我的新博客: 传送门
一、参考资料
使用SimHash进行海量文本去重 by Poll的笔记
-
simhash主要流程是:
- 分词
- 加权
- 合并
- 降维
-
去重的主要思想是:
- 仿照hashmap的思想重构一个适合simhash的数据结构
- 将64bit位hash分割成多段,例如4段16位,每段作为一个map_key,并使用链表作为map_value, 存储文本hash值
接下来针对一个实例需求来具体实现。
二、实例
实例场景
-
当前有五千万文本数据存储在mongoDB中,里面有许多重复或者大面积相似的文本,现在需要进行去重。(大面积相似的文本也需要去掉)
-
利用simhash解决这个问题刚好, 我主要使用了jieba分词和TF-IDF进行关键词提取并加权,然后利用dict和list自己构建一个符合simhash特点的hashmap.
-
jieba分词使用参考资料:
Python的jieba分词及TF-IDF和TextRank 算法提取关键字
实例代码
- simhash
# -*- coding: utf-8 -*-
from jieba import lcut, analyse
def count_diff_str(str1, str2):
res = 0
for i in range(min(len(str1),len(str2))):
if str1[i] != str2[i]:
res += 1
return res
def count_diff_int(value1, value2):
res = 0
value = value1 ^ value2
x = 1
for i in range(64):
if x & value != 0:
res += 1
x <<= 1
return res
def simhash_(sentence):
keywords = analyse.extract_tags(sentence, topK=30, withWeight=True)
value_list = [0 for i in range(64)]
for item