Как разбить документ на предложения с помощью Spacy

Как я могу разбить документ (например, абзац, книгу и т. д.) на предложения.

Например, "The dog ran. The cat jumped" в ["The dog ran", "The cat jumped"] с пробелом?


person Ulad Kasach    schedule 19.09.2017    source источник
comment
с базовым питоном: my_string.split(".")   -  person Julien    schedule 19.09.2017
comment
@Julien смотрите обновленный вопрос. Я не имел в виду буквально. Собака побежала. Кот прыгнул. Предположим, мистер Бакстер съел огурец.   -  person Ulad Kasach    schedule 19.09.2017


Ответы (4)


Актуальный ответ таков:

from __future__ import unicode_literals, print_function
from spacy.lang.en import English # updated

raw_text = 'Hello, world. Here are two sentences.'
nlp = English()
nlp.add_pipe(nlp.create_pipe('sentencizer')) # updated
doc = nlp(raw_text)
sentences = [sent.string.strip() for sent in doc.sents]
person npit    schedule 23.04.2019
comment
Если в предложении есть и т. д., оно терпит неудачу. - person Aman Dalmia; 14.04.2020
comment
При этом для разделения предложений используется метод, основанный на правилах, а не статистическая модель. В моем случае использование en_core_web_sm работало лучше, а en_core_web_lg еще лучше, и достаточно быстро для моих нужд. См. ответ KB_. - person dbenton; 24.05.2020
comment
На самом деле в spacy 3.0 синтаксис теперь nlp.add_pipe('sentencizer'), как отмечает @user8189050. - person smci; 13.03.2021
comment
spacy 3.0.6: изменить sent.string.strip() на sent.text.strip() - person Thang M. Pham; 29.06.2021

Взято с страницы поддержки spacy на github.

from __future__ import unicode_literals, print_function
from spacy.en import English

raw_text = 'Hello, world. Here are two sentences.'
nlp = English()
doc = nlp(raw_text)
sentences = [sent.string.strip() for sent in doc.sents]
person Ulad Kasach    schedule 19.09.2017
comment
Этот ответ устарел по состоянию на 2019 год (SpaCy 2.1.8). npit@ ответ лучше. - person ywat; 01.11.2019

Ответить

import spacy
nlp = spacy.load('en_core_web_sm')

text = 'My first birthday was great. My 2. was even better.'
sentences = [i for i in nlp(text).sents]

Дополнительная информация
Предполагается, что вы уже установили модель "en_core_web_sm" в своей системе. Если нет, вы можете легко установить его, выполнив следующую команду в своем терминале:

$ python -m spacy download en_core_web_sm

(Обзор всех доступных моделей см. здесь.)

В зависимости от ваших данных это может привести к лучшим результатам, чем просто использование spacy.lang.en.English. Один (очень простой) пример сравнения:

import spacy
from spacy.lang.en import English

nlp_simple = English()
nlp_simple.add_pipe(nlp_simple.create_pipe('sentencizer'))

nlp_better = spacy.load('en_core_web_sm')


text = 'My first birthday was great. My 2. was even better.'

for nlp in [nlp_simple, nlp_better]:
    for i in nlp(text).sents:
        print(i)
    print('-' * 20)

Выходы:

>>> My first birthday was great.
>>> My 2.
>>> was even better.
>>> --------------------
>>> My first birthday was great.
>>> My 2. was even better.
>>> --------------------
person KB_    schedule 16.04.2020

В spacy 3.0.1 они изменили конвейер.

from spacy.lang.en import English 

nlp = English()
nlp.add_pipe('sentencizer')


def split_in_sentences(text):
    doc = nlp(text)
    return [str(sent).strip() for sent in doc.sents]
person user8189050    schedule 02.02.2021
comment
Это должен быть принятый ответ, начиная с spacy 3.0. - person smci; 13.03.2021