如何将大数据集加载到gensim word2vec模型

lit*_* JJ 6 python iterator gensim word2vec

所以我有多个文本文件(大约 40 个)。每个文件大约有 2000 篇文章(平均每篇 500 字)。每个文档都是文本文件中的一行。

因此,由于内存限制,我想使用这些文本文件的动态加载来进行训练。(也许是一个迭代器类?)

那么我该如何进行呢?

  • 训练每个文本文件 -> 保存模型 -> 加载模型并在新数据上重新运行?
  • 迭代器类有没有办法自动执行此操作?
  • 我应该逐句、逐篇文章或逐个文本文件作为模型训练的输入吗?

goj*_*omo 4

语料库40 text files * 2000 articles * 500 words each总计约 40000000 个单词,对于此类工作来说仍然很小。我猜磁盘上未压缩的大小不到 400MB。即使在 RAM 中是 4 倍,许多桌面或云计算机也可以轻松地将 1-2GB 的文本作为 Python 对象、字符串令牌列表来处理。因此,根据您的系统,您可能仍然可以自由地在内存中工作。

\n

但如果你不这样做,那也没关系,因为 gensimWord2Vec和相关类可以轻松地从依次提供每个项目的任何可迭代序列中获取所有训练数据,并且此类可迭代对象实际上可以逐行读取文本每次需要数据时,从一个或多个文件 \xe2\x80\x93 中获取数据。

\n

大多数 gensim 介绍Word2Vec教程都会演示这一点,并使用示例代码(或库实用程序的使用)来读取一个或多个文件。

\n

例如,gensim 包括LineSentence类可以使用单个文本文件的路径进行实例化,其中每一行都是一个文本/句子,并且单个空格分隔每个单词。生成的对象是一个 Python 可迭代序列,可以根据需要多次迭代以获取这些单词列表。(在幕后,它每次都会打开并流式读取文件,因此 RAM 中一次不需要多于当前文本。)

\n

早期的 gensimWord2Vec教程 \xe2\x80\x93 https://rare-technologies.com/word2vec-tutorial/ \xe2\x80\x93 显示了一个简短的MySentencesPython 类,它对单个目录中的所有文件执行相同的操作:

\n
class MySentences(object):\n    def __init__(self, dirname):\n        self.dirname = dirname\n \n    def __iter__(self):\n        for fname in os.listdir(self.dirname):\n            for line in open(os.path.join(self.dirname, fname)):\n                yield line.split()\n \nsentences = MySentences(\'/some/directory\') # a memory-friendly iterable\nmodel = gensim.models.Word2Vec(sentences)\n
Run Code Online (Sandbox Code Playgroud)\n

对于Word2Vec,如果您逐句、逐段或逐篇提供文本并不重要。驱动结果的是附近单词的较小窗口,而不是您选择传递给算法的“块”。所以,做最简单的事情。(但是,通过当前的 gensim-3.8.3 版本,请避免在 gensim 版本中一次使用超过 10000 个单词的块,因为内部限制将丢弃每个文本超过 10000 个标记的单词。)

\n

但是,不要自己对一个批次进行所有训练,然后对另一批次进行所有训练,依此类推。最好将所有数据合并到一个迭代中。然后,参考所有示例进行初始词汇发现,并通过最适合模型收敛的自动多次训练通道 \xe2\x80\x93 一起训练所有示例。(您希望所有早期训练都在一组示例中,然后所有后期训练都在另一组示例中,因为这会平衡示例的相对影响,并阻止模型考虑每次优化过程中都有各种训练数据。)

\n