Я использую spaCy , чтобы сделать сегментацию предложений для текстов, которые могут начинаться с
text1 = "1. Dies ist ein Text"
text2 = "A. Dies ist ein Text"
text3 = "1.) Dies ist ein Text"
text4 = "B.) Dies ist ein Text"
Для всех этих текстов может случиться так, что после номеров абзацев следует \ r, \n или \ t.
Использование сегментации предложения spaCy приводит к следующим результатам для первого предложения в каждом тексте:
**** 1.
**** A.
**** 1.)
**** B.)
Поэтому я пытаюсь добавить правило, как предложение должнобыть разделенным на
- написанием моей функции, включая такое правило, и
- передачей этой функции в nlp.pipeline
К сожалению, у меня возникают проблемы с определением этогоПравить правильно.
Я сделал следующее:
def custom_sentensizer(doc):
boundary1 = re.compile(r'^[a-zA-Z0-9][\.]?$')
boundary2 = re.compile(r'\)')
prev = doc[0].text
length = len(doc)
for i, token in enumerate(doc):
if (boundary1.match(prev) and i != (length -1)) or (boundary2.match(token.text) and prev == "." and i != (length -1)):
doc[i+1].sent_start = False
prev = token.text
return doc
и передал эту функцию nlp
nlp = spacy.load('de_core_news_sm')
nlp.add_pipe(custom_sentensizer, before='parser')
all_sentences = []
for text in texts: # texts is list of list with each list including one text
doc = nlp(text)
sentences = [sent for sent in doc.sents]
all_sentences.append(sentences)
Для приведенного выше текста это работает, но только там, гденет \r
, \n
и \t
.
Поэтому два моих вопроса:
Как мне поступить с \r
, \n
и \t
, поскольку они иногда являются допустимыми границами для разбиения предложений,т.е. я не хочу определять правило, чтобы исключить их.
Моя собственная функция кажется очень сложной.Есть ли более простой способ сделать это?
Спасибо за вашу помощь!