let text1 = "MoonBit is an end-to-end build tool and programming language system for WebAssembly"
let text2 = "MoonBit is an end-to-end build tool and programming language system for WebAssembly targets"
let hasher = @minhash.MinHasher::new(64, 42UL)
let sig1 = hasher.compute_text(text1)
let sig2 = hasher.compute_text(text2)
let sim = @minhash.jaccard_similarity(sig1, sig2)
println("Estimated Jaccard Similarity: " + sim.to_string())
2. LSH 索引构建与候选查询
// 自动调优得到 (b=16, r=4) 分桶配置
let lsh = @lsh.LSHIndex::new(16, 4)
lsh.insert("doc_1", sig1)
lsh.insert("doc_2", sig2)
let matches = lsh.query_similar(sig1, 0.5)
for i = 0; i < matches.length(); i = i + 1 {
let item = matches[i]
println("Found match: " + item.0 + ", sim: " + item.1.to_string())
}
moon-minhash 🚀
📖 项目简介
在海量网页抓取、新闻聚合、日志分析与文档数据库中,判断海量文档之间的海姆/Jaccard 相似度是一项计算密集型任务。传统 O(N2) 两两比对算法在大规模数据集下不可行。
moon-minhash为 MoonBit 生态提供了一套完整的文本近似相似度计算与海量数据去重解决方案。通过将高维集合降维映射为低维 MinHash 签名,结合 LSH (局部敏感哈希) 的 b×r 分桶策略,实现亚线性 O(1) 或 O(K) 级候选检索与重复文档过滤。🌟 核心特性
**分词与 Chunking (
src/tokenizer)**:**高性能非密码学哈希族 (
src/hash)**:**MinHash 签名计算与相似度估计 (
src/minhash)**:**局部敏感哈希索引 (
src/lsh)**:**签名压缩与基数估计 (
src/compress)**:**分片索引与合并引擎 (
src/shard)**:ShardManager) 与动态路由。merge_shards分片合并算法,适合分布式与大内存场景。**流式去重与图聚类引擎 (
src/dedup)**:**文本相似度度量矩阵 (
src/similarity)**:**CLI 交互工具与 Benchmark (
src/cli,src/bench)**:🧮 数学原理
1. Jaccard 相似度与 MinHash 理论
对于两个集合 A,B,其 Jaccard 相似度定义为:
J(A,B)=∣A∪B∣∣A∩B∣
使用 k 个独立的哈希函数 h1,h2,…,hk,定义 MinHash 签名 hmin(A)=minx∈Ah(x)。对于任意独立哈希函数 h:
P[hmin(A)=hmin(B)]=J(A,B)
通过 k 维签名槽位相同比例 k∑i=1kI(hi,min(A)=hi,min(B)),可以作为 J(A,B) 的无偏估计。
2. LSH 概率 S 曲线
将长度为 k 的 MinHash 签名划分为 b 个 Band,每个 Band 包含 r 个哈希值 (k=b×r)。对于 Jaccard 相似度为 s 的两份文档,它们在至少一个 Band 内完全匹配的概率为:
P(s)=1−(1−sr)b
S 曲线在 s∗=(1/b)1/r 处呈现极陡峭的 S 形跃迁,使得相似度大于 s∗ 的文档对以极高概率召回,而不相似文档对被高效过滤。
📁 目录结构
⚡ 快速开始与使用示例
1. 签名计算与相似度估计
2. LSH 索引构建与候选查询
3. 流式与批量文档去重
🛠️ 构建与测试说明
本项目要求最新版 MoonBit 工具链 (0.10.4 / 2026 版本):
📊 代码规模与来源说明
hash,tokenizer,minhash,lsh,compress,similarity,shard,dedup,cli,bench)为 100% 原生原创 MoonBit 实现,未依赖任何第三方 C/Rust 动态库或外部生成代码。src/下手写.mbt文件):.mbt源文件总数:40 个.mbt源码行数:4,100 行(含测试)📄 开源许可证
本项目采用 Apache-2.0 License 协议开源。