Gab*_*ela 5 nlp python-3.x spacy
我正在尝试在一系列总计 20,211,676 个字符的成绩单上运行 nlp() 管道。我在一台 8GB RAM 的机器上运行。我对 Python 和 spaCy 都很陌生,但是语料库比较工具和句子分块功能非常适合我现在正在处理的论文。
我试过的
我已经开始导入英语管道并删除 'ner' 以获得更快的速度
nlp = spacy.load('en_core_web_lg', disable = ['ner'])
Run Code Online (Sandbox Code Playgroud)
然后我将语料库分解为 800,000 个字符,因为 spaCy 建议每 GB 100,000 个字符
split_text = [text[i:i+800000] for i in range(0, len(text), 800000)]
Run Code Online (Sandbox Code Playgroud)
通过管道循环这些片段并创建一个 nlp 对象列表
nlp_text = []
for piece in split_text:
piece = nlp(piece)
nlp_text.append(piece)
Run Code Online (Sandbox Code Playgroud)
经过长时间的等待后才有效。注意:我尝试通过“nlp.max_length”提高阈值,但任何高于 1,200,000 的值都会中断我的 Python 会话。
现在我已经通过管道传输了所有内容,我需要将所有内容连接回去,因为我最终需要将整个文档与另一个文档(大小大致相同)进行比较。此外,我有兴趣在整个文档中找到最常用的名词短语,而不仅仅是在人为的 800,000 个字符中。
nlp_text = ''.join(nlp_text)
Run Code Online (Sandbox Code Playgroud)
但是我收到错误消息:
类型错误:序列项 0:预期的 str 实例,找到了 spacy.tokens.doc.Doc
我意识到我可以转向字符串和连接,但这会破坏使用“令牌”对象的目的。
我需要的
我可以做些什么(除了使用 AWS 昂贵的 CPU 时间)来拆分我的文档,运行 nlp() 管道,然后加入令牌以将我的完整文档重建为研究对象?我是否为大文档运行了错误的管道?我注定要在某处获得 64GB RAM 吗?
编辑 1:对 Ongenz 的回应
(1) 这是我收到的错误信息
ValueError: [E088] 长度为 1071747 的文本超过了 1000000 的最大值。v2.x 解析器和 NER 模型在输入中每 100,000 个字符需要大约 1GB 的临时内存。这意味着长文本可能会导致内存分配错误。如果您不使用解析器或 NER,增加 nlp.max_length 限制可能是安全的。限制是字符数,因此您可以通过检查 len(text) 来检查您的输入是否太长。
我找不到直接引用此文档的一部分。
(2)我的目标是做一系列的措施,包括(但不限于如果需要):词频、tfidf计数、句子计数、计数最频繁的名词块、使用w2v或d2v策略比较两个语料库。我的理解是,除了 Ner 之外,我需要 spaCy 管道的每个部分。
(3) 你关于剪切文档是完全正确的,在一个完美的世界中,我会在换行符上剪切。但是正如你提到的,我不能使用 join 来重新组合我破碎的语料库,所以无论如何它可能都不相关。
Doc您需要使用以下方法加入结果s Doc.from_docs:
docs = []
for piece in split_text:
doc = nlp(piece)
docs.append(doc)
merged = Doc.from_docs(docs)
Run Code Online (Sandbox Code Playgroud)
请参阅此处的文档了解更多详细信息。