Python 3.x 批量运行spaCy nlp()管道处理大型文档

Python 3.x 批量运行spaCy nlp()管道处理大型文档,python-3.x,nlp,spacy,Python 3.x,Nlp,Spacy,我试图在一系列总计20211676个字符的转录本上运行nlp()管道。我在一台8gb内存的机器上运行。我对Python和spaCy都很陌生,但语料库比较工具和句子组块功能非常适合我现在正在撰写的论文 我尝试过的 我已经开始导入英语管道并删除“ner”以加快速度 nlp = spacy.load('en_core_web_lg', disable = ['ner']) 然后我将语料库分解为800000个字符,因为spaCy建议每gb 100000个字符 split_text = [text[i:

我试图在一系列总计20211676个字符的转录本上运行nlp()管道。我在一台8gb内存的机器上运行。我对Python和spaCy都很陌生,但语料库比较工具和句子组块功能非常适合我现在正在撰写的论文

我尝试过的

我已经开始导入英语管道并删除“ner”以加快速度

nlp = spacy.load('en_core_web_lg', disable = ['ner'])
然后我将语料库分解为800000个字符,因为spaCy建议每gb 100000个字符

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”提高阈值,但超过1200000会中断我的python会话

现在我已经通过管道传输了所有内容,我需要将所有内容连接回来,因为我最终需要将整个文档与另一个文档(大小大致相同)进行比较。此外,我还想在整个文档中找到最常见的名词短语,而不仅仅是人工生成的800000个字符

nlp_text = ''.join(nlp_text)
但是,我收到了错误消息:

TypeError:序列项0:应为str实例, 找到spacy.tokens.doc.doc

我意识到我可以使用字符串和连接,但这会破坏使用“令牌”对象的目的

我需要什么

我能做些什么(除了使用AWS昂贵的CPU时间)来拆分我的文档、运行nlp()管道,然后加入令牌以重构我的完整文档作为研究对象?对于一个大文档,我是否运行了错误的管道?我注定要得到64gb的内存吗

编辑1:对Ongenz的回应

(1) 这是我收到的错误消息

ValueError:[E088]长度为1071747的文本超过最大值1000000。 v2.x解析器和NER模型需要大约1GB的临时内存 每输入100000个字符。这意味着长文本可能会导致 内存分配错误。如果您没有使用解析器或NER,那么 增加nlp.max_长度限制可能是安全的。限制在 字符数,以便检查输入是否太多 通过检查len(文本)来延长

我在文档中找不到直接提到这一点的部分

(2) 我的目标是做一系列的测量,包括(但不限于,如果需要的话):单词频率,tfidf计数,句子计数,最频繁的名词组块计数,使用w2v或d2v策略比较两个语料库。 我的理解是,我需要spaCy管道的每个部分,除了Ner之外


(3) 关于剪切文档,你是完全正确的,在一个完美的世界里,我会在换行时剪切。但正如您所提到的,我无法使用join重新组合我的分离语料库,因此它可能无论如何都不相关。

您好,您想做什么处理?只是句子标记?单词标记化?或者您还需要词性标记和依赖项解析吗?你能在spaCy文档中发布相关章节,上面写着“spaCy建议每gb 100000个字符”吗?另外,
join
函数()将一个iterable(例如字符串或字符串对象列表)作为参数,并向其传递一个spaCy
Doc
对象列表。您在此处执行的操作将取决于您想要执行的处理(我怀疑您不想使用
join
)。按照设置长度的字符序列拆分文档将有可能将单词一分为二-这对您有影响吗?如果你的文本确实太大,你可以先用一种不太“残酷”的方法(例如,用换行符代替字符)将其预处理成较小的文件。谢谢你的回答ongenz:我编辑了这篇文章以反映你的问题。