如何从庞大的文章库(维基百科)中训练短语模型



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

  1. 从frwiki-YYYYYMMD-页面-文章.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类中的一些与内存相关的参数。

因此,首先我将max_vocab_size除以2,这样它应该会消耗更少的内存,而且我决定每10万篇文章保存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对象中后,最终得到了412816个短语集。

最新更新