2 回答
TA贡献1811条经验 获得超5个赞
test_02问题是,一次处理的内容,中间数据结构不适合内存。分块处理应该可以解决问题。例如,如果句子从不在行之间拆分,则渐进处理将如下所示:
with open("test_02", "r") as ftest, open("sentences.txt", "w") as f:
for line in ftest:
for sent in nlp(line).sents:
f.write(str(sent)+"\n")
由于句子可以跨越多行,您可能希望使用不同的拆分策略test_02,例如通过双换行符来拆分for line in ftest.read().split('\n\n'),但很可能即使这种天真的方法也能正常工作。
TA贡献1865条经验 获得超7个赞
你的直接原因MemoryError
是将很多不需要的东西加载到内存中。
首先,整个test_02
文件作为一个巨大的字符串被放入可寻址内存中。(你必须有很多内存,因为这一步对很多人来说都会失败!)
用空格替换所有换行符——为什么,确切地说?– 可能会暂时加倍内存需求,因为.replace()
返回一个副本。(不过,令人惊讶的是,你还没有耗尽记忆力。)
然后,要求 Spacy 解析大量文本——Spacy 的解析本身通常是一个复杂的步骤——触发了 Spacy 代码深处的错误。(但是,如果运气好或扩展系统内存没有触发错误,那么您的下一行可能会尝试创建所有 . 的堆内列表.sents
。)
好消息是:您可能不需要执行任何这些操作。尽管 gensim 的参数名称为Word2Vec
, sentences
,但它实际上并不需要合法的句子。它只需要文本,其中每个文本都是一个字符串标记列表。(这些可以是许多段落的完整文章/文档,或其他任何内容。word2vec 的某些用法甚至会留下标点符号作为伪词。)
您的test_02
文件,如果它已经被标记为您想要的“单词”,其中每一行都是合理大小的文本并且单词由单个空格分隔,则可能已经准备好传递给Word2Vec
. 尝试...
from gensim.models.word2vec import LineSentence corpus = LineSentence('test_02')
..然后corpus
作为sentences
参数提供给Word2Vec
. 如果实际上您test_02
需要更复杂的预处理/标记化,请先执行此操作,如果您需要那种复杂程度,则可以使用 Spacy,然后创建一个文件,每行一个文本和以空格分隔的标记。
在任何时候都没有必要将整个语料库加载到单个堆内字符串或列表中;它可以而且几乎总是应该根据需要从磁盘流式传输,以避免消耗太多主内存。
添加回答
举报