加载预训练的 fasttext 模型

Loading pre trained fasttext model

我对 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 的优势在于,它们将子词信息用于 return OOV(词汇外)词的向量。

所以他们提供两种类型的预训练模型:.vec.bin

.vec是一个字典Dict[word, vector],词向量是为训练词汇中的词预先计算的

.bin 是一个 binary fasttext 模型 可以使用 fasttext.load_model('file.bin') 加载并且可以为看不见的词 (OOV) 提供词向量,进行训练更多等等

在您的情况下,您正在加载一个 .vec 文件,因此 vectors 是数据的“最终形式”。 fasttext.load_model 需要一个 .bin 文件。

如果您需要的不仅仅是 python 字典,您可以使用 gensim.models.keyedvector(它可以处理任何词向量,例如 word2vec、glove 等...)。

我使用下面的代码在Python3中加载.vec文件,其中PATH_TO_FASTTEXT.vec文件的路径。

最值得注意的是,map 需要显式转换为列表。


def LoadFastText():
    input_file = io.open(PATH_TO_FASTTEXT, 'r', encoding='utf-8', newline='\n', errors='ignore')
    no_of_words, vector_size = map(int, input_file.readline().split())
    word_to_vector: Dict[str, List[float]] = dict()
    for i, line in enumerate(input_file):
        tokens = line.rstrip().split(' ')
        word = tokens[0]
        vector = list(map(float, tokens[1:]))
        assert len(vector) == vector_size
        word_to_vector[word] = vector
    return word_to_vector