我正在尝试在一系列总计 20,211,676 个字符的成绩单上运行 nlp(( 管道。我在一台具有 8gb RAM 的机器上运行。我对Python和spaCy都很陌生,但是语料库比较工具和句子分块功能非常适合我现在正在写的论文。
我尝试过什么
我从导入英语管道并删除"ner"以获得更快的速度开始
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)
但是我收到错误消息:
类型错误:序列项 0:预期的 str 实例, spacy.tokens.doc.Doc 找到
我意识到我可以转向字符串和连接,但这会破坏使用"令牌"对象的目的。
我需要什么
除了使用 AWS 昂贵的 CPU 时间之外,我能做些什么来拆分我的文档、运行 nlp(( 管道,然后加入令牌以重建我的完整文档作为研究对象?我是否为大型文档运行了错误的管道?我注定要在某个地方获得 64gb RAM 吗?
编辑1:对翁根茨的回应
(1(这是我收到的错误消息
值错误: [E088] 长度1071747的文本超过最大值 1000000。 v2.x 解析器和 NER 模型需要大约 1GB 的临时内存 输入中每 100,000 个字符。这意味着长文本可能会导致 内存分配错误。如果您没有使用解析器或 NER,它是 增加 NLP.max_length 限制可能是安全的。限制在 字符数,因此您可以检查输入是否太 通过检查 len(文本(进行长。
我找不到直接引用此文档的部分。
(2(我的目标是做一系列措施,包括(但不限于如果需要(:词频,tfidf计数,句子计数,计数最频繁的名词块,使用w2v或d2v策略比较两个语料库。 我的理解是,除了 Ner 之外,我需要 spaCy 管道的每个部分。
(3(你关于剪切文档是完全正确的,在一个完美的世界里,我会用换行符来剪掉。但正如你提到的,我不能使用 join 来重新组合我分离的语料库,所以它可能无关紧要。
您需要使用Doc.from_docs
方法连接生成的Doc
:
docs = []
for piece in split_text:
doc = nlp(piece)
docs.append(doc)
merged = Doc.from_docs(docs)
有关更多详细信息,请参阅此处的文档。