【问题标题】:Reading a large pre trained fastext word embedding file in python在 python 中读取一个大型预训练的 fastext 词嵌入文件
【发布时间】:2019-01-19 16:02:04
【问题描述】:

我正在做情绪分析,我想使用预训练的 fasttext 嵌入,但是文件非常大(6.7 GB)并且程序需要很长时间才能编译。

fasttext_dir = '/Fasttext'
embeddings_index = {}
f = open(os.path.join(fasttext_dir, 'wiki.en.vec'), 'r', encoding='utf-8')
for line in tqdm(f):
    values = line.rstrip().rsplit(' ')
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    embeddings_index[word] = coefs
f.close()

print('found %s word vectors' % len(embeddings_index))

embedding_dim = 300

embedding_matrix = np.zeros((max_words, embedding_dim))
for word, i in word_index.items():
    if i < max_words:
        embedding_vector = embeddings_index.get(word)
        if embedding_vector is not None:
            embedding_matrix[i] = embedding_vector

有什么方法可以加快进程?

【问题讨论】:

  • 这段代码运行多长时间?
  • 大约需要 8 分钟。读取和处理文件。即使在那之后,计算机在很长一段时间内仍然非常滞后
  • 现在是python脚本和这个任务的正常时间。但是您可以使用另一种语言来加快速度。可能它也会消耗很多错误。尝试腌制和删除(通过del)不必要的数据(embeddings_index,处理时等)

标签: python keras sentiment-analysis fasttext


【解决方案1】:

您可以改为使用 gensim 加载预训练的嵌入。至少对我来说这要快得多。首先你需要 pip install gensim 然后你可以使用以下代码行加载模型:

from gensim.models import FastText

model = FastText.load_fasttext_format('cc.en.300.bin')

(我不确定您是否需要 .bin 文件,也许 .vec 文件也可以。)

要使用此模型嵌入单词,只需使用model[word]

【讨论】:

  • 它需要.bin。我现在要试试
【解决方案2】:

我建议您使用 .bin 模型,但如果它不存在并且您只有 .vec 或 .txt,请尝试使用 Joblib 并行化该过程:

from joblib import Parallel, delayed
from tqdm import tqdm

if __name__ == '__main__':
    embeddings_index = {}

    f = open(os.path.join('D:/multi_lingual', 'wiki.en.align.vec'), 'r', encoding='utf-8')
    def loading(line):
        values = line.rstrip().rsplit(' ')
        word = values[0]
        coefs = np.asarray(values[1:], dtype='float32')
        return word, coefs

    embeddings_index = dict(Parallel(n_jobs=-1)(delayed(loading)(line) for line in tqdm(f)))
    f.close()
    print(len(embeddings_index))

通过监控 tqdm 进度条,我注意到了改进的数量:

没有并行化:10208.44it/s

并行化:23155.08it/s

我使用的是 4 核 CPUz .. 结果并不完全准确,因为我在其他东西上使用了处理器。也许您会注意到更好的改进。

另一点是,我建议您在阅读完所需的单词后将它们保存在下次可以加载它们的位置,而不是每次都加载整个嵌入文件。

【讨论】:

    【解决方案3】:

    您也可以加载一次,将其保存为泡菜,然后再加载泡菜。 在 python 中加载 pickle 文件是最快的。

    【讨论】:

      猜你喜欢
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 2019-07-11
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多