所以我有多个文本文件(大约40个(。每个文件大约有2000篇文章(平均每个500字(。每个文档都是文本文件中的一行。
因此,由于内存限制,我想使用这些文本文件的动态加载进行训练。(也许是迭代器类?(
那么我该怎么做呢?
- 训练每个文本文件->保存模型->加载模型并根据新数据重新运行
- 迭代器类有没有一种方法可以自动做到这一点
- 我应该一句接一句、一篇接一篇或一个接一个的文本文件作为模型训练的输入吗
40 text files * 2000 articles * 500 words each
的语料库总共约等于40000000个单词,对于这类工作来说仍然很小。我想这是低于400MB,未压缩,在磁盘上。即使是RAM的4倍,许多桌面或云机器也可以轻松地将1-2GB的文本作为Python对象,作为字符串标记列表来处理。因此,根据你的系统,你可能仍然可以自由地在记忆中工作。
但如果你不这样做,那没关系,因为gensimWord2Vec
&相关类可以很容易地从任何依次提供每个项的可迭代序列中获取所有训练数据,而这样的iterables实际上可以在每次需要数据时从一个或多个文件中逐行读取文本。
大多数gensim introWord2Vec
教程都会演示这一点,并提供从一个或多个文件中读取的示例代码(或库实用程序的使用(。
例如,gensim包含的LineSentence
类可以用单个文本文件的路径实例化,其中每行是一个文本/句子,单个空格分隔每个单词。生成的对象是一个Python可迭代序列,可以根据需要多次迭代以获得这些单词列表。(在幕后,它每次都会打开并流式读取文件,所以一次只需要在RAM中存储当前文本。(
早期gensimWord2Vec
教程——https://rare-technologies.com/word2vec-tutorial/–显示了一个简短的MySentences
Python类,该类对单个目录中的所有文件执行相同的操作:
class MySentences(object):
def __init__(self, dirname):
self.dirname = dirname
def __iter__(self):
for fname in os.listdir(self.dirname):
for line in open(os.path.join(self.dirname, fname)):
yield line.split()
sentences = MySentences('/some/directory') # a memory-friendly iterable
model = gensim.models.Word2Vec(sentences)
对于Word2Vec
,是否逐句、逐段或逐篇提供文本并不重要。驱动结果的是附近单词的较小窗口,而不是你选择传递给算法的"块"。所以,做任何最简单的事。(但是,在当前的gensim-3.8.3版本中,避免在gensim版本中一次超过10000个单词的块,因为内部限制将丢弃每个文本超过10000个标记的单词。(
然而,不要自己对一个批次进行所有训练,然后对另一个批次执行所有训练,等等。将所有数据组合成一个可迭代数据是最好的。然后,在自动多次训练过程中,咨询所有示例以进行初始词汇发现,并将所有示例一起训练——这最有利于模型收敛。(您不希望所有早期训练都在一组示例中,然后所有后期训练都在不同的示例中,因为这会使示例的相对影响不平衡,并阻止模型在每个优化过程中考虑各种各样的训练数据。(