批量运行大型文档的spaCy nlp()管道



我正在尝试在一系列总计 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)

有关更多详细信息,请参阅此处的文档。

最新更新