rsemantic
Ruby实现的文档向量语义搜索工具,支持TF-IDF和LSA两种矩阵变换
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Ruby实现的文档向量语义搜索工具,支持TF-IDF和LSA两种矩阵变换
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你有没有过这样的经历?在搜索引擎里输入"电脑太卡了怎么办",却只得到一堆"电脑配置参数"的页面;搜索"苹果怎么吃不胖",出来的全是"苹果公司股价"。明明说的都是人话,机器却像在玩文字接龙——这就是传统关键词匹配的致命局限:它只认字,不认意思。
RSemantic 解决的就是这个问题。它是一个 Ruby 语言实现的文档向量搜索引擎,核心理念是把自然语言文本翻译成"数字坐标",让计算机真正理解词语之间的语义关系。无论你说"手机发热严重"还是"设备温度过高",RSemantic 都能知道这两句话在讨论同一件事。
这个项目由独立开发者 Joseph Wilk 创建,采用 MIT 许可证开源,托管在 GitHub 上,至今已积累 149 颗星和 25 个 Fork。虽然项目最后一次更新是 2025 年 10 月,但它代表的 LSA(潜在语义分析) 和 TF-IDF 技术至今仍是 NLP 领域的重要基石。
RSemantic 的底层模型是经典的 向量空间模型(Vector Space Model)。它的核心思想是:把每个文档表示为一个向量,向量的每个维度对应一个词汇,值则是该词在文档中的权重。
这套模型的关键在于:含义相似的文档,它们的向量也会"靠近"。"深度学习"和"机器学习"虽然字面重叠不多,但在向量空间中位置接近,所以计算相似度时会被识别为相关。
RSemantic 使用 TF-IDF(词频-逆文档频率) 来区分重要词和常见词:
# RSemantic lib/rsemantic/transform/tf_idf_transform.rb 核心逻辑
term_frequency = Math.sqrt(term_weight)
inverse_document_frequency = 1 + GSL::Sf.log(number_of_documents / (number_of_documents_with_term(row_index, matrix).to_f + 1))
matrix[row_index, column_index] = term_frequency * inverse_document_frequency
Math.sqrt 对词频做平方根平滑,避免高频词权重过大;GSL::Sf.log 保证 IDF 对数值计算精确。
LSA(潜在语义分析) 的核心武器是 奇异值分解(SVD)。RSemantic 用 GSL::Matrix.SV_decomp_mod 执行 SVD 分解:
# lib/rsemantic/transform/lsa_transform.rb
matrix.size1 < matrix.size2 ? (u, v, sigma = matrix.transpose.SV_decomp_mod) : (u, v, sigma = matrix.SV_decomp_mod)
sigma = GSL::Matrix.diagonal(sigma)
GSL::Matrix.swap(matrix, u * sigma * v.transpose)
截断小奇异值的数学效果是:强制将高维稀疏矩阵压缩到低维稠密空间,同义词、多义词之间的语义关系被"蒸馏"到向量的几何距离中。
RSemantic 的代码结构体现了良好的面向对象设计思想:
| 模块 | 文件 | 职责 |
|---|---|---|
Corpus | lib/rsemantic/corpus.rb | 语料库管理,添加文档、构建索引、搜索 |
Search | lib/rsemantic/search.rb | 搜索引擎,封装向量空间模型和变换流程 |
VectorSpace::Builder | lib/rsemantic/vector_space/builder.rb | 构建文档-词项矩阵,生成向量 |
Transform::TFIDF | lib/rsemantic/transform/tf_idf_transform.rb | TF-IDF 矩阵变换 |
Transform::LSA | lib/rsemantic/transform/lsa_transform.rb | LSA/SVD 降维变换 |
Compare | lib/rsemantic/compare.rb | 计算向量相似度 |
数据流遵循 Corpus → Builder → TFIDF/LSA Transform → Search → Result 的管道模式,每个步骤都是可插拔的变换。这种设计使得后续扩展新的矩阵变换(如 LDA、NMF)极为容易——只需新增一个 Transform 类即可。
安装 RSemantic 需要先搞定 GSL(GNU Scientific Library)——这是整个项目最大的门槛。
# macOS 安装 GSL
brew install gsl
# 安装 RSemantic gem
gem install rsemantic
虽然项目提供了 fast-stemmer 对英文做词干提取和 19 种语言的停用词过滤(resources/ 目录下),但文档中提到对中文支持有限——主要是因为中文分词不依赖空格切分,项目的 Parser 对中文的处理需要额外适配。
不过,RSemantic 的数学原理至今仍不过时。2013 年 Word2Vec、2018 年的 BERT,都深受 LSA 时代积累的分布式语义假说的启发。从这个角度看,RSemantic 是理解现代 NLP 的绝佳入门级项目。
RSemantic 是一个纯 Ruby 实现的轻量级语义搜索库,核心技术是 TF-IDF 加权和 LSA 降维,通过 SVD 分解将文档映射到低维语义空间,从而实现超越关键词匹配的语义相似度计算。
| 维度 | 评分 | 说明 |
|---|---|---|
| 技术深度 | ⭐⭐⭐⭐ | LSA/SVD 实现严谨,数学推导完整 |
| 工程成熟度 | ⭐⭐ | 依赖 GSL 门槛高,无容器化,无活跃 CI 维护 |
| 文档质量 | ⭐⭐⭐ | README 清晰,代码有注释,但无 Wiki 更新 |
| 活跃度 | ⭐ | 2025 年后无实质更新 |
| 实用性 | ⭐⭐⭐ | 适合教学和小规模语料库搜索 |
对于想深入理解 向量空间模型 + 语义分析 原理的 Ruby 开发者,RSemantic 仍是一个值得研读的经典项目。但对于生产环境需求,更推荐使用支持 BERT/Sentence-BERT 的现代向量数据库(如 Qdrant、Milvus、Chroma)。