训练 Fasttext 模型

问题描述

我想使用“gensim”库在 Python 中训练 Fasttext 模型。首先,我应该将每个句子标记为单词,从而将每个句子转换为单词列表。然后,应将此列表附加到最终列表中。因此,最后,我将有一个包含所有标记化句子的嵌套列表:

word_punctuation_tokenizer = nltk.WordPunctTokenizer()
word_tokenized_corpus = []
for line in open('sentences.txt'):
   new = line.strip()
   new = word_punctuation_tokenizer.tokenize(new)
   if len(new) != 0:
       word_tokenized_corpus.append(new)

然后,模型应构建如下:

embedding_size = 60
window_size = 40
min_word = 5
down_sampling = 1e-2
ft_model = FastText(word_tokenized_corpus,size=embedding_size,window=window_size,min_count=min_word,sample=down_sampling,sg=1,iter=100)

然而,“word_tokenized_corpus”中的句子数量非常多,程序无法处理。是否有可能我通过将每个标记化的句子一一赋予模型来训练模型,例如:?

 for line in open('sentences.txt'):
  new = line.strip()
  new = word_punctuation_tokenizer.tokenize(new)
  if len(new) != 0:
   ft_model = FastText(new,iter=100)

这对最终结果有什么影响吗?是否可以在不必构建如此大的列表并将其保存在内存中的情况下训练模型?

解决方法

由于数据量很大,最好将文本文件转换成COR文件。然后,按照以下方式阅读:

from gensim.test.utils import datapath
corpus_file = datapath('sentences.cor')

至于下一步:

model = FastText(size=embedding_size,window=window_size,min_count=min_word,sample=down_sampling,sg=1,iter=100)
model.build_vocab(corpus_file=corpus_file)
total_words = model.corpus_total_words
model.train(corpus_file=corpus_file,total_words=total_words,epochs=5)
,

如果你想使用默认的 fasttext API,你可以这样做:

root = "path/to/all/the/texts/in/a/single/txt/files.txt"

training_param = {
    'ws': window_size,'minCount': min_word,'dim': embedding_size,'t': down_sampling,'epoch': 5,'seed': 0
}
# for all the parameters: https://fasttext.cc/docs/en/options.html

model = fasttext.train_unsupervised(path,**training_param)
model.save_model("embeddings_300_fr.bin")

使用 fasttext API 的优点是 (1) 在 C++ 中实现,并在 Python 中使用包装器(比 Gensim 快得多)(也是多线程的)(2) 更好地管理文本的阅读.也可以直接从命令行使用。