一套压缩gensim fasttext模型的工具
项目描述
Compress-fastText
这个Python 3包允许通过多个数量级压缩fastText词嵌入模型(来自gensim
包),而不会显著影响其质量。
在此处有一些已经压缩的模型链接。
这篇俄语博客文章和这篇英文文章提供了关于压缩fastText模型的动机和方法更多详细信息。
注意:gensim==4.0.0引入了一些不兼容的更改
- 对于gensim<4.0.0,请使用compress-fasttext<=0.0.7(并且可选地从我们的第一个版本的俄语模型)。
- 对于gensim>=4.0.0,请使用compress-fasttext>=0.1.0(并且可选地从我们的0.1.0版本的俄语或英语模型)。
- 某些模型在新版本的gensim+compress-fasttext中不再受支持(例如,来自RusVectores的多个模型,它们使用
compatible_hash=False
)。 - 对于任何特定模型,兼容性应通过实验确定。如果您发现任何异常行为,请在Github问题中报告。
可以使用pip
安装此包
pip install compress-fasttext[full]
如果您不打算执行矩阵分解或量化,您可以使用依赖项较少的版本进行安装
pip install compress-fasttext
模型压缩
您可以使用此包压缩自己的fastText模型(或从例如RusVectores下载的模型)
以Gensim格式压缩模型
import gensim
import compress_fasttext
big_model = gensim.models.fasttext.FastTextKeyedVectors.load('path-to-original-model')
small_model = compress_fasttext.prune_ft_freq(big_model, pq=True)
small_model.save('path-to-new-model')
导入Facebook原始格式的模型并压缩它
from gensim.models.fasttext import load_facebook_model
import compress_fasttext
big_model = load_facebook_model('path-to-original-model').wv
small_model = compress_fasttext.prune_ft_freq(big_model, pq=True)
small_model.save('path-to-new-model')
要执行此压缩,您需要先安装 pip install gensim==3.8.3 sklearn
。
不同的压缩方法包括
- 矩阵分解(
svd_ft
) - 产品量化(
quantize_ft
) - 特征哈希优化(
prune_ft
) - 特征选择(
prune_ft_freq
)
建议的方法是特征选择和量化的组合(prune_ft_freq
与 pq=True
)。
模型使用
如果您只需要一个微型的fastText俄语模型,您可以下载这个21兆字节的模型:这里。这是来自 RusVectores 的 geowac_tokens_none_fasttextskipgram_300_5_2020 模型的压缩版本。
如果已经安装了 compress-fasttext
,您可以直接下载并使用这个微型模型
import compress_fasttext
small_model = compress_fasttext.models.CompressedFastTextKeyedVectors.load(
'https://github.com/avidale/compress-fasttext/releases/download/gensim-4-draft/geowac_tokens_sg_300_5_2020-100K-20K-100.bin'
)
print(small_model['спасибо'])
# [ 0.26762889 0.35489027 ... -0.06149674] # a 300-dimensional vector
print(small_model.most_similar('котенок'))
# [('кот', 0.7391024827957153), ('пес', 0.7388300895690918), ('малыш', 0.7280327081680298), ... ]
类 CompressedFastTextKeyedVectors
继承自 gensim.models.fasttext.FastTextKeyedVectors
,但进行了一些额外的优化。
对于英语,您可以使用这个微型模型:这里,这是通过压缩 Facebook的模型 得到的。
import compress_fasttext
small_model = compress_fasttext.models.CompressedFastTextKeyedVectors.load(
'https://github.com/avidale/compress-fasttext/releases/download/v0.0.4/cc.en.300.compressed.bin'
)
print(small_model['hello'])
# [ 1.84736611e-01 6.32683930e-03 4.43901886e-03 ... -2.88431027e-02] # a 300-dimensional vector
print(small_model.most_similar('Python'))
# [('PHP', 0.5252903699874878), ('.NET', 0.5027452707290649), ('Java', 0.4897131323814392), ... ]
更多101种语言的压缩模型可以在 https://zenodo.org/record/4905385 找到。
应用示例
在实际应用中,您通常会将fastText嵌入到其他模型中。类 FastTextTransformer
使用 scikit-learn接口,并将文本表示为其单词嵌入的平均值。利用它,您可以在fastText之上训练一个分类器,例如区分可食用物品和不可食用物品。
import compress_fasttext
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
from compress_fasttext.feature_extraction import FastTextTransformer
small_model = compress_fasttext.models.CompressedFastTextKeyedVectors.load(
'https://github.com/avidale/compress-fasttext/releases/download/v0.0.4/cc.en.300.compressed.bin'
)
classifier = make_pipeline(
FastTextTransformer(model=small_model),
LogisticRegression()
).fit(
['banana', 'soup', 'burger', 'car', 'tree', 'city'],
[1, 1, 1, 0, 0, 0]
)
classifier.predict(['jet', 'train', 'cake', 'apple'])
# array([0, 0, 1, 1])
注意事项
此代码大量基于 Alexander Kukushkin 的 navec 包以及 Andrey Vasnetsov 关于缩小fastText嵌入的博客文章。