Как отключить расщепление предложений в скобках с помощью Spacy? - PullRequest
0 голосов
/ 20 мая 2019

У меня есть такая группа предложений в одном кадре:

"(T1) Клен - упал. (T2, T3 и T4) Пепел - удаление нависающих конечностей с соседских деревьев. (T5) Серебряная береза ​​- упал. (T6) Хвойное дерево - уменьшить высоту примерно на 1 м и уменьшить разброс примерно на 0.5м. (T7) Вишневая - корона уменьшена до внутреннего полога (примерно на 50%) (T8) Дуб - корона уменьшается примерно на 1 м в целом - церковь Knowle Заповедник "

Когда я использую следующий код:

sent = nlp(s)
for s in sent.sents:
    print(s)

Я получаю вывод - разделение предложений:

(T1)

Клен - упал.

(T2, T3 и T4)

Пепел - удаление нависающих конечностей с соседских деревьев.

(T5) * * одна тысяча двадцать одна

Серебряная береза ​​- упал.

(T6) Хвойное дерево - уменьшить высоту примерно на 1 м и уменьшить разброс примерно на 0,5 м.

(Т7)

Вишня - корона уменьшена до внутреннего полога (примерно на 50%).

(T8) Дуб - кроны уменьшаются примерно на 1 м в целом - церковь Заповедник Ноул

У меня вопрос, как отключить разбиение предложений по скобкам? На первый взгляд я пытался сменить скобки на что-то другое - это работало вполне с трубами, но не совсем.

Я нашел https://spacy.io/api/sentencizer/ - есть 3 символа разделения по умолчанию (".", "!", "?"), Поэтому не знаю, каково текущее поведение. Как с этим бороться? Как я могу что-то изменить с помощью кодирования, как я делаю сейчас?

Кстати, я пытаюсь переопределить стандартное предложение с кодом:

from spacy.pipeline import Sentencizer
sentencizer = Sentencizer()
sentencizer = Sentencizer(punct_chars=[".", "?", "!", "。"])

но получите ошибку:

ImportError: невозможно импортировать имя 'Sentencizer'

EDIT

Я использовал только этот код:

sentencizer = nlp.create_pipe("sentencizer")
nlp.add_pipe(sentencizer, before="parser")

и получил что-то вроде этого:

(T1) Клен - упал. (

T2, T3 и T4) Пепел - удаление нависающих конечностей от соседей деревья. (

Т5) Береза ​​серебряная - упал. (

T6) Хвойное дерево - уменьшить высоту примерно на 1 м и уменьшить распространение примерно на 0,5 м. (

T7) Вишня - крону сводят к внутреннему пологу (примерно на 50%). (

T8) Дуб - корона уменьшена примерно на 1 м в целом - заповедная зона Черч-Ноул

EDIT

Я попробовал этот трюк, но не работает:

def set_custom_boundaries(doc):
    for token in doc[:-1]:
        if token.text == ". (":
            doc[token.i+1].is_sent_start = False
    return doc

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

EDIT

Я нашел не очень элегантное решение. Чтобы было понятно, это обязательное разбиение:

(T1) Клен упал.

(T2, T3 и T4) Пепел, удаление нависания конечности с соседских деревьев.

(T5) Серебряная береза, упал.

(T6) Хвойное дерево, уменьшить высоту примерно на 1 м и уменьшить распространение на примерно 0,5 м.

(T7) Вишня, кроны уменьшаются до внутреннего полога (примерно на 50%).

(T8) Дуб, корона уменьшаются примерно на 1 м в целом, Черч Ноул Заповедник

Я использовал значение по умолчанию sentencizer и использовал это регулярное выражение для всей строки s = re.sub("\. ", ". ", s). Кроме того, пришлось удалить точки перед закрывающей скобкой: s = re.sub('\.\s*\)', ')', s), потому что в некоторых случаях она оставляла ) как целое предложение. Это работает до сих пор по мере необходимости, но я могу ожидать некоторых проблем для других случаев.

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