web-dev-qa-db-fra.com

Segmentation de phrases à l'aide de Spacy

Je suis nouveau sur Spacy et NLP. Faire face au problème ci-dessous lors de la segmentation des phrases à l'aide de Spacy.

Le texte que j'essaie de symboliser en phrases contient des listes numérotées (avec un espace entre la numérotation et le texte réel). Comme ci-dessous.

import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
    print(sentence.text)

Les sorties (1., 2., 3 sont considérées comme des lignes distinctes) sont:

This is first sentence.

Next is numbered list.

1.
Hello World!

2.
Hello World2!

3.
Hello World!

Mais s'il n'y a pas d'espace entre la numérotation et le texte réel, la tokenisation des phrases est très bien. Comme ci-dessous:

import spacy
nlp = spacy.load('en_core_web_sm')
text = "This is first sentence.\nNext is numbered list.\n1.Hello World!\n2.Hello World2!\n3.Hello World!"
text_sentences = nlp(text)
for sentence in text_sentences.sents:
    print(sentence.text)

La sortie (souhaitée) est:

This is first sentence.

Next is numbered list.

1.Hello World!

2.Hello World2!

3.Hello World!

Veuillez suggérer si nous pouvons personnaliser le détecteur de phrases à cela.

6
Satheesh K

Lorsque vous utilisez un modèle pré-formé avec spacy, les phrases sont divisées en fonction des données de formation fournies lors de la procédure de formation du modèle.

Bien sûr, il y a des cas comme le vôtre, où quelqu'un peut vouloir utiliser une logique de segmentation de phrases personnalisée. Cela est possible en ajoutant un composant au pipeline Spacy.

Pour votre cas, vous pouvez ajouter une règle qui empêche le fractionnement de phrases lorsqu'il y a un {nombre}. modèle.

Une solution de contournement pour votre problème:

import spacy
import re

nlp = spacy.load('en')
boundary = re.compile('^[0-9]$')

def custom_seg(doc):
    prev = doc[0].text
    length = len(doc)
    for index, token in enumerate(doc):
        if (token.text == '.' and boundary.match(prev) and index!=(length - 1)):
            doc[index+1].sent_start = False
        prev = token.text
    return doc

nlp.add_pipe(custom_seg, before='parser')
text = u'This is first sentence.\nNext is numbered list.\n1. Hello World!\n2. Hello World2!\n3. Hello World!'
doc = nlp(text)
for sentence in doc.sents:
    print(sentence.text)

J'espère que ça aide!

7
gdaras