跳转到主要内容

一套压缩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_freqpq=True)。

模型使用

如果您只需要一个微型的fastText俄语模型,您可以下载这个21兆字节的模型:这里。这是来自 RusVectoresgeowac_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嵌入的博客文章

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源代码发行版

compress-fasttext-0.1.5.tar.gz (15.9 kB 查看哈希值)

上传时间 源代码

由以下赞助

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面