divisor de oraciones de python spacy

Sep 23 2020

Me gustaría usar spacypara sacar las oraciones de un texto.

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)

¿Es posible aumentar la confiabilidad del separador de oraciones sin pasar por las reglas como, por ejemplo, nunca divide una oración después de un acrónimo como "no"?

Imagínese, por supuesto, que tengo un montón de acrónimos muy técnicos y particulares.
¿Cómo procederías?

Respuestas

3 thorntonc Sep 23 2020 at 22:36

Puede escribir una función personalizada que cambie el comportamiento predeterminado utilizando un enfoque basado en reglas de división en oraciones. Por ejemplo:

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])

Esto le dará la división de oración deseada.

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