У меня есть такая группа предложений в одном кадре:
"(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)
, потому что в некоторых случаях она оставляла )
как целое предложение. Это работает до сих пор по мере необходимости, но я могу ожидать некоторых проблем для других случаев.