nlp = spacy.load('en_core_web_lg', disable = ['ner'])
然后我将语料库分成800,000个字符的片段,因为spaCy建议每GB处理100,000个字符。
split_text = [text[i:i+800000] for i in range(0, len(text), 800000)]
将这些代码块通过流水线循环处理,创建NLP对象列表。
nlp_text = []
for piece in split_text:
piece = nlp(piece)
nlp_text.append(piece)
需要经过长时间等待才能正常工作。 注意: 我尝试通过'nlp.max_length'提高阈值,但是超过1,200,000后,我的Python会话就崩溃了。
现在,我已经将所有内容传输完毕,需要将它们拼接起来,因为最终需要将整个文档与另一个(大小大致相当)进行比较。此外,我还想找出整个文档中最常见的名词短语,而不仅仅是在人为分割的800,000字符片段中。
nlp_text = ''.join(nlp_text)
然而我收到了以下错误信息:
TypeError:序列项0:期望str实例, 找到spacy.tokens.doc.Doc
我意识到我可以将其转换为字符串并进行连接,但这将违背使用“token”对象的目的。
我需要什么
除了使用昂贵的AWS CPU时间外,是否有其他方法(分割文档,运行nlp()管道,然后加入标记以重建完整的文档作为研究对象)? 我是否对大型文档运行管道有误?我是否注定要在某个地方获得64GB RAM?
编辑1:对Ongenz的回复
(1) 这是我收到的错误消息
ValueError:长度为1071747的文本超过了1000000的最大值。 v2.x解析器和NER模型需要每100,000个字符输入大约1GB的临时内存。 这意味着长文本可能会导致内存分配错误。 如果您没有使用解析器或NER,则可能可以安全地增加nlp.max_length限制。 限制是字符数,因此您可以通过检查len(text)来检查输入是否太长。
我无法找到直接涉及此问题的文档部分。
(2) 我的目标是进行一系列措施,包括(但不限于如有需要):单词频率,tfidf计数,句子计数,最常见名词短语的计数,使用w2v或d2v策略比较两个语料库。 为此,我理解我需要spaCy管道的每个部分,除了NER。
(3) 您完全正确关于切割文档,在完美的世界中,我将在换行符上切割。但正如您所提到的,我不能使用join来重新组合我的拆开的语料库,因此可能无关紧要。
join
函数(文档)以可迭代对象(例如字符串或字符串对象列表)作为参数,并且您传递了一个 spaCy 的Doc
对象列表。您在这里要做的事情取决于您想要做的处理方式(我猜您不想使用join
)。 - ongenz