Saltar al contenido

NLTK Etiquetado de palabras en español usando un corpus

Esta noticia fue evaluado por nuestros especialistas para asegurar la veracidad de nuestro contenido.

Solución:

Primero necesitas leer la oración etiquetada de un corpus. NLTK proporciona una interfaz agradable para no molestarse con los diferentes formatos de los diferentes corpus; simplemente puede importar el corpus y usar las funciones del objeto del corpus para acceder a los datos. Consulte http://nltk.googlecode.com/svn/trunk/nltk_data/index.xml.

Entonces tienes que elija su elección de etiquetador y entrene al etiquetador. Hay opciones más sofisticadas, pero puede comenzar con los etiquetadores N-gram.

Luego puede usar el etiquetador para etiquetar la oración que desee. Aquí hay un código de ejemplo:

from nltk.corpus import cess_esp as cess
from nltk import UnigramTagger as ut
from nltk import BigramTagger as bt

# Read the corpus into a list, 
# each entry in the list is one sentence.
cess_sents = cess.tagged_sents()

# Train the unigram tagger
uni_tag = ut(cess_sents)

sentence = "Hola , esta foo bar ."

# Tagger reads a list of tokens.
uni_tag.tag(sentence.split(" "))

# Split corpus into training and testing set.
train = int(len(cess_sents)*90/100) # 90%

# Train a bigram tagger with only training data.
bi_tag = bt(cess_sents[:train])

# Evaluates on testing data remaining 10%
bi_tag.evaluate(cess_sents[train+1:])

# Using the tagger.
bi_tag.tag(sentence.split(" "))

Entrenar a un etiquetador en un corpus grande puede llevar mucho tiempo. En lugar de entrenar un etiquetador cada vez que lo necesitemos, es conveniente guardar un etiquetador entrenado en un archivo para su posterior reutilización.

Por favor mira a Almacenamiento de etiquetadores sección en http://nltk.googlecode.com/svn/trunk/doc/book/ch05.html

Dado el tutorial en la respuesta anterior, aquí hay un enfoque más orientado a objetos del etiquetador de espagueti: https://github.com/alvations/spaghetti-tagger

#-*- coding: utf8 -*-

from nltk import UnigramTagger as ut
from nltk import BigramTagger as bt
from cPickle import dump,load

def loadtagger(taggerfilename):
    infile = open(taggerfilename,'rb')
    tagger = load(infile); infile.close()
    return tagger

def traintag(corpusname, corpus):
    # Function to save tagger.
    def savetagger(tagfilename,tagger):
        outfile = open(tagfilename, 'wb')
        dump(tagger,outfile,-1); outfile.close()
        return
    # Training UnigramTagger.
    uni_tag = ut(corpus)
    savetagger(corpusname+'_unigram.tagger',uni_tag)
    # Training BigramTagger.
    bi_tag = bt(corpus)
    savetagger(corpusname+'_bigram.tagger',bi_tag)
    print "Tagger trained with",corpusname,"using" +
                "UnigramTagger and BigramTagger."
    return

# Function to unchunk corpus.
def unchunk(corpus):
    nomwe_corpus = []
    for i in corpus:
        nomwe = " ".join([j[0].replace("_"," ") for j in i])
        nomwe_corpus.append(nomwe.split())
    return nomwe_corpus

class cesstag():
    def __init__(self,mwe=True):
        self.mwe = mwe
        # Train tagger if it's used for the first time.
        try:
            loadtagger('cess_unigram.tagger').tag(['estoy'])
            loadtagger('cess_bigram.tagger').tag(['estoy'])
        except IOError:
            print "*** First-time use of cess tagger ***"
            print "Training tagger ..."
            from nltk.corpus import cess_esp as cess
            cess_sents = cess.tagged_sents()
            traintag('cess',cess_sents)
            # Trains the tagger with no MWE.
            cess_nomwe = unchunk(cess.tagged_sents())
            tagged_cess_nomwe = batch_pos_tag(cess_nomwe)
            traintag('cess_nomwe',tagged_cess_nomwe)
            print
        # Load tagger.
        if self.mwe == True:
            self.uni = loadtagger('cess_unigram.tagger')
            self.bi = loadtagger('cess_bigram.tagger')
        elif self.mwe == False:
            self.uni = loadtagger('cess_nomwe_unigram.tagger')
            self.bi = loadtagger('cess_nomwe_bigram.tagger')

def pos_tag(tokens, mmwe=True):
    tagger = cesstag(mmwe)
    return tagger.uni.tag(tokens)

def batch_pos_tag(sentences, mmwe=True):
    tagger = cesstag(mmwe)
    return tagger.uni.batch_tag(sentences)

tagger = cesstag()
print tagger.uni.tag('Mi colega me ayuda a programar cosas .'.split())

Terminé aquí buscando etiquetadores de POS para otros idiomas además del inglés. Otra opción para su problema es usar la biblioteca Spacy. Que ofrece etiquetado POS para múltiples idiomas, como holandés, alemán, francés, portugués, español, noruego, italiano, griego y lituano.

De la documentación de Spacy:

import es_core_news_sm
nlp = es_core_news_sm.load()
doc = nlp("El copal se usa principalmente para sahumar en distintas ocasiones como lo son las fiestas religiosas.")
print([(w.text, w.pos_) for w in doc])

lleva a:

[(‘El’, ‘DET’), (‘copal’, ‘NOUN’), (‘se’, ‘PRON’), (‘usa’, ‘VERB’),
(‘principalmente’, ‘ADV’), (‘para’, ‘ADP’), (‘sahumar’, ‘VERB’),
(‘en’, ‘ADP’), (‘distintas’, ‘DET’), (‘ocasiones’, ‘NOUN’), (‘como’,
‘SCONJ’), (‘lo’, ‘PRON’), (‘son’, ‘AUX’), (‘las’, ‘DET’), (‘fiestas’,
‘NOUN’), (‘religiosas’, ‘ADJ’), (‘.’, ‘PUNCT’)]

y visualizar en un cuaderno:

displacy.render(doc, style='dep', jupyter = True, options = 'distance': 120)

ingrese la descripción de la imagen aquí

valoraciones y reseñas

Eres capaz de añadir valor a nuestro contenido participando con tu experiencia en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *