使用spacy句子分割器进行句子拆分

8
我正在使用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])

输出

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

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

标记化是正确进行的,但我不确定它是否没有将第二个句子与括号一起分裂,并将其作为第一个句子的结束。

2个回答

4

我已经使用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)

在add_pipe中包含before="parser"的具体原因是什么? - usr_lal123
你希望在分析句子边界之前进行句子拆分。 - batgirl

1

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


根据Spacy文档 - Sentencizer允许您实施一种更简单的基于规则的策略,而无需加载统计模型。https://spacy.io/api/sentencizer#_title。如果使用自定义组件,我必须像这样加载模型 - spacy.load(“en_core_web_sm”)。这样做会引起任何性能问题吗?因为我在聊天机器人项目中使用这个Sentencizer,在非常短的时间内拆分和返回响应给用户。 - piyush
是的,解析器会慢很多,但任何更准确的方法都会更慢。如果您没有太多额外的规则/情况需要处理,并且它们不太复杂,您也可以轻松创建自己的基于规则的句子分割组件。(我想实现一个统计模型用于句子分割,速度和准确性介于句子分割器和解析器之间,但目前只是一个草图。) - aab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接