Разделение пользовательских предложений на Python spacy - PullRequest
0 голосов
/ 16 апреля 2019

Я использую 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.)

Поэтому я пытаюсь добавить правило, как предложение должнобыть разделенным на

  1. написанием моей функции, включая такое правило, и
  2. передачей этой функции в 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.

Поэтому два моих вопроса:

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

  2. Моя собственная функция кажется очень сложной.Есть ли более простой способ сделать это?

Спасибо за вашу помощь!

...