Python和NLTK:Baseline标记

2024-06-28 19:30:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为基线标记器编写代码。基于Brown语料库,它将最常见的标记分配给单词。因此,如果单词“works”被标记为动词23次,作为复数名词30次,那么根据用户输入句子中的标记,它将被标记为复数名词。如果在语料库中找不到这个词,那么它默认被标记为名词。 到目前为止,我得到的代码返回单词的每个标记,而不仅仅是最频繁的一个。我怎样才能做到只返回每个单词的频繁标记?在

import nltk 
from nltk.corpus import brown

def findtags(userinput, tagged_text):
    uinput = userinput.split()
    fdist = nltk.FreqDist(tagged_text)
    result = []
    for item in fdist.items():
        for u in uinput:
            if u==item[0][0]:
                t = (u,item[0][1])
                result.append(t)
        continue
        t = (u, "NN")
        result.append(t)
    return result

def main():
    tags = findtags("the quick brown fox", brown.tagged_words())
    print tags

if __name__ == '__main__':
    main()

Tags: 代码标记importmaindefresultitem单词
3条回答

创建一个名为word_tags的字典,其键是一个单词(未注释),value是一个降序频率的标记列表(基于您的fdist

然后:

for u in uinput:
    result.append(word_tags[u][0])

如果是英语,NLTK中有一个默认的POS tagger,很多人一直在抱怨,但它是一个很好的快速解决方法(更像是一个创可贴,而不是扑热息痛),见POS tagging - NLTK thinks noun is adjective

>>> from nltk.tag import pos_tag
>>> from nltk.tokenize import word_tokenize
>>> sent = "the quick brown fox"
>>> pos_tag(word_tokenize(sent))
[('the', 'DT'), ('quick', 'NN'), ('brown', 'NN'), ('fox', 'NN')]

如果您想从头开始训练一个基线标记器,我建议您遵循这样的示例,但是将语料库改为英语语料库:https://github.com/alvations/spaghetti-tagger

通过构建类似于spaghetti-tagger的UnigramTagger,您应该自动为每个单词实现最常用的标记。在

但是,如果你想用非机器学习的方式来做,首先要数单词:POS,您需要的是某种类型的令牌比率。另请参见Part-of-speech tag without context using nltk

^{pr2}$

注意:文档流可以定义为一个句子列表,其中每个句子都包含一个带有/out标记的标记列表。在

您可以简单地使用Counter来查找列表中最重复的项:

Python

from collections import Counter
default_tag = Counter(tags).most_common(1)[0][0]

如果你的问题是“unigram标签如何工作?”您可能有兴趣阅读更多的NLTK源代码: http://nltk.org/_modules/nltk/tag/sequential.html#UnigramTagger

不管怎样,我建议你读NLTK的第五章 特别是: http://nltk.org/book/ch05.html#the-lookup-tagger

在给定的条件分布中,你可以为每个给定的单词返回一个条件分布。在

^{pr2}$

在本例中,cfd["fox"].max()将根据brown corpus返回“fox”最有可能的标记。然后,你可以为你的句子中的每个单词制作一个最有可能的标记的词典:

likely_tags = dict((word, cfd[word].max()) for word in "the quick brown fox".split())

注意,对于句子中的新词,这将返回错误。但如果你理解了这个想法,你就可以自己做标记了。在

相关问题 更多 >