【问题标题】:Sentence split using spacy sentenizer使用 spacy sentenizer 拆分句子
【发布时间】:2019-10-23 06:33:16
【问题描述】:

我正在使用 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', '.', ')']

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

【问题讨论】:

    标签: python-3.x nlp spacy


    【解决方案1】:

    我用 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" 的任何具体原因?
    • 您希望在解析跨越句子边界之前进行句子拆分。
    【解决方案2】:

    sentencizer 是一个非常快速但也非常简单的句子拆分器,在这样的标点符号下不会有很好的性能。将文本拆分成句子块很有用,但如果您需要更高质量的句子分割,请使用英语模型的parser 组件进行句子分割。

    【讨论】:

    • 根据 spacy 文档 - Sentencizer 可让您实现更简单、基于规则的策略,无需加载统计模型。 spacy.io/api/sentencizer#_title.if 使用自定义组件我必须加载模型,例如 - spacy.load("en_core_web_sm")。它会导致任何性能问题,因为我在聊天机器人项目中使用这个 Sentencizer,响应被拆分并在很短的时间内返回给用户?
    • 是的,解析器会慢很多,但任何更准确的方法都会变慢。如果您没有太多额外的规则/案例要处理并且它们不是太复杂,您还可以非常轻松地创建自己的基于规则的句子组件。 (我想实现一个句子分割的统计模型,在速度和准确性方面介于句子分析器和解析器之间,但这只是一个草图。)
    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多