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

时间:2017-11-30 18:31:07

标签: python nlp document spacy

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

import spacy

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

doc此处变为Doc class instance

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我的个人喜好将按字符进行切片。 Spacy的句子分段对于结构化文本非常好,但是对于结构性较差的文本,以固定的速率(即按字符)抓取一堆文本则更具可预测性:

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

答案 2 :(得分:0)

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

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'>

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