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 词向量的优势
-
对未登录词友好
因为子词分片机制,即使没见过的新词也能组合其表示。 -
训练速度快
内部实现高度并行,适合超大语料 -
模型体积小
一般几十 MB,就可覆盖大规模词表 -
易于迁移
能快速被下游模型(如分类器、聚类器)调用
九、工业落地案例
fastText 词向量在实际中广泛用于:
-
商品标题向量化
-
评论语义搜索
-
知识问答召回
-
新闻分类预训练
-
多语言迁移学习
特别适合大规模、对响应速度要求高的工业系统。
十、进阶技巧
-
子词 n-gram 范围 (
minn
,maxn
)
一般 3~6 比较合理 -
维度 (
dim
)
100~300 是常见选择 -
负采样 (
neg
)
控制负样本数量 -
层次 softmax (
loss='hs'
)
如果语料大,可以极大加速 -
迭代次数 (
epoch
)
语料小可多跑几轮
十一、总结
fastText 可以看作是
Word2Vec + 子词分片
的组合,同时保持超快的速度和小巧的文件体积。
它是一个非常务实、工程化的词向量方案,尤其在海量文本和多语言环境下表现优秀。