一、fastText 是什么?
fastText 是由 Facebook AI Research(FAIR)团队在 2016 年推出的一个开源文本建模工具。它的主要目标是:
快速、高效地生成词向量(word embeddings)
支持文本分类任务(supervised learning)
相比于早期的 Word2Vec,fastText 提出了一个关键改进:在词向量训练时引入子词(subword)信息,因此可以更好地捕获词内部的形态特征(例如词根、词缀),并且对 OOV(词表外)词也有一定的泛化能力。
二、核心原理
fastText 的思想非常直接:
-
对每个单词,不仅看它整体,还把它拆成若干 n-gram 的字符片段
-
每个 n-gram 也都有向量
-
一个词的向量就是它自身向量 + 所包含的 n-gram 子词向量的加和
-
这样就能对未见过的新词进行较好的向量推断,因为往往新词和词表里的词会共享相同的子词
举个例子:
“walking”
可以分解成 “walk”, “ing”, “w”, “wa”, “al”, …
再把这些子词的向量叠加,就能推导出“walking”的向量。
三、fastText 能做什么?
词向量训练(无监督):生成和 Word2Vec 一样的词向量,但考虑了子词信息
文本分类(监督学习):比如情感分析、新闻分类
高效 & 快速:使用层次 softmax 等优化,大数据下仍能跑得飞快
四、与 Word2Vec 的比较
特点 | Word2Vec | fastText |
---|---|---|
单词表示 | 单词粒度 | 单词 + 子词粒度 |
词表外处理 | 无法表示 | 可以部分表示(靠子词组合) |
分类支持 | 需要单独模型 | 自带分类器(supervised 模式) |
速度 | 快 | 稍慢,但仍然很快 |
五、安装 fastText
⚙️ Python 包
pip install fasttext
⚙️ 如果需要 C++ 版
前往 https://fasttext.cc 下载编译版
六、fastText 词向量训练示例
这里给你一个最小可执行案例:
import fasttext
# 假设有一个 small_corpus.txt
# 每一行是一个句子
# 例如:
# I love machine learning
# fasttext is fast
# 训练 skipgram 模型
model = fasttext.train_unsupervised('small_corpus.txt', model='skipgram', dim=100)
# 查看一个词的向量
print(model.get_word_vector("learning"))
# 保存模型
model.save_model("fasttext_model.bin")
这就是一个基于无监督词向量训练的最小版本。
七、fastText 文本分类示例
它还支持分类,例如垃圾邮件检测:
import fasttext
# 训练格式要求:
# __label__spam You won a million dollars!
# __label__ham Hello, how are you?
model = fasttext.train_supervised('spam_data.txt')
# 预测
print(model.predict("Win cash prize now!"))
其中 __label__
前缀是 fastText 约定的分类标签标记。
八、fastText 的优缺点
优点:
-
训练极快,数分钟就能完成
-
子词建模,OOV 词表现比 Word2Vec 好
-
直接支持多类分类
-
Facebook 官方长期维护
缺点:
-
不支持太复杂的上下文(比如 BERT 那种深层 Transformer)
-
单词级别,语义深度不及句子/段落编码器
-
需要 C++ 编译或预编译依赖,对部分环境稍麻烦
九、总结
一句话总结:
fastText = Word2Vec + 子词建模 + 简单高效的文本分类如果你需要一个快速的、工业可用的词向量或分类器,它依然是一个非常棒的选择。