FastText 的预训练模型通常是使用大规模文本语料库进行训练得到的,因此可以捕获单词的语义和语法信息。这些预训练模型的优势在于它们可以为各种语言和领域提供通用的语义表示,从而在具有限制的数据情况下提高模型的性能。
1. 模型介绍
FastText 官网发布了四类的预训练词向量模型。
Doc:https://fasttext.cc/docs/en/english-vectors.html
1.1 英文词向量
FastText 发布的基于 Common Crawl 和 Wikipedia 英文语料训练的词向量模型。
- wiki-news-300d-1M.vec.zip: 直接使用完整的单词作为训练单位,学习每个单词的向量表示。
- wiki-news-300d-1M-subword.vec.zip: 训练词向量时引入了子词信息,这意味着模型不仅学习整词的向量表示,还学习词根、前缀、后缀等子词单元的向量表示。即:词向量本身就包含了对词内在结构的某种表示。
Doc:https://fasttext.cc/docs/en/english-vectors.html
Common Crawl 数据集包含了来自全球范围内数百万个网页的文本、图像、网页结构和元数据等信息。这些数据覆盖了各种主题和语言,并且不断更新和增长。由于其大规模和多样性,Common Crawl 数据集成为了许多自然语言处理、信息检索、机器学习等领域的研究和实验的重要资源。
Wikipedia (维基百科)是一个由志愿者编辑的在线百科全书,涵盖了广泛的主题,包括历史、科学、文化、地理、人物传记等等。这些数据对于自然语言处理、信息检索、知识图谱构建等领域的研究和实践具有重要意义,因此它是许多自然语言处理任务中用于训练和评估模型的常见数据源。
1.2 CBOW 词向量
FastText 官网发布的基于 Common Crawl 和 Wikipedia 数据训练的 157 种语言的预训练的词向量模型。这些模型是使用 CBOW 结合位置权重(CBOW with position-weights)进行训练的,维度为 300,采用字符 n-gram 长度为 5,窗口大小为 5,负采样数为 10。
在标准 CBOW 模型中,上下文中所有词的贡献被认为是相等的。然而,在实际应用中,上下文中距离目标词较近的词可能对预测目标词的贡献更大。因此,为了更精确地捕捉这种依赖性,可以引入位置权重。
CBOW with position-weights
意味着在计算上下文向量时,根据每个上下文词与目标词之间的距离,给予不同的权重。这种方法可以让模型更加重视那些与目标词距离较近的上下文词,因为它们在语义上往往更加相关。
Doc:https://fasttext.cc/docs/en/crawl-vectors.html
1.3 Skip-Gram 词向量
FastText 官网发布的基于 Wikipedia 数据的预训练词向量模型,涵盖了 294 种语言。这些词向量的维度为 300,是使用 Skip-Gram 模型训练得到的,采用了默认参数。
Doc:https://fasttext.cc/docs/en/pretrained-vectors.html
1.4 对齐词向量
FastText 官网发布的基于 Wikipedia 数据的预训练词向量模型,涵盖了 44 种语言的对齐词向量。
词向量对齐就是将两种或多种语言中的词向量,映射到一个共同的向量空间中,使得不同语言中相似或对应的词在这个共同空间中的向量表示更加接近,这样就能更容易地进行跨语言的词汇理解和应用,比如机器翻译、跨语言检索等。
假设我们有两种语言:中文和英文,对齐的词汇是 苹果
和 apple
。
- 首先,在英文中使用某种词向量模型得到
apple
向量表示apple_vec_en = [0.4, -0.3, 0.7]
- 接着,在中文中也用同样的模型得到
苹果
向量表示苹果_vec_zh = [0.5, -0.2, 0.6]
- 现在,通过词向量对齐的方法,将这两个词的向量映射到一个共同的空间。
假设我们已经进行了词向量对齐的操作,映射后的结果如下:
- 映射后的英文
apple
向量为aligned_apple_vec = [0.42, -0.28, 0.68]
- 映射后的中文
苹果
的向量为aligned_苹果_vec = [0.45, -0.18, 0.65]
通过这样的对齐操作,apple
和苹果
的向量在共同的空间中更加接近了,这样就实现了词向量的对齐。
Doc:https://fasttext.cc/docs/en/aligned-vectors.html
2. 使用模型
FastText 预训练模型有两种主要的格式:二进制(bin)格式和文本(vec)格式。
- 二进制(bin)格式:
- 二进制格式的预训练模型包含了词向量的表示以及附加的元数据,如词典和子词信息。
- 这种格式的模型通常更加紧凑,加载速度更快,占用的内存也更少。
- 二进制格式的模型文件通常以
.bin
为扩展名,例如cc.zh.300.bin
。
- 文本(vec)格式:
- 文本格式的预训练模型只包含了词向量的表示,不包含额外的元数据。
- 这种格式的模型可以直接被人类阅读,并且易于导入到其他工具或平台中使用。
- 文本格式的模型文件通常以
.vec
为扩展名,例如cc.zh.300.vec
或cc.zh.300.txt
。
import fasttext # 1. bin 词向量格式 def test01(): model = fasttext.load_model('model/cc.zh.300.bin') # 获得向量维度 print(model.get_dimension()) # 获得词表大小 print(len(model.get_words())) # 获得词、句向量 print(model.get_word_vector('中国')) # 2. txt 词向量格式 def test02(): vectors = {} with open('model/wiki.zh.align.vec', encoding='utf-8') as file: cnt, dim = map(int, file.readline().strip().split()) for line in file: line = line.strip().split() token = line[0] embed = map(float, line[1:]) vectors[token] = embed print(list(vectors['中国'])) if __name__ == '__main__': test01() test02()
3. 维度适配
预训练的词向量维度为 300,如果需要更小的维度,可以使用下面方法来进行适配。
Doc:https://fasttext.cc/docs/en/crawl-vectors.html#adapt-the-dimension
# 修改模型向量维度 def model_reducer(): model = fasttext.load_model('data/model/cc.zh.300.bin') print(os.stat('data/model/cc.zh.300.vec').st_size) print(model.get_dimension()) fasttext.util.reduce_model(model, 100) model.save_model('temp/cc.zh.100.bin') print(os.stat('temp/cc.zh.100.bin').st_size) print(model.get_dimension())