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

Python 如何将大型数据集加载到gensim word2vec模型,python,iterator,gensim,word2vec,Python,Iterator,Gensim,Word2vec,所以我有多个文本文件(大约40个)。每个文件大约有2000篇文章(平均每个500字)。每个文档都是文本文件中的一行 由于内存的限制,我想使用这些文本文件的动态加载来进行训练。(可能是迭代器类?) 那我该怎么做呢 训练每个文本文件->保存模型->加载模型并重新运行新数据 迭代器类有没有办法自动完成这项工作 我应该一句一句地、一篇一篇地或一个文本文件一个文本文件地输入到模型训练中吗 一个由40个文本文件*2000篇文章*500个单词组成的语料库总计约为40000000个单词,这对于此类工作来说仍然

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

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

那我该怎么做呢

  • 训练每个文本文件->保存模型->加载模型并重新运行新数据
  • 迭代器类有没有办法自动完成这项工作
  • 我应该一句一句地、一篇一篇地或一个文本文件一个文本文件地输入到模型训练中吗

一个由40个文本文件*2000篇文章*500个单词组成的语料库总计约为40000000个单词,这对于此类工作来说仍然相当小。我猜磁盘上的未压缩内存不足400MB。即使是RAM的4倍,许多桌面或云计算机也可以轻松地将1-2GB的文本作为Python对象处理,作为字符串标记列表。因此,根据您的系统,您仍然可以自由地在内存中工作

但如果您不这样做,那也没关系,因为gensim
Word2Vec
&相关类可以轻松地从依次提供每个项目的任何可编辑序列中获取所有培训数据,而且这些可编辑文件实际上可以在每次需要数据时逐行读取一个或多个文件中的文本

大多数gensim简介
Word2Vec
教程都将通过示例代码(或库实用程序的使用)来演示这一点,以从一个或多个文件中读取

例如,gensim的included
LineSequence
类可以用单个文本文件的路径实例化,其中每行是一个文本/句子,每个单词之间用单个空格分隔。结果对象是一个PythonIterable序列,可以根据需要多次迭代以获得这些单词列表。(在幕后,它每次都会打开并流式读取文件,因此每次只需在RAM中读取当前文本即可。)

早期的gensim
Word2Vec
教程–显示了一个简短的
myentenses
Python类,它对单个目录中的所有文件执行相同的操作:

类mycentenses(对象):
定义初始化(self,dirname):
self.dirname=dirname
定义(自我):
对于os.listdir(self.dirname)中的fname:
对于打开的行(os.path.join(self.dirname,fname)):
收益线分割()
句子=mycentenses('/some/directory')#一个内存友好型的iterable
model=gensim.models.Word2Vec(句子)
对于
Word2Vec
,是否逐句、逐段或逐篇提供文本并不重要。驱动结果的是附近单词的较小窗口,而不是您选择传递给算法的“块”。所以,做最简单的事。(但是,通过当前的gensim-3.8.3版本,在gensim版本中避免一次超过10000个单词的块,因为内部限制将丢弃每个文本超过10000个标记的单词。)


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

如果我理解正确,上面提供的代码示例将逐行输入模型,从而选择该行作为附近单词的窗口,用于为该行中的单词训练向量,对吗?我主要担心的是,如果附近单词窗口的定义不同,则一个文件的最后一行中的单词可能被视为与读取的下一个文件的第一行中的单词相邻,这当然没有意义。
Word2Vec
code/算法只将同一文本示例中的相邻单词视为彼此上下文中的单词。在这里,每行有一个示例,作为序列中的一项,它是一个令牌列表。任何一行中的最后一个字都不会影响同一文件中的下一行,更不用说下一个文件中的第一行了。此外:即使有这样的重叠,如果相邻的文本没有关联,这样的重叠只会给训练增加一些不必要的噪音,并且不太可能对最终结果产生太大的影响,特别是如果文本有几十或几百个单词长。也就是说,真正的信号或真正的关系会淹没掉那一点点额外的噪音。如果您有疑问,您可以对此进行测试:继续&在
yield
ed的每个项目中明确地添加上一篇/下一篇文章中的一些垃圾词,并评估结果。你可能会看到稍微长一点的训练(总共更多的单词),但在质量上几乎没有任何差别。