NLTK西班牙语标记结果真的很糟糕?

时间:2014-04-24 17:07:16

标签: python nltk

我正在尝试为西班牙语创建一个tagger性能比较。我当前的脚本是this的修改版本,但我尝试了另一个版本非常相似的版本。

我正在使用cess_esp语料库并使用标记的句子为每个标记创建了一个Unigram,Bigram,Trigram和Brill标记器。

我很关心Bigram,Trigram标签的表现......他们似乎没有从结果中全力以赴。

例如,这是我脚本的一些输出:

*************** START TAGGING FOR LINE 6 ****************************************************************************************************************************************

Current line contents before tagging-> mejor ve a la sucursal de Juan Pablo II es la que menos gente tiene y no te tardas nada

Unigram tagger-> [('@yadimota', None), ('@ContactoBanamex', None), ('mejor', 'aq0cs0'), ('ve', 'vmip3s0'), ('a', 'sps00'), ('la', 'da0fs0'), ('sucursal', 'ncfs000'), ('de', 'sps00'), ('Juan', 'np0000p'), ('Pablo', None), ('II', None), ('es', 'vsip3s0'), ('la', 'da0fs0'), ('que', 'pr0cn000'), ('menos', 'rg'), ('gente', 'ncfs000'), ('tiene', 'vmip3s0'), ('y', 'cc'), ('no', 'rn'), ('te', 'pp2cs000'), ('tardas', None), ('nada', 'pi0cs000')]

Bigram tagger-> [('@yadimota', None), ('@ContactoBanamex', None), ('mejor', None), ('ve', None), ('a', None), ('la', None), ('sucursal', None), ('de', None), ('Juan', None), ('Pablo', None), ('II', None), ('es', None), ('la', None), ('que', None), ('menos', None), ('gente', None), ('tiene', None), ('y', None), ('no', None), ('te', None), ('tardas', None), ('nada', None)]

Trigram tagger-> [('@yadimota', None), ('@ContactoBanamex', None), ('mejor', None), ('ve', None), ('a', None), ('la', None), ('sucursal', None), ('de', None), ('Juan', None), ('Pablo', None), ('II', None), ('es', None), ('la', None), ('que', None), ('menos', None), ('gente', None), ('tiene', None), ('y', None), ('no', None), ('te', None), ('tardas', None), ('nada', None)]
****************************************************************************************************************************************

*************** START TAGGING FOR LINE 7 ****************************************************************************************************************************************

Current line contents before tagging-> He levantado ya varios reporte pero no resuelven nada

Unigram tagger-> [('He', 'vaip1s0'), ('levantado', 'vmp00sm'), ('ya', 'rg'), ('varios', 'di0mp0'), ('reporte', 'vmsp1s0'), ('pero', 'cc'), ('no', 'rn'), ('resuelven', None), ('nada', 'pi0cs000')]

Bigram tagger-> [('He', None), ('levantado', None), ('ya', None), ('varios', None), ('reporte', None), ('pero', None), ('no', None), ('resuelven', None), ('nada', None)]

Trigram tagger-> [('He', None), ('levantado', None), ('ya', None), ('varios', None), ('reporte', None), ('pero', None), ('no', None), ('resuelven', None), ('nada', None)]

*************** START TAGGING FOR LINE 8 ****************************************************************************************************************************************

Current line contents before tagging-> Es lamentable el servicio que brindan

Unigram tagger-> [('@ContactoBanamex', None), ('Es', 'vsip3s0'), ('lamentable', 'aq0cs0'), ('el', 'da0ms0'), ('servicio', 'ncms000'), ('que', 'pr0cn000'), ('brindan', None)]

Bigram tagger-> [('@ContactoBanamex', None), ('Es', None), ('lamentable', None), ('el', None), ('servicio', None), ('que', None), ('brindan', None)]

Trigram tagger-> [('@ContactoBanamex', None), ('Es', None), ('lamentable', None), ('el', None), ('servicio', None), ('que', None), ('brindan', None)]

现在,bigram和trigram正在接受训练,作为指示链接,顺便说一句,这是NLTK书中描述的更直接的方式:

from nltk.corpus import cess_esp as cess
from nltk import BigramTagger as bt
from nltk import TrigramTagger as tt
cess_sents = cess.tagged_sents()
# Training BigramTagger.
bi_tag = bt(cess_sents)
#Training TrigramTagger
tri_tag = tt(cess_sents)

我知道我在这里遗失了什么吗?是不是bigram和trigram应该比unigram表现更好?我应该总是为bigram adn trigram使用退避标记吗?

谢谢! 亚历

2 个答案:

答案 0 :(得分:1)

spaghetti-tagger(https://code.google.com/p/spaghetti-tagger/)是为了简单的教程目的而创建的,用于如何使用NLTK语料库和标记模块轻松创建可伸缩标记器。

该网站建议并不意味着它是一个先进的系统。建议使用http://nlp.lsi.upc.edu/freeling/等最先进的标记符。如果你需要的话,我会很高兴为pyeling在python中编写一个合适的包装类。

回到你的问题,正如Francis暗示的那样(https://groups.google.com/forum/#!topic/nltk-users/FtqksaZLLvY),首先阅读教程http://nltk.googlecode.com/svn/trunk/doc/howto/tag.html然后你会看到backoff参数可能会解决你的问题< /强>

免责声明:我写了spaghetti.py https://spaghetti-tagger.googlecode.com/svn/spaghetti.py

答案 1 :(得分:1)

在我看来,Jacob Perkins关于使用NLTK进行POS标记的博客文章可能是更好的在线资源之一。他首先构建一个简单的退避ngram标记器,然后查看添加正则表达式和基于词缀的标记,然后添加Brill标记,然后是基于分类器的完全标记。这些帖子清晰易懂,并包含一些有用的性能比较。

从这里开始,按照第4部分:http://streamhacker.com/2008/11/03/part-of-speech-tagging-with-nltk-part-1/

进行操作