1

我想为法语创建一个大的 gensim 字典,以尝试在主题检测、文本之间的相似性和其他类似的事情上获得更好的结果。所以我计划使用维基百科转储并按以下方式处理它:

  1. 从 frwiki-YYYYMMDD-pages-articles.xml.bz2 中提取每篇文章(完成)
  2. 标记每篇文章(基本上将文本转换为小写,删除停用词和非单词字符)(完成)
  3. 在文章上训练一个短语模型来检测搭配。
  4. 在每篇文章中提取生成的标记。
  5. 用新语料库输入字典(每行一篇词干并置标记化文章)

由于语料库非常大,我没有在内存中存储任何内容并通过 smart_open 访问语料库,但似乎 gensim Phrases 模型消耗了太多 RAM 来完成第三步。

这是我的示例代码:

corpus = smart_open(corpusFile, "r")
phrases = gensim.models.Phrases()
with smart_open(phrasesFile, "wb") as phrases_file:
    chunks_size = 10000
    texts, i = [], 0
    for text in corpus:
        texts.append(text.split())
        i += 1
        if i % chunks_size == 0:
            phrases.add_vocab(texts)
            texts = []
    phrases.save(phrases_file)
corpus.close()

有没有办法在不冻结我的计算机的情况下完成操作,或者我只需要在我的语料库的一个子集上训练 Phrases 模型?

4

1 回答 1

1

我在回答自己,因为我意识到我忘记在 Phrases 类中处理一些与内存相关的参数。

因此,首先我将 max_vocab_size 除以 2,因此它应该消耗更少的内存,并且我决定每 100 000 篇文章保存 Phrases 对象,然后从保存的文件中重新加载它,因为这些技巧表明它们可以对 gensim 库中的其他一些类有帮助...

这是新代码,可能会慢一点,但它已成功完成任务:

corpus = smart_open(corpusFile, "r")
max_vocab_size=20000000
phrases = Phrases(max_vocab_size=max_vocab_size)
chunks_size = 10000
save_every = 100000
texts, i = [], 0
for text in corpus:
    texts.append(text.split())
    i += 1
    if i % chunks_size == 0:
        phrases.add_vocab(texts)
        texts = []
    if i % save_every == 0:
        phrases.save(phrasesFile)
        phrases = Phrases.load(phrasesFile)
corpus.close()
phrases.save(phrasesFile)

在将所有这些都放在 Phraser 对象中之后,在我的案例中最终得到了 412 816 个短语。

于 2019-01-23T04:12:23.607 回答