ngram2vec
支持子词级和词级嵌入的统一框架,让词向量训练更灵活高效
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
支持子词级和词级嵌入的统一框架,让词向量训练更灵活高效
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
如果你曾用 word2vec 训练过中文词向量,可能会遇到这样的困惑:"机器学习"作为一个整体被拆开之后,"机"、"器"、"学"、"习"各自变成了孤立的符号,相较于英文 subword(子词)方法如 BPE,word2vec 的全词切分在处理中文时显得力不从心。而 Ngram2vec 正是为解决这一痛点而生——它让词向量训练框架支持任意粒度的上下文特征,让子词级别的语义表示成为可能。
Ngram2vec 起源于 2017 年 EMNLP 的一篇论文——Ngram2vec: Learning Improved Word Representations from Ngram Co-occurrence Statistics,由中国人民大学(赵哲、刘淘、李申、杜晓勇)和北京师范大学的研究者共同完成。论文指出,传统的词向量方法(如 word2vec)仅基于词级别的共现统计,忽略了语言中大量存在的 n-gram 短语和子词结构信息——比如"深度"+"学习"="深度学习",或者"未"+"知"="未知",这种组合往往携带独立的语义。
该论文的核心贡献是提出了基于 N-gram 共现统计的词向量学习框架,并通过实验证明:引入 n-gram 上下文特征后,多种词向量方法(SGNS、GloVe、PPMI+SVD)在词相似度和类比推理任务上均有显著提升。项目作者 Zhe Zhao(赵哲)随后开源了完整工具包,并基于该框架构建了著名的 Chinese-Word-Vectors 项目,提供了超过 100 种预训练中文词向量。
Ngram2vec 的最大亮点在于其解耦(decoupled)架构设计,将词向量训练流程拆分为多个独立模块:
图1:Ngram2vec 的完整工作流(语料 → 词表 → 词对 → 共现矩阵 → PPMI → 向量)
整个流水线分为 6 个阶段,每个阶段输出中间结果到磁盘,可独立复用:
阶段 1:语料处理(corpus2vocab.py)
对原始语料进行分词和词频统计,构建词汇表。词表按频率排序,支持自定义最小词频阈值,控制词表大小。中文语料需提前分词(推荐 jieba),英文语料可直接使用。
阶段 2:词对生成(corpus2pairs.py)
基于词汇表在语料上滑动窗口,生成 (center, context) 词对。这里支持两种特征类型:
支持多进程并行加速,通过 --processes_num 参数控制并发数。
阶段 3:词对聚合为共现矩阵(pairs2counts.py)
将所有词对按 (center, context) 聚合为稀疏共现计数矩阵。核心数据结构为 Python collections.Counter,支持"stripes"和"pairs"两种聚合模式,在内存效率和聚合速度间取得平衡。支持内存上限控制(--memory_size),超出后自动将临时结果写入磁盘,保证大语料下不OOM。
阶段 4:PPMI 变换(counts2ppmi.py)
将原始共现计数矩阵转换为正逐点互信息(Positive PMI,PPMI)矩阵。PPMI 是词向量领域最重要的无监督特征之一,通过消除高频词的虚假相关,保留真正有语义关联的共现模式。支持上下文分布平滑(--cds)和负采样移位(--neg)参数调优。
阶段 5:矩阵分解获取向量(counts2svd.py)
对 PPMI 稀疏矩阵进行截断 SVD 分解,得到低维密集词向量。这是 GloVe 类方法的核心步骤,工具集成了优化的 C 语言实现(SVD via sparsessvd 库)。
阶段 6:SGNS 直接学习(pairs2sgns.py)
此外还支持基于负采样的跳字模型(Skip-gram with Negative Sampling,SGNS),通过 Python 封装调用 C 语言实现的 word2vec 和 GloVe 核心算法,兼顾效率与灵活性。
Ngram2vec 的解耦设计让它能统一运行四种经典词向量方法:
| 方法 | 核心思想 | 在 Ngram2vec 中的实现 |
|---|---|---|
| SGNS | 负采样跳字模型 | pairs2sgns.py,调用 C 代码 |
| PPMI+SVD | 逐点互信息 + 奇异值分解 | counts2ppmi.py + counts2svd.py |
| GloVe | 共现比率的加权对数回归 | glove/glove.c,C 实现 |
| L2R (Levy et al.) | 基于排序的隐式负采样 | 通过词对直接训练 |
每种方法均可选择 word-level 或 ngram-level 的输入,从而生成词级或子词级向量。这种灵活性是该工具区别于其他词向量工具包(如 Gensim word2vec)的核心优势。
Ngram2vec 最广为人知的应用场景是中文词向量训练。基于该工具的 Chinese-Word-Vectors 项目提供了超过 100 种预训练中文词向量,覆盖维基百科、搜狗新闻、人民日报等不同语料,以及 word、ngram、character 等不同上下文特征组合,是中文 NLP 研究的重要基础资源。
此外,研究者还基于该项目构建了 CA8(Chinese Analogy 8)中文类比推理数据集,专门用于评测中文词向量的语义推理能力。
作为学术工具包,Ngram2vec 面向有一定 NLP 基础的研究者,使用上以命令行脚本为主。工具支持 Python 2 和 Python 3,依赖仅 numpy、scipy 和 sparsessvd,安装简单:
git clone https://github.com/zhezhaoa/ngram2vec
cd ngram2vec
pip install numpy scipy sparsessvd
chmod +x *.sh
python scripts/compile_c.py # 编译 C 语言模块
英文词向量训练(以 Wikipedia 语料为例):
# 训练词级向量
./word_example.sh
# 训练子词级向量
./ngram_example.sh
中文词向量则需要额外准备分好词的语料。该工具不提供 Web UI,所有操作均在终端完成,但各阶段中间结果(词表、词对、共现矩阵)均可保存复用,大幅提升迭代效率。
需要客观指出的是,Ngram2vec 作为 2017 年的工具,在某些方面已显得古老:
但对于需要高质量静态词向量的场景(如知识图谱构建、推荐系统特征、传统 NLP 任务),Ngram2vec 仍是非常可靠的选择。其子词级向量在处理中文分词歧义、OOV(未登录词)问题上的优势,是 BERT 等模型难以完全替代的。
Ngram2vec 是一个将学术研究与工程实践深度结合的词向量工具包。它用解耦的模块化设计统一了四种经典词向量方法,让研究者可以自由组合语料、上下文特征和算法,快速探索最优配置。对于关注中文 NLP 和 subword 表示的开发者而言,这个工具包是值得深入研究并在实际项目中落地的技术资产。
图2:项目作者 Zhe Zhao(赵哲),中国人民大学 DBIIR 实验室