确定spacy中的文本提取是否是完整的句子

时间:2018-05-21 18:43:51

标签: python nlp

我们正在处理从PDF中提取的句子。问题是它包括标题,页脚,目录等。有没有办法确定我们在将文档传递给spacy时得到的句子是完整的句子。有没有办法过滤部分句子,如标题

3 个答案:

答案 0 :(得分:1)

一个完整的句子至少包含一个主语,一个谓语,一个宾语,并以标点符号结尾。 主语和宾语几乎都是名词,谓词总是动词。

因此,您需要检查句子中是否包含两个名词,一个动词并以标点符号结尾:

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("I. Introduction\nAlfred likes apples! A car runs over a red light.")
for sent in doc.sents:
    if sent[0].is_title and sent[-1].is_punct:
        has_noun = 2
        has_verb = 1
        for token in sent:
            if token.pos_ in ["NOUN", "PROPN", "PRON"]:
                has_noun -= 1
            elif token.pos_ == "VERB":
                has_verb -= 1
         if has_noun < 1 and has_verb < 1:
             print(sent.string.strip())

更新

我还建议检查句子是否以大写字母开头,我在代码中添加了修改。此外,我想指出的是,我写的内容适用于英语和德语,不知道其他语言的情况。

答案 1 :(得分:0)

尝试在每个句子中查找第一个名词块。通常(但并非总是)是句子的标题主题。

sentence_title = [chunk.text for chunk in doc.noun_chunks][0]

答案 2 :(得分:0)

您可以使用 Spacy 中的可训练管道组件执行句子分割。 https://spacy.io/api/sentencerecognizer

另外,如果你能在文本字符串中想出一些模式,那么使用 python regex 库 re https://docs.python.org/3/library/re.html