将 Spacy 文档的一部分提取为新文档

Extracting a part of a Spacy document as a new document

我有一个相当长的文本被 Spacy 解析为 Doc 实例:

import spacy

nlp = spacy.load('en_core_web_lg')
doc = nlp(content)

doc这里变成了Doc class instance

现在,由于文本很大,我想在 Jupyter notebook 中仅使用文档的一部分进行处理、实验和可视化——例如,前 100 个句子。

如何从现有文档的一部分切片并创建新的 Doc 实例?

实现您的目的的一种相当丑陋的方法是构建句子列表并从句子的子集构建新文档。

sentences = [sent.string.strip() for sent in doc.sents][:100]
minidoc = nlp(' '.join(sentences))

感觉应该有更好的解决方案,但我想这至少有效。

个人比较喜欢按字符切片。 Spacy 的句子分割对于结构化文本非常好,但对于结构化文本较差的文本,以固定速率(即按字符)抓取一堆文本更可预测:

char_end = 200
subdoc = nlp(doc.text[:char_end])

Span 对象 (https://spacy.io/api/span#as_doc) 上使用 as_doc() 有一个更好的解决方案:

nlp = spacy.load('en_core_web_lg')
content = "This is my sentence. And here's another one."
doc = nlp(content)
for i, sent in enumerate(doc.sents):
    print(i, "a", sent, type(sent))
    doc_sent = sent.as_doc()
    print(i, "b", doc_sent, type(doc_sent))

给出输出:

0 a This is my sentence. <class 'spacy.tokens.span.Span'>   
0 b This is my sentence.  <class 'spacy.tokens.doc.Doc'>   
1 a And here's another one.  <class 'spacy.tokens.span.Span'>   
1 b And here's another one.  <class 'spacy.tokens.doc.Doc'>

(为清晰起见,完整写出代码片段 - 当然可以进一步缩短)