floret: fastText + Bloom embeddings for compact, full-coverage vectors with spaCy
floret是fastText的扩展版本,能够从紧凑的向量表中为任何词汇生成词表示。它结合了:
- fastText的子词功能,为任何词汇提供嵌入
- Bloom嵌入(“哈希技巧”)实现紧凑的向量表
安装floret
从源码构建
|
|
这将生成主要的二进制文件floret
。
Python安装
使用pip安装Python封装:
|
|
或从源码以开发者模式安装:
|
|
使用方法
floret向fasttext添加了两个额外的命令行选项:
|
|
使用-mode floret
时,词汇条目与子词嵌入(桶)存储在同一表中,减少了保存的向量数据大小。使用-hashCount 2
时,每个条目在内部子词哈希表中存储为两行的和。floret支持在嵌入表中每个条目使用1-4个哈希。通过在嵌入表中将条目存储为多个行的和,可以在对性能和速度影响相对较小的情况下大幅减少表中的行数。
以下是训练CBOW嵌入的示例,使用4-grams和5-grams子词,每个条目2个哈希,紧凑表大小为50K条目而非默认的2M条目:
|
|
使用-mode floret
选项时,floret将保存一个额外的向量表,文件扩展名为.floret
。该格式与.vec
非常相似,包含一个标题行,后跟每行一个向量。词汇标记被替换为行索引,标题扩展为包含在spaCy中加载此表所需的所有相关训练设置。
要在spaCy v3.2+中导入此向量表:
|
|
floret工作原理
在原始实现中,fastText将词汇和子词存储在两个单独的表中。词汇表包含词汇表中的每个词汇(通常约1M条目),子词通过将每个子词哈希到表中的一行存储在单独的固定大小表中(默认2M条目)。使用相对较大的表来减少子词之间的冲突。然而,对于1M词汇 + 2M子词,300维32位浮点向量,需要约3GB存储结果数据,这对许多用例来说是不可行的。
此外,许多导入向量的库仅支持词汇表(.vec),这将覆盖范围限制在训练数据中频率高于一定阈值的词汇。对于形态丰富的语言,即使是大向量表也可能无法为训练中见过的词汇提供良好覆盖,并且仍然可能遇到训练中完全未见过的词汇。
为了以更紧凑的格式存储词汇和子词向量,我们转向spaCy一直使用的算法:Bloom嵌入。Bloom嵌入(也称为"哈希技巧",或在spaCy的ML库thinc中称为HashEmbed)可用于通过将每个条目哈希到表中的多行来在紧凑表中存储不同的表示。通过将每个条目表示为多个行的和,其中两个条目不太可能在同一多个哈希上冲突,大多数条目最终将获得不同的表示。
使用设置-minn 4 -maxn 5 -mode floret -hashCount 2
,词汇apple
的嵌入在内部存储为每个词汇、4-grams和5-grams的2个哈希行的和。词汇用BOW和EOW字符<
和>
填充,创建以下词汇和子词条目:
|
|
为了与spaCy兼容,使用MurmurHash哈希词汇和字符n-gram字符串。apple
的最终嵌入是上述每个词汇和字符n-gram的两个行(-hashCount 2
)的和。
使用-mode floret
时,floret将保存一个额外的向量表,扩展名为.floret
,与通常的.bin
和.vec
文件一起。该格式与.vec
非常相似,包含一个标题行,后跟向量表中每个条目一行,行首是行索引而非词汇标记。标题扩展为包含在另一个应用程序或库(如spaCy)中使用此表所需的所有训练设置。
标题包含空格分隔的设置:
|
|
演示.floret
表,使用-bucket 10 -dim 10 -minn 2 -maxn 3 -hashCount 2
:
|
|
此表可以使用spaCy v3.2+中的spacy init vectors
命令导入,选项--mode floret
:
|
|
注意事项
fastText和floret二进制格式(.bin)不兼容,因此必须使用训练时相同的程序加载.bin文件。有关所有其他命令和选项的详细信息,请参阅fastText文档。floret支持所有现有的fasttext命令,并且不修改任何fasttext默认值。