simhash php实现
SimHash PHP 实现
SimHash 是一种用于文本相似度计算的算法,特别适用于大规模文档去重。以下是 PHP 实现 SimHash 的步骤和代码示例。
分词处理
对输入文本进行分词处理,可以使用简单的空格分割或更复杂的分词库。以下是基于空格分割的简单实现:

function tokenize($text) {
return preg_split('/\s+/', strtolower($text));
}
计算哈希值
为每个分词生成哈希值(例如使用 MD5 或 SHA1),并转换为二进制字符串:
function getHash($token) {
return md5($token);
}
function hashToBinary($hash) {
$binary = '';
for ($i = 0; $i < strlen($hash); $i++) {
$binary .= str_pad(decbin(hexdec($hash[$i])), 4, '0', STR_PAD_LEFT);
}
return $binary;
}
加权处理
为每个分词的二进制哈希值分配权重(例如词频或 TF-IDF),并累加权重:

function computeWeightedVector($tokens) {
$vector = array_fill(0, 128, 0); // 假设使用 128 位哈希
$tokenCounts = array_count_values($tokens);
foreach ($tokenCounts as $token => $count) {
$hash = hashToBinary(getHash($token));
for ($i = 0; $i < strlen($hash); $i++) {
$bit = $hash[$i] == '1' ? 1 : -1;
$vector[$i] += $bit * $count;
}
}
return $vector;
}
生成 SimHash
将加权后的向量转换为最终的 SimHash 字符串:
function generateSimHash($weightedVector) {
$simHash = '';
foreach ($weightedVector as $value) {
$simHash .= $value > 0 ? '1' : '0';
}
return $simHash;
}
计算汉明距离
比较两个 SimHash 的相似度,通过汉明距离实现:
function hammingDistance($hash1, $hash2) {
$distance = 0;
for ($i = 0; $i < strlen($hash1); $i++) {
if ($hash1[$i] != $hash2[$i]) {
$distance++;
}
}
return $distance;
}
完整示例
$text1 = "This is a sample text for SimHash";
$text2 = "This is another sample text for testing";
$tokens1 = tokenize($text1);
$tokens2 = tokenize($text2);
$vector1 = computeWeightedVector($tokens1);
$vector2 = computeWeightedVector($tokens2);
$simHash1 = generateSimHash($vector1);
$simHash2 = generateSimHash($vector2);
$distance = hammingDistance($simHash1, $simHash2);
echo "Hamming Distance: $distance";
优化建议
- 使用更高效的分词库(如 Jieba-PHP 中文分词)。
- 调整哈希位数(如 64 位)以平衡精度和性能。
- 对长文本分块处理,避免向量维度爆炸。
以上实现适用于基础场景,实际应用中需根据数据规模和需求调整参数。






