fastText 是由 Facebook AI Research(FAIR)团队提出的一种词嵌入(word embedding)方法,旨在提高词向量的学习效果,尤其是在处理稀有词或未见过的词(out-of-vocabulary words, OOV)时。与传统的词向量模型(如 Word2Vec)不同,fastText 不仅考虑单词本身,还考虑了单词内部的子词(subword)信息。这样一来,即使是没有出现在训练数据中的词,fastText 也能通过其子词信息生成合适的词向量。
fastText模型的基本原理
与传统的词向量模型(如 Word2Vec)将每个词作为一个整体来学习词向量不同,fastText 将每个词看作是其子词(n-grams)的集合。通过这种方式,fastText 试图捕捉到更多的词汇信息,并能够更好地处理稀有词汇和未见过的词。
1. 子词建模
fastText 将每个词分解为多个子词(n-grams),这些子词可以是字符级别的子串。比如,词“hello”可以被分解为:
- 字符级别的子词:
<h
,he
,el
,ll
,lo
,o>
其中,<
和 >
是用于表示词边界的特殊符号,表示词的开始和结束。
子词的好处:
- 处理稀有词:即使一个词在训练集中没有出现,fastText 也能通过其子词信息来生成合理的词向量。这是因为即使没有见过某个词,fastText 也能依赖这个词的组成子词(如“running”的子词可能包含“run”和“ing”)。
- 处理形态学变化:fastText 可以通过子词捕捉到词汇的形态学变化,例如词的词尾变化、复数、时态等。
2. 词向量学习
fastText 在训练时,通过采用与 Word2Vec 相似的训练策略,学习每个词的词向量。它有两种训练模式:
- Skip-gram模型:通过给定上下文词来预测目标词(即给定上下文,学习目标词)。
- CBOW模型(Continuous Bag of Words):通过给定目标词来预测上下文词。
在 fastText 中,目标词被分解成多个子词,并且学习到的是子词的嵌入。通过这种方法,fastText能够为每个词(包括未见过的词)生成一个由其子词组成的词向量。
3. 训练目标
fastText 的训练目标与 Word2Vec 的目标类似,都是基于最大化上下文词的条件概率。具体来说,fastText 是通过优化以下目标函数来训练模型的:
J = − ∑ w i ∈ C log P ( w i ∣ c o n t e x t ) J = -\sum_{w_i \in C} \log P(w_i | context) J=−wi∈C∑logP(wi∣context)
其中, w i w_i wi 是目标词, C C C 是给定上下文, P ( w i ∣ c o n t e x t ) P(w_i | context) P(wi∣context) 是条件概率。
对于子词,fastText 会将目标词拆分为若干子词,并且优化子词的条件概率,使得每个词的子词嵌入尽量与它的上下文匹配。
fastText的优点
-
处理未见过的词:
- 由于通过子词进行建模,fastText 可以有效地处理未在训练数据中出现的词。这对于许多现实场景中有很多稀有或新词的应用场景(例如社交媒体、新闻等)特别有用。
-
考虑词的形态学特征:
- fastText 可以通过分解词的子词来捕捉词的形态学特征,比如词根、词尾、前缀等。这使得它在处理具有形态变化的语言(如德语、法语等)时特别有效。
-
训练速度较快:
- 尽管 fastText 比 Word2Vec 更加复杂,但它在训练上通常是比较高效的,尤其是在大规模语料库上。
-
高效的稀疏数据处理:
- fastText 在处理低频词或稀有词时比传统的词向量模型表现更好,尤其是在面对词汇量较大的情况时。
fastText与Word2Vec的比较
特点 | fastText | Word2Vec |
---|---|---|
子词建模 | 是:将词分解为多个子词(n-grams) | 否:将每个词作为一个整体来建模 |
稀有词处理 | 更好:能够处理未见过的词,通过子词信息进行建模 | 较差:不能处理未见过的词 |
形态学特征 | 更好:能够捕捉形态学变化,例如复数、时态等 | 较差:只能通过完全相同的词来学习 |
训练速度 | 较快:优化时考虑的是子词信息 | 较快:优化的是词级别的信息 |
内存消耗 | 较高:需要存储每个词的多个子词信息 | 较低:只需要存储每个词的词向量 |
应用 | 适用于低频词汇、稀有词、形态学变化较大的语言 | 适用于常见词汇,较简单的语料库 |
fastText的应用
-
文本分类:
- fastText 在文本分类任务中非常有效,尤其在面对文本中包含很多未知词时。Facebook 提供了一个开源的 fastText 实现,它可以快速进行文本分类任务(如情感分析、垃圾邮件分类等)。
-
语义相似性和文本匹配:
- fastText 通过为每个词生成一个高质量的词向量,可以用于计算文本间的相似性,进而应用于信息检索、问答系统等任务。
-
命名实体识别(NER)和其他NLP任务:
- fastText 也可以在命名实体识别(NER)任务中使用,通过基于子词的建模方法来处理词形的变化。
-
多语言模型:
- fastText 支持多语言,尤其是处理不同形态学结构的语言(如阿拉伯语、德语等)时,比传统的词向量模型效果更好。
如何使用fastText
使用 fastText 进行词向量训练相对简单,Facebook 提供了一个高效的开源实现,支持训练和应用词向量。
安装fastText
pip install fasttext
或
# 安装 fasttext 的预编译包(避免源码编译)
pip install fasttext-wheel
训练模型
import fasttext
# 训练一个skipgram模型
model = fasttext.train_unsupervised('data.txt', model='skipgram')
# 训练一个CBOW模型
model = fasttext.train_unsupervised('data.txt', model='cbow')
# 获取词向量
vector = model.get_word_vector('apple')
应用模型
# 查找相似词
model.get_nearest_neighbors('apple')
# 获取词向量
vector = model['apple']
总结
fastText 是一种强大的词向量学习方法,通过将词分解为子词来生成词向量,使得它在处理稀有词、未见过的词和形态学变化时表现得非常出色。它是一个非常适合大规模文本数据和处理多语言、形态学复杂语言的工具,适用于词向量学习、文本分类、命名实体识别等多种自然语言处理任务。