如何将Gensim训练的FastText模型保存为原生FastText兼容二进制格式
把Gensim FastText模型转成原生FastText二进制格式的方法
我来帮你搞定这个问题——把Gensim训练好的FastText模型导出成原生FastText能识别的.bin格式,这样你就能用./fasttext print-word-vectors model.bin < queries.txt来处理句子编码了。结合你的环境(Python 3.4.3、Gensim 3.4.0、FastText 0.1.0),这里有两种靠谱的解决方案:
方法1:用Gensim内置的导出方法(最省心)
其实Gensim 3.4.0的FastText类已经自带了直接导出为原生格式的方法,这正是你要找的load_binary_data()逆向操作,直接调用就行:
from gensim.models import FastText # 先加载你训练好的Gensim FastText模型 model = FastText.load("你的训练模型文件名.model") # 保存成原生FastText的二进制格式 model.save_fasttext_format("model.bin")
这个方法会自动处理所有原生FastText需要的细节——比如词向量、子词n-gram信息、模型参数等,生成的.bin文件完全符合原生FastText的格式要求,直接就能用。
方法2:手动实现逆向逻辑(备用方案)
如果因为版本兼容的小问题,内置方法不好用,你可以手动照着原生FastText的二进制格式把数据写进去,核心就是还原load_binary_data()的读取逻辑,反过来写入:
import struct from gensim.models.fasttext import FastText def save_gensim_to_fasttext_bin(model, output_path): # 先把模型的关键参数拿出来 vocab_size = len(model.wv.vocab) vector_dim = model.wv.vector_size min_n_gram = model.min_n max_n_gram = model.max_n bucket_size = model.bucket # 以二进制模式打开输出文件 with open(output_path, 'wb') as f: # 写入原生FastText的魔数(固定标识) f.write(struct.pack('<i', 123456789)) # 写入词汇表大小和向量维度 f.write(struct.pack('<ii', vocab_size, vector_dim)) # 写入n-gram的最小/最大长度,以及bucket大小 f.write(struct.pack('<iii', min_n_gram, max_n_gram, bucket_size)) # 标记这是无监督模型(原生FastText用0表示) f.write(struct.pack('<i', 0)) # 逐个写入词汇和对应的词向量 for word in model.wv.vocab: word_bytes = word.encode('utf-8') # 先写词的长度,再写词本身 f.write(struct.pack('<i', len(word_bytes))) f.write(word_bytes) # 写入词向量(用float32格式) vector = model.wv[word] f.write(struct.pack(f'<{vector_dim}f', *vector)) # 如果设置了n-gram,还要写入所有子词的向量 if min_n_gram > 0: for i in range(bucket_size): subvec = model.wv.get_vector(f'_{i}', norm=False) f.write(struct.pack(f'<{vector_dim}f', *subvec)) # 使用示例 model = FastText.load("你的训练模型文件名.model") save_gensim_to_fasttext_bin(model, "model.bin")
验证导出结果
导出完成后,赶紧用你的原生FastText命令测试一下:
./fasttext print-word-vectors model.bin < queries.txt
如果能正常输出每个词的向量,就说明格式完全正确啦(要是想输出整个句子的向量,可以用print-sentence-vectors命令)。
小提示:你的FastText是0.1.0的早期版本,上面的方法已经考虑了这个版本的格式要求,不用担心兼容性问题。
内容的提问来源于stack exchange,提问作者matlibplotter
相关产品推荐
相关产品推荐

