Python Spacy Satz Splitter

Sep 23 2020

Ich möchte verwenden spacy, um die Sätze aus einem Text herauszuholen.

nlp = English()  # just the language with no model
sentencizer = nlp.create_pipe("sentencizer")
nlp.add_pipe(sentencizer)
doc = nlp("This is a sentence. This is another sentence.")
for sent in doc.sents:
    print(sent.text)

Ist es möglich, die Zuverlässigkeit des Satzteilers unter Umgehung von Regeln zu erhöhen, da beispielsweise ein Satz niemals nach einem Akronym wie "Nein" geteilt wird?

Stellen Sie sich natürlich vor, ich habe eine Reihe sehr technischer und besonderer Akronyme.
Wie würden Sie vorgehen?

Antworten

3 thorntonc Sep 23 2020 at 22:36

Sie können eine benutzerdefinierte Funktion schreiben, die das Standardverhalten ändert, indem Sie einen regelbasierten Ansatz zum Teilen von Sätzen verwenden. Beispielsweise:

import spacy

text = "The formula is no. 45. This num. represents the chemical properties."

nlp = spacy.load("en_core_web_sm")
doc = nlp(text)
print("Before:", [sent.text for sent in doc.sents])

def set_custom_boundaries(doc):
    pattern_a = ['no', 'num']
    for token in doc[:-1]:
        if token.text in pattern_a and doc[token.i + 1].text == '.':
            doc[token.i + 2].is_sent_start = False
    return doc

nlp.add_pipe(set_custom_boundaries, before="parser")
doc = nlp(text)
print("After:", [sent.text for sent in doc.sents])

Dadurch erhalten Sie die gewünschte Satzaufteilung.

Before: ['The formula is no.', '45.', 'This num.', 'represents the chemical properties.']
After: ['The formula is no. 45.', 'This num. represents the chemical properties.']