fastText 是 Facebook AI Research 提出的高效文本向量化工具,既能做文本分类,也能高效训练词向量。这里重点讲它的词向量(word embedding)部分,从原理到实操,一步步带大家掌握。
一、fastText 词向量的原理
fastText 的核心理念:
在 Word2Vec 的基础上,把一个词拆分成多个子词(subword),再对这些子词进行向量建模。
举例:
“playing” 这个词,会被拆成
- pla
- play
- lay
- ing
等 3~6 个字符的子片段。
这样“playing”的向量就等于这些子词向量的加和或平均。
因此即使出现一个未登录词,比如“playzzz”,fastText 也能用其子词的向量来进行大致推断,具备更好的泛化能力。
二、训练模式
fastText 同样提供 Word2Vec 风格的两种训练模式:
- Skipgram:给定中心词预测上下文
- CBOW:给定上下文预测中心词
Skipgram 能学到更细粒度的向量,适合小语料;CBOW 训练速度快,适合大规模语料。
三、训练前的语料准备
训练词向量时只需要纯文本文件,每一行就是一句话,例如:
I love machine learning
fastText is a powerful tool
deep learning is amazing
无需标签,也不要求特殊格式,越大规模越好。
四、安装 fastText
Python 下可直接安装:
pip install fasttext
五、训练词向量
下面是一个最小可运行的示例,基于 skipgram:
import fasttext
model = fasttext.train_unsupervised(
input="corpus.txt",
model="skipgram",
dim=100, # 维度
minn=3, # 子词最短
maxn=6, # 子词最长
epoch=5 # 迭代次数
)
# 查看向量
print(model.get_word_vector("learning"))
# 保存
model.save_model("fasttext_skipgram.bin")
如果需要 CBOW,只需 model=“cbow”。
六、词向量使用
训练好之后,使用非常简单:
vector = model.get_word_vector("computer")
也可以遍历词表:
for word in model.words:
print(word, model.get_word_vector(word))
七、模型文件
fastText 训练后会保存一个 .bin 文件,包括:
- 词表
- 子词信息
- 词向量
可直接用 fasttext.load_model(“xxx.bin”) 加载。
八、fastText 词向量的优势
1. 对未登录词友好
因为子词分片机制,即使没见过的新词也能组合其表示。
2. 训练速度快
内部实现高度并行,适合超大语料
3. 模型体积小
一般几十 MB,就可覆盖大规模词表
4. 易于迁移
能快速被下游模型(如分类器、聚类器)调用
九、工业落地案例
fastText 词向量在实际中广泛用于:
- 商品标题向量化
- 评论语义搜索
- 知识问答召回
- 新闻分类预训练
- 多语言迁移学习
特别适合大规模、对响应速度要求高的工业系统。
十、进阶技巧
-
子词 n-gram 范围 (minn, maxn)
一般 3~6 比较合理 -
维度 (dim)
100~300 是常见选择 -
负采样 (neg)
控制负样本数量 -
层次 softmax (loss=‘hs’)
如果语料大,可以极大加速 -
迭代次数 (epoch)
语料小可多跑几轮
十一、总结
fastText 可以看作是
Word2Vec + 子词分片
的组合,同时保持超快的速度和小巧的文件体积。
它是一个非常务实、工程化的词向量方案,尤其在海量文本和多语言环境下表现优秀。