使用 spacy Sentenizer 进行句子分割

piy*_*ush 8 nlp python-3.x spacy

我正在使用 spaCy 的句子分割器来分割句子。

from spacy.lang.en import English
nlp = English()
sbd = nlp.create_pipe('sentencizer')
nlp.add_pipe(sbd)

text="Please read the analysis. (You'll be amazed.)"
doc = nlp(text)

sents_list = []
for sent in doc.sents:
   sents_list.append(sent.text)

print(sents_list)
print([token.text for token in doc])
Run Code Online (Sandbox Code Playgroud)

输出

['Please read the analysis. (', 
"You'll be amazed.)"]

['Please', 'read', 'the', 'analysis', '.', '(', 'You', "'ll", 'be', 
'amazed', '.', ')']
Run Code Online (Sandbox Code Playgroud)

标记化已正确完成,但我不确定它是否将第二句与 ( 分开,并将其作为第一句的结尾。

piy*_*ush 5

我已经使用 en_core_web_lg 和 en_core_web_sm 模型测试了下面的代码,并且 sm 模型的性能与使用 Sentencizer 类似。(lg 型号会影响性能)。

以下自定义边界仅适用于 sm 模型,并且与 lg 模型表现不同的分割。

nlp=spacy.load('en_core_web_sm')
def set_custom_boundaries(doc):
    for token in doc[:-1]:
        if token.text == ".(" or token.text == ").":
            doc[token.i+1].is_sent_start = True
        elif token.text == "Rs." or token.text == ")":
            doc[token.i+1].is_sent_start = False
    return doc

nlp.add_pipe(set_custom_boundaries, before="parser")
doc = nlp(text)

for sent in doc.sents:
 print(sent.text)
Run Code Online (Sandbox Code Playgroud)


aab*_*aab 1

这sentencizer是一个非常快但也非常小的句子分割器,对于像这样的标点符号不会有良好的性能。它非常适合将文本分割成类似句子的块,但如果您需要更高质量的句子切分,请使用parser英语模型的组件进行句子切分。