我正在为基线标记器编写代码。基于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()
创建一个名为
word_tags
的字典,其键是一个单词(未注释),value是一个降序频率的标记列表(基于您的fdist
)然后:
如果是英语,NLTK中有一个默认的POS tagger,很多人一直在抱怨,但它是一个很好的快速解决方法(更像是一个创可贴,而不是扑热息痛),见POS tagging - NLTK thinks noun is adjective:
如果您想从头开始训练一个基线标记器,我建议您遵循这样的示例,但是将语料库改为英语语料库:https://github.com/alvations/spaghetti-tagger
通过构建类似于
spaghetti-tagger
的UnigramTagger,您应该自动为每个单词实现最常用的标记。在但是,如果你想用非机器学习的方式来做,首先要数单词:POS,您需要的是某种类型的令牌比率。另请参见Part-of-speech tag without context using nltk:
^{pr2}$注意:文档流可以定义为一个句子列表,其中每个句子都包含一个带有/out标记的标记列表。在
您可以简单地使用Counter来查找列表中最重复的项:
Python
如果你的问题是“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”最有可能的标记。然后,你可以为你的句子中的每个单词制作一个最有可能的标记的词典:注意,对于句子中的新词,这将返回错误。但如果你理解了这个想法,你就可以自己做标记了。在
相关问题 更多 >
编程相关推荐