Сегментация предложений с использованием Spacy - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в Spacy и НЛП. Столкнувшись с проблемой ниже при выполнении сегментации предложений с использованием Spacy.

Текст, который я пытаюсь разбить на предложения, содержит нумерованные списки (с пробелом между нумерацией и реальным текстом). Как ниже.

import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
    print(sentence.text)

Вывод (1., 2., 3. Рассматриваются как отдельные строки):

This is first sentence.

Next is numbered list.

1.
Hello World!

2.
Hello World2!

3.
Hello World!

Но если между нумерацией и реальным текстом нет пробела, то токенизация предложения - это хорошо. Как ниже

import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1.Hello World!\n2.Hello World2!\n3.Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
    print(sentence.text)

Выход (желательно):

This is first sentence.

Next is numbered list.

1.Hello World!

2.Hello World2!

3.Hello World!

пожалуйста, предложите, можем ли мы настроить детектор предложений для этого.

1 Ответ

0 голосов
/ 27 сентября 2018

Когда вы используете предварительно подготовленную модель с пространством, предложения разделяются на основе данных обучения, которые были предоставлены во время процедуры обучения модели.

Конечно, есть такие случаи, как ваш, когда кто-то захочет использовать собственную логику сегментации предложений. Это возможно путем добавления компонента в просторный конвейер.

Для вашего случая вы можете добавить правило, которое предотвращает разбиение предложения, когда есть {число}. шаблон.

Обходной путь для вашей проблемы:

import spacy
import re

nlp = spacy.load('en')
boundary = re.compile('^[0-9]$')

def custom_seg(doc):
    prev = doc[0].text
    length = len(doc)
    for index, token in enumerate(doc):
        if (token.text == '.' and boundary.match(prev) and index!=(length - 1)):
            doc[index+1].sent_start = False
        prev = token.text
    return doc

nlp.add_pipe(custom_seg, before='parser')
text = u'This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!'
doc = nlp(text)
for sentence in doc.sents:
    print(sentence.text)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...