问题描述
我有一个关于 fasttext (https://fasttext.cc/) 的问题。我想下载一个预先训练好的模型并用它从文本中检索词向量。
下载预训练模型 (https://fasttext.cc/docs/en/english-vectors.html) 后,我解压缩它并得到一个 .vec 文件。如何将其导入 fasttext?
我尝试使用提到的函数如下:
import fasttext
import io
def load_vectors(fname):
fin = io.open(fname,'r',encoding='utf-8',newline='\n',errors='ignore')
n,d = map(int,fin.readline().split())
data = {}
for line in fin:
tokens = line.rstrip().split(' ')
data[tokens[0]] = map(float,tokens[1:])
return data
vectors = load_vectors('/Users/username/Downloads/wiki-news-300d-1M.vec')
model = fasttext.load_model(vectors)
但是,我不能完全运行这段代码,因为python崩溃了。如何成功加载这些预先训练好的词向量?
感谢您的帮助。
解决方法
例如,FastText 相对于 word2vec 或 glove 的优势在于它们使用子词信息来返回 OOV(词汇表外)词的向量。
因此他们提供两种类型的预训练模型:.vec
和 .bin
。
.vec
是词->向量信息的字典,词向量是针对训练词汇中的词预先计算的。
.bin
是一个二进制快速文本模型,可以使用 fasttext.load_model('file.bin')
加载,并且可以为未见过的词 (OOV) 提供词向量,可以进行更多训练。
在您的情况下,您正在加载 .vec
文件,因此 vectors
是数据的“最终形式”,fasttext.load_model
需要 .bin
文件名。
如果您需要的不仅仅是 Python 字典,您可以使用 gensim.models.keyedvector
。
由于经过训练的词向量独立于它们的训练方式(Word2Vec、FastText、VarEmbed 等),因此它们可以由独立结构表示,如本模块中实现的那样。