floret: fastText + Bloom嵌入实现紧凑型全词覆盖向量
项目概述
floret是fastText的扩展版本,能够从紧凑的向量表中为任何单词生成词向量表示。它结合了:
- fastText的子词功能,为任何单词提供嵌入
- Bloom嵌入(“哈希技巧”)实现紧凑向量表
安装方法
从源码构建
git clone https://github.com/explosion/floret
cd floret
make
Python安装
pip install floret
或开发者模式安装:
git clone https://github.com/explosion/floret
cd floret
pip install -r requirements.txt
pip install --no-build-isolation --editable .
使用方法
floret在fasttext基础上增加了两个命令行选项:
-mode:fasttext(默认)或floret(单词和字符n-gram哈希到桶中)-hashCount:floret模式专用,每个单词/子词的哈希数量(1-4)
使用-mode floret时,单词条目与子词嵌入存储在同一个表中,减少了保存向量数据的大小。
训练CBOW嵌入的示例:
floret cbow -dim 300 -minn 4 -maxn 5 -mode floret -hashCount 2 -bucket 50000 \
-input input.txt -output vectors
技术原理
传统fastText的局限性
原始fastText实现将单词和子词存储在两个独立的表中:
- 单词表:词汇表中每个单词一个条目(约100万条目)
- 子词表:通过哈希每个子词到表中的一行(默认200万条目)
对于100万单词+200万子词,300维32位浮点向量需要约3GB存储空间。
floret的解决方案
floret采用Bloom嵌入算法,通过将每个条目哈希到表中的多个行来存储不同的表示。通过将每个条目表示为多个行的和,大多数条目都能获得不同的表示。
以单词"apple"为例,设置-minn 4 -maxn 5 -mode floret -hashCount 2时,其嵌入存储为以下各项的两个哈希行的和:
<apple>
<app
appl
pple
ple>
<appl
apple
pple>
向量表格式
floret生成.floret格式的向量表,类似于.vec格式,但包含扩展的头部信息:
bucket dim minn maxn hashCount hashSeed BOW EOW
示例表结构:
10 10 2 3 2 2166136261 < >
0 -2.2611 3.9302 2.6676 -11.233 0.093715 -10.52 -9.6463 -0.11853 2.101 -0.10145
1 -3.12 -1.7981 10.7 -6.171 4.4527 10.967 9.073 6.2056 -6.1199 -2.0402
...
与spaCy集成
在spaCy v3.2+中导入floret向量表:
spacy init vectors LANG vectors.floret spacy_vectors_dir --mode floret
注意事项
- fastText和floret二进制格式(.bin)不兼容
- floret支持所有现有的fasttext命令,不修改任何fasttext默认值
- 使用MurmurHash与spaCy兼容
技术优势
- 紧凑存储:显著减少向量表大小
- 全词覆盖:为训练期间未见过的单词生成向量
- 灵活配置:支持1-4个哈希 per条目
- 框架集成:与spaCy等流行NLP框架无缝集成
该项目为资源受限环境下的词向量应用提供了高效的解决方案,特别适合形态丰富的语言和处理未知词汇的场景。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
1107

被折叠的 条评论
为什么被折叠?



