问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python自然语言处理第五章分类标注词汇

发布网友 发布时间:2022-04-23 04:54

我来回答

2个回答

懂视网 时间:2022-05-10 22:13

import nltk
text = nltk.word_tokenize("And now for something compleyely difference")print(text)print(nltk.pos_tag(text))

标注语料库

表示已经标注的标识符:nltk.tag.str2tuple('word/类型')

text = "The/AT grand/JJ is/VBD ."print([nltk.tag.str2tuple(t) for t in text.split()])

读取已经标注的语料库

nltk语料库ue肚脐提供了统一接口,可以不必理会不同的文件格式。格式:语料库.tagged_word()/tagged_sents()。参数可以指定categories和fields

print(nltk.corpus.brown.tagged_words())

名词、动词、形容词等

这里以名词为例

from nltk.corpus import brown
word_tag = nltk.FreqDist(brown.tagged_words(categories="news"))print([word+'/'+tag for (word,tag)in word_tag if tag.startswith('V')])################下面是查找money的不同标注#################################wsj = brown.tagged_words(categories="news")
cfd = nltk.ConditionalFreqDist(wsj)print(cfd['money'].keys())

尝试找出每个名词类型中最频繁的名词

def findtag(tag_prefix,tagged_text):
 cfd = nltk.ConditionalFreqDist((tag,word) for (word,tag) in tagged_text if tag.startswith(tag_prefix))return dict((tag,list(cfd[tag].keys())[:5]) for tag in cfd.conditions())#数据类型必须转换为list才能进行切片操作tagdict = findtag('NN',nltk.corpus.brown.tagged_words(categories="news"))for tag in sorted(tagdict):print(tag,tagdict[tag])

探索已经标注的语料库

需要nltk.bigrams()nltk.trigrams(),分别对应2-gram模型和3-gram模型。

brown_tagged = brown.tagged_words(categories="learned")
tags = [b[1] for (a,b) in nltk.bigrams(brown_tagged) if a[0]=="often"]
fd = nltk.FreqDist(tags)
fd.tabulate()

自动标注

默认标注器

最简单的标注器是为每个标识符分配统一标记。下面就是一个将所有词都变成NN的标注器。并且用evaluate()进行检验。当很多词语是名词时候,它有利于第一次分析并提高稳定性。

brown_tagged_sents = brown.tagged_sents(categories="news")

raw = 'I do not like eggs and ham, I do not like them Sam I am'tokens = nltk.word_tokenize(raw)
default_tagger = nltk.DefaultTagger('NN')#创建标注器print(default_tagger.tag(tokens)) # 调用tag()方法进行标注print(default_tagger.evaluate(brown_tagged_sents))

正则表达式标注器

注意这里规则是固定(由自己决定)。当规则越来越完善的时候,精确度越高。

patterns = [
 (r'.*ing$','VBG'),
 (r'.*ed$','VBD'),
 (r'.*es$','VBZ'),
 (r'.*','NN')#为了方便,只有少量规则]
regexp_tagger = nltk.RegexpTagger(patterns)
regexp_tagger.evaluate(brown_tagged_sents)

查询标注器

这里和书里是有差别的,不同于python2,注意调试。而查询标注器就是存储最有可能的标记,并且可以设置backoff参数,不能标记的情况下,就使用这个标注器(这个过程是回退)

fd = nltk.FreqDist(brown.words(categories="news"))
cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories="news"))##############################################python2和3的区别#########most_freq_words = fd.most_common(100)
likely_tags = dict((word,cfd[word].max()) for (word,times) in most_freq_words)#######################################################################baseline_tagger = nltk.UnigramTagger(model=likely_tags,backoff=nltk.DefaultTagger('NN'))
baseline_tagger.evaluate(brown_tagged_sents)

N-gram标注

基础的一元标注器

一元标注器的行为和查找标注器很相似,建立一元标注器的技术,为训练。

这里我们的标注器只是记忆训练集,而不是建立一般模型,那么吻合很好,但是不能推广到新文本。

size = int(len(brown_tagged_sents)*0.9)
train_sents = brown_tagged_sents[:size]
test_sents = brown_tagged_sents[size+1:]
unigram_tagger = nltk.UnigramTagger(train_sents)
unigram_tagger.evaluate(test_sents)

一般的N-gram标注器

N元标注器,就是检索index= n 的 word,并且检索n-N<=index<=n-1 的 tag。即通过前面词的tag标签,进一步确定当前词汇的tag。类似于nltk.UnigramTagger(),自带的二元标注器为:nltk.BigramTagger()用法一致。

组合标注器

很多时候,覆盖范围更广的算法比精度更高的算法更有用。利用backoff指明回退标注器,来实现标注器的组合。而参数cutoff显式声明为int型,则会自动丢弃只出现1-n次的上下文。

t0 = nltk.DefaultTagger('NN')
t1 = nltk.UnigramTagger(train_sents,backoff=t0)
t2 = nltk.BigramTagger(train_sents,backoff=t1)
t2.evaluate(test_sents)

可以发现,和原来比较之后,精确度明显提高

跨句子边界标注

对于句首的单词,没有前n个单词。解决方法:通过已标记的tagged_sents来训练标注器。


基于转换的标注:Brill标注器

较上面的都优秀。实现的思路:以大笔化开始,然后修复细节,一点点进行细致改变。
不仅占用内存小,而且关联上下文,并且根据问题的变小,实时修正错误,而不是一成不变的。当然,在python3和python2的调用有所不同。

from nltk.tag import brill
brill.nltkdemo18plus()
brill.nltkdemo18()


热心网友 时间:2022-05-10 19:21

用tagset = 'universal'替换里面的simplify_tags=True就可以运行了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
主角落水而故,重生在明朝,娶了个武功很高的老婆,生个儿子叫李寻欢_百度... 广东的焖牛腩的做法是什么呢? 微信抽签助手小程序有人会作弊吗? 黑暗之魂3boss的灵魂怎么用:游戏攻略分享 秋季备孕应注意什么 腰肌酸痛怎么缓解疼痛 腰肌酸痛是什么原因 古代对时是什么意思? 抵押合同的内容一般包括哪些? 人临终前会出现什么现象? python 自然语言处理的时候出现的是计数计的是字母而不是单词 oppo手机自带浏览器闪退怎么办 用python做自然语言处理,中文情感分析用贝叶斯分类器不行吗 python可以作为全栈语言吗 做nlp的python包有哪些 python做自然语言处理中文有哪些强大的工具和库 python自然语言处理中set是干什么用的 求《Python自然语言处理实战:核心技术与算法》这本书的pdf版本 ,谢谢 求《Python自然语言处理实战:核心技术与算法》这本书的pdf版本 求《Python自然语言处理实战》全文免费下载百度网盘资源,谢谢~ 《精通Python自然语言处理》pdf下载在线阅读全文,求百度网盘云资源 《Python自然语言处理实战》pdf下载在线阅读全文,求百度网盘云资源_百 ... python自然语言处理lcs什么意思 python 自然语言处理 根据语意判断 PYTHON自然语言处理怎么样 如何用python自然语言处理 Python自然语言处理的内容简介 败血症属于伴x隐性 败血症既然不遗传,为什么有几位亲人会得病啊 白血病是不是 就是败血症,白血病之前有什么病症吗?我爸爸以前得过白血病,会不会遗传 学习《Python自然语言处理》遇到问题:from nltk.book import *失败_百 ... 电脑输入开机密码后黑屏咋是什么情况 电脑开机输入密码后直接黑屏怎么处理 电脑在输入完毕主板密码后黑屏不开机怎么办? 开机输入密码过后进去电脑黑屏,但是可以启动任务管理器,就是黑屏,进不... 电脑输入密码后黑屏 请问电脑开机后在输入用户密码时就黑屏了,是怎么回事? 电脑开机一切正常,但是输入好开机密码后就黑屏了是怎么回事? 电脑开机后输入密码后黑屏怎么办 电脑开机输完密码后就黑屏,怎么回事 唤醒睡眠的电脑输入密码后黑屏 电脑开机在输入开机密码后会黑屏一会,重启后就没事了 iphone11为什么存在这么多软硬件问题? 苹果11现在还有市场吗?为什么呢? iphone11为什么屏幕这么暗 金立手机怎么隐藏图标? iphone11并非是5G,魅力为什么还那么大? 金立手机怎么打开隐藏功能? 金立s10cl怎么隐藏应用 你认为现在买苹果11还值得吗?为什么?