simhash文本查重
时间: 2025-01-15 14:35:31 浏览: 52
### 使用SimHash算法实现文本相似度检测和查重
#### 文本预处理
为了有效利用SimHash算法进行文本查重,需先对输入文本执行一系列预处理操作。这包括去除停用词、标点符号以及HTML标签等内容,仅保留有意义的词汇[^1]。
#### 分词与特征提取
采用自定义分词器将经过清理后的文档分割成单词序列。对于中文环境而言,可借助Jieba等工具完成精准切分工作;英文则可以直接按照空格拆解句子结构。随后计算各词语的重要性权重,通常会运用到TF-IDF模型来衡量单个词项在整个语料库中的相对重要程度。
```python
import jieba.analyse as analyse
from sklearn.feature_extraction.text import TfidfVectorizer
def preprocess(text):
# 去除无关字符并转换为小写形式
cleaned_text = ''.join([char.lower() for char in text if '\u4e00' <= char <= '\u9fff'])
# 提取关键词及其tf-idf得分
tfidf_vectorizer = TfidfVectorizer(tokenizer=analyse.extract_tags, max_features=None)
weights = tfidf_vectorizer.fit_transform([cleaned_text]).toarray()[0]
return dict(zip(tfidf_vectorizer.get_feature_names_out(), weights))
```
#### 构建哈希向量
基于上述得到的关键字列表及对应分数构建初始指纹数组——即长度固定为64位(或其他指定大小)的整数型列表。遍历每一个词条,依据其关联数值决定是否对该位置设置标记值(正负号取决于当前累加结果)。最终获得代表整个文件特性的紧凑编码字符串[^2]。
```python
import numpy as np
def create_hash(features_dict):
vector_size = 64
hash_vector = np.zeros(vector_size)
for term, weight in features_dict.items():
hashed_value = hash(term) % vector_size
if weight >= 0:
hash_vector[hashed_value] += abs(weight)
else:
hash_vector[hashed_value] -= abs(weight)
simhash_str = ''.join(['1' if bit > 0 else '0' for bit in hash_vector])
return int(simhash_str, base=2), bin(int(simhash_str, base=2))[2:].zfill(64).replace('b', '')
```
#### 计算汉明距离判定相似性
当两份材料被转化为各自的SimHash值之后,可通过简单地统计两者间不同比特的数量(即所谓的“汉明距离”)评估它们之间的接近水平。一般情况下,如果两个simhash码之间仅有少量差异,则说明原文档很可能存在重复现象。
```python
def hamming_distance(hash_a, hash_b):
xor_result = hash_a ^ hash_b
distance = sum((xor_result >> i) & 1 for i in range(len(bin(xor_result)) - 2))
return distance / len(bin(max(hash_a, hash_b))) * 100
```
阅读全文
相关推荐

















