NLTK Маркировка испанских слов с использованием корпуса - программирование
Подтвердить что ты не робот

NLTK Маркировка испанских слов с использованием корпуса

Я пытаюсь узнать, как помечать слова испанца с помощью NLTK.

Из nltk book, довольно просто пометить английские слова, используя их пример. Поскольку я новичок в nltk и всей обработке языка, я довольно запутался в том, как выполнять процедуру.

Я загрузил корпус cess_esp. Есть ли способ указать корпус в nltk.pos_tag. Я посмотрел документацию pos_tag и не видел ничего, что могло бы предложить. Я чувствую, что мне не хватает некоторых ключевых концепций. Должен ли я вручную пометить слова в тексте снова в cess_esp corpus? (вручную я подразумеваю токенизацию моего отчёта и запуск его снова на корпус). Или я полностью не знаком. Спасибо вам

4b9b3361

Ответ 1

Сначала вам нужно прочитать помеченное предложение из корпуса. NLTK предоставляет приятный интерфейс, чтобы не беспокоиться о разных форматах разных корпораций; Вы можете просто импортировать корпус, используя функции объекта корпуса для доступа к данным. См. Http://nltk.googlecode.com/svn/trunk/nltk_data/index.xml.

Затем вы должны выбрать свой тегер и обучить его. Есть более причудливые варианты, но вы можете начать с тегов N-граммы.

Затем вы можете использовать тег для пометки предложения, которое вы хотите. Вот пример кода:

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(" "))

Тренировка tagger на большом корпусе может занять значительное время. Вместо того, чтобы тренировать тегер каждый раз, когда он нам нужен, удобно сохранить обученный тегер в файл для последующего повторного использования.

Ознакомьтесь с разделом " Хранение тегов " в http://nltk.googlecode.com/svn/trunk/doc/book/ch05.html

Ответ 2

Учитывая учебник в предыдущем ответе, здесь более объектно-ориентированный подход от тегатора спагетти: 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 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())

Ответ 3

Следующий script дает вам быстрый подход к получению "мешка слов" в испанских предложениях. Обратите внимание: если вы хотите сделать это правильно, вы должны подделать предложения перед тегом, так что "religiosas". должны быть разделены в двух токенах ','. '

#-*- coding: utf8 -*-

# about the tagger: http://nlp.stanford.edu/software/tagger.shtml 
# about the tagset: nlp.lsi.upc.edu/freeling/doc/tagsets/tagset-es.html

import nltk

from nltk.tag.stanford import POSTagger

spanish_postagger = POSTagger('models/spanish.tagger', 'stanford-postagger.jar', encoding='utf8')

sentences = ['El copal se usa principalmente para sahumar en distintas ocasiones como lo son las fiestas religiosas.','Las flores, hojas y frutos se usan para aliviar la tos y también se emplea como sedante.']

for sent in sentences:

    words = sent.split()
    tagged_words = spanish_postagger.tag(words)

    nouns = []

    for (word, tag) in tagged_words:

        print(word+' '+tag).encode('utf8')
        if isNoun(tag): nouns.append(word)

    print(nouns)

дает:

El da0000
copal nc0s000
se p0000000
usa vmip000
principalmente rg
para sp000
sahumar vmn0000
en sp000
distintas di0000
ocasiones nc0p000
como cs
lo pp000000
son vsip000
las da0000
fiestas nc0p000
religiosas. np00000
[u'copal', u'ocasiones', u'fiestas', u'religiosas.']
Las da0000
flores, np00000
hojas nc0p000
y cc
frutos nc0p000
se p0000000
usan vmip000
para sp000
aliviar vmn0000
la da0000
tos nc0s000
y cc
también rg
se p0000000
emplea vmip000
como cs
sedante. nc0s000
[u'flores,', u'hojas', u'frutos', u'tos', u'sedante.']