前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NLTK-005:分类和标注词汇

NLTK-005:分类和标注词汇

作者头像
李玺
发布于 2021-11-22 06:18:19
发布于 2021-11-22 06:18:19
63400
代码可运行
举报
文章被收录于专栏:爬虫逆向案例爬虫逆向案例
运行总次数:0
代码可运行

之前大家也肯定学过名字、动词、形容词、副词之间的差异,这些词类不是闲置的,而是对许多语言处理任务都有用的分类,正如我们将看到的,这些分类源于对文本中词的分布的简单的分析。

将词汇按照他们的词性(POS)分类以及相应的标注它们的过程被称作为词性标注(POS tagging),简称为标注。词性也被称为词类词汇范畴。用于特定任务的标记的集合被称为一个标记集,我们本章的重点是利用标记和自动标注文本。

使用词性标注器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import nltk
text=nltk.word_tokenize("customer found there are abnormal issue")

print(nltk.pos_tag(text))

然后。。报错了

需要再运行nltk.download进行下载,并将文件拷贝到前面错误提示的搜索路径中去。 lang time: 输出结果:[(‘customer’, ‘NN’), (‘found’, ‘VBD’), (‘there’, ‘EX’), (‘are’, ‘VBP’), (‘abnormal’, ‘JJ’), (‘issue’, ‘NN’)]

在这里得到了每个词以及每个词的词性。下表是一个简化的词性标记集

标注语料库

表示已经标注的标识符:nltk.tag.str2tuple('word/类型') 按照NKTL的约定,一个已标注的biao标识符使用一个由标识符和标记组成的元祖来表示,我们可以使用函数 str2tuple()从表示一个已标注的标识符的标准字符串创建一个这样的特殊元祖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tagged_token = nltk.tag.str2tuple('fly/NN')
print(tagged_token)

输出为 (‘fly’, ‘NN’)

我们可以从一个字符串构造一个已标注的标识符的链表,第一步是对字符串分词以便能访问单独的词/标记字符串,然后将每一个转换成一个元祖(使用str2tuple()) 设:sent = “” xxxxxxx…xxxxxxxxxxxxxx “”

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print([nltk.tag.str2tulpe(t) for t in sent.split()])

. . 读取已经标记的语料库

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(nltk.corpus.brown.tagged_words())

输出:[(‘The’, ‘AT’), (‘Fulton’, ‘NP-TL’), …]

. . 简化的词性标记集

已标注的语料库使用许多不同的标记集约定来标注词汇。为了帮助我们开始,我们将看到一个一个简化的标记集。

那我们来看下这些标记中那些是布朗语料库的新闻中常见的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brown_news_tagged = nltk.corpus.brown.tagged_words()
tag_fd = nltk.FreqDist(tag for (word,tag) in brown_news_tagged)
print(tag_fd.keys())

输出: dict_keys([‘AT’, ‘NP-TL’, ‘NN-TL’, ‘JJ-TL’, ‘VBD’,…‘PN+HVD’, ‘FW-UH-TL’])

. . 名词、动词、形容词等 再啰嗦一下, 名词一般指的是人,地点,事情或者是概念,例如:女人,苏格兰,图书,情报等。名称可能出现在限定词和形容词之后,可以是动词或者是主语或宾语。

动词是用来描述事件和形容的词。

形容词修饰名词,可以作为修饰符或者谓语。

副词修饰动词,指定时间方式地点或动词描述的时件的方向。

这里以名词为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from nltk.corpus import brown
import nltk
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())

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()进行检验。当很多词语是名词时候,它有利于第一次分析并提高稳定性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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))

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
patterns = [
    (r'.*ing$','VBG'),
    (r'.*ed$','VBD'),
    (r'.*es$','VBZ'),
    (r'.*','NN')#为了方便,只有少量规则]
regexp_tagger = nltk.RegexpTagger(patterns)
regexp_tagger.evaluate(brown_tagged_sents)

查询标注器

查询标注器就是存储最有可能的标记,并且可以设置backoff参数,不能标记的情况下,就使用这个标注器(这个过程是回退)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fd = nltk.FreqDist(brown.words(categories="news"))
cfd = nltk.ConditionalFreqDist(brown.tagged_words(categories="news"))
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'))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Swift基础语法(三)
chineseScore和mathScore也是存储属性,用来记录该学生的语文分数和数学分数。
拉维
2020/06/23
2.1K0
Swift基础语法(三)
Swift| 基础语法(四)
总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、数组和字典、方法的书写调用等内容,考虑到阅读体验分多篇来展示,希望对大家学习swift有所帮助,同时也是对自己的一个总结。
進无尽
2018/09/12
1.4K0
Swift| 基础语法(四)
Swift 5.6 新特性
Swift 5.6 之前只有#available表示可用,Swift 5.6 之后增加了#unavailable表示不可用,二者意思相反。
YungFan
2022/03/30
1.3K0
Swift基础语法简化版(续)
闭包能够捕获和存储定义在其上下文中的任何常量和变量,即闭合并包裹那些常量和变量,因此被称为“闭包”。
拉维
2020/06/23
1.6K0
swift4.0语法杂记(精简版)
一、swift简史 1、介绍 swift是苹果公司于2014年推出用于撰写OS和iOS应用程序的语言。它由苹果开发者工具部门总监“克里斯.拉特纳”在2010年开始着手设计,历时一年完成基本的架构。到后来苹果公司大力投入swift语言的研发,于2014年发布这一语言的第一版本。swift2.0之后的语法则趋于稳定,2017年发布的swift4.0虽有改动,但也只是增添了一些新特性。这些新特性需要在Xcode9上运行才能显示出效果。值得一提的是它支持unicode9,也就是说,可以用某些图片图标来充当变量。
谦谦君子修罗刀
2018/05/02
15.6K0
swift4.0语法杂记(精简版)
Swift基础语法简化版
该网站是对Swift官方文档的翻译,但不是无脑翻译,而是结合作者的开发经验,在翻译的基础上,给出一些实用的建议。
拉维
2020/06/23
3.9K0
Swift基础语法(一)
Swift语言是苹果公司在Apple WWDC 2014上退出的,用来撰写MacOS和iOS应用程序。
拉维
2020/05/22
4.4K0
Swift 5.8 新特性
Swift 5.3 之后 self 可以在闭包中有条件省略,Swift 5.8 之后类中的[weak self]也可以省略 self。
YungFan
2023/03/30
1.5K0
Swift 6.0 新特性
Swift 发布十周年之际 Apple 推出了大版本 Swift 6.0,其内置于 Xcode 16,带来了如下的新特性。
YungFan
2024/07/05
2770
Swift学习之5.3新特性
Swift 5.3 之前即使有多个尾随闭包也只有最后一个能被写成精简的形式,这种写法一个闭包在圆括号内,另一个在外面。新的写法把这些闭包都放在圆括号外面,显得更加简洁。注意:尾随闭包中的第一个闭包的标签会被强制省略。
YungFan
2021/01/05
5980
36.Swift学习之Associated Object
Swift 可以利用 OC 的 runtime 和 KVC ,在运行时向一个对象添加值存储,这种方式称之为Associated Object。在使用 extension 扩展现有类的功能时,使用Associated Object的方式,可以将一个值 “关联” 到已有的要扩展的类上。该知识点在 iOS 开发中使用往往能优雅地解决很多问题。
YungFan
2019/09/29
2.2K1
Swift| 基础语法(五)
总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、数组和字典、方法的书写调用等内容,考虑到阅读体验分多篇来展示,希望对大家学习swift有所帮助,同时也是对自己的一个总结。
進无尽
2018/09/12
2.3K0
Swift| 基础语法(五)
Swift 3到5.1新特性整理
Swift 5.0 最重要的自然是ABI Stability, 对此可以看这篇 Swift ABI 稳定对我们到底意味着什么 。
小刀c
2022/08/16
4.8K0
Swift 3到5.1新特性整理
Swift Runtime ?
你肯定也想过       在OC中相信每一个iOS开发都知道Runtime, 现在Swift也更新到4.0版本了,要是你也学习过Swift的话你可能也会想过这样一个问题,OC大家都知道是有动态性的,你能通过Runtime 的API获取你想要的属性方法等等,那Swift呢?是不是也和OC一样呢?       这个问题在我看Swift的时候也有想过,带着这个问题就总结出了今天这篇文章。       先说说这个Runtime,在自己之前的文章中有总结过关于OC的Runtime以及它API的一些基本的方法和在项目中
Mr.RisingSun
2018/02/06
5K0
Swift Runtime ?
Swift基础语法(二)
我们之前介绍的数组Array、字典Dictionary等,都是值类型,而函数是引用类型。
拉维
2020/06/02
2.3K0
Swift-MVVM 简单演练(一)
Swift-MVVM 简单演练(二) Swift-MVVM 简单演练(三) Swift-MVVM 简单演练(四) 前言 最近在学习swift和MVVM架构模式,目的只是将自己的学习笔记记录下来,方便自己日后查找,仅此而已!!! 本来打算一篇全部搞定的,但是简书每篇文章只能写大约不超过15000字的内容,因此只能分开写了。 如果有任何问题,欢迎和我一起讨论。当然如果有什么存在的问题,欢迎批评指正,我会积极改造的! ---- 这篇文章都写啥 自定义NavgationBar 抽取便利构造函数 初步的下拉刷新/上
用户1890628
2018/05/10
10.6K0
27.Swift学习之与OC混编
在目前iOS开发语言从Objective-C到Swift的过渡时期,开发中难免会碰到两种语言同时存在的情况,如果在同一个项目中,两种语言并存,那么该项目就是一个混合项目。在混合项目中,就会存在语言相互调用的情况,那么一个是上世纪的“老人”,一个是初出茅庐的“少年”,它们的沟通是存在障碍的,如何才能在一个项目中让两种语言可以相互调用呢?Apple给我们做好了“桥接”工作,但是在Objective-C的项目中调用Swift与在Swift项目中调用Objective-C,处理的方式是不一样的,下面来进行一个简单的介绍。
YungFan
2018/12/26
1.3K0
module & Swift库
一个module是机器代码和数据的最小单位,可以独立于其他代码单位进行链接 通常,module是通过编译单个源文件生成的目标文件。例如:当前的test.m被编译成目标文件test.o时,当前的目标文件就代表了一个module 这里有一个问题,module在调用的时候会产生开销,当使用一个静态库的时:@import TestStaticFramework; 如果静态库中包含许多.o文件。这岂不是会导入很多module? 当然不会。在静态链接的时候,也就是静态库链接到主项目或者动态库,最终生成可执行文件或
ruochen
2021/12/05
2.2K0
Swift 4.0 新特性
WWDC 2017 带来了很多惊喜,在这次大会上,Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,虽然正式版要8月底9月初才会公布,但很多强大的新特性正吸引我们去学习它。根据大会上已经开放的新特性,先一睹为快。 体验 Swift 4包含在Xcode 9中,您可以从Apple的开发者门户下载最新版本的Xcode 9(您必须拥有一个活跃的开发者帐户)。 每个Xcode测试版将在发布时捆绑最新的Swift 4快照。在阅读时,您会注意到[SE-xxxx]格式的链接。 这些链接将带您到相关的Swif
xiangzhihong
2018/02/06
1.8K0
Swift 4.0 新特性
Swift中的命名空间
命名空间namespace在C++、C#里面是一个常见概念,Swift中也引入了这样一个机制,下面来探索一下这个命名空间的来龙去脉。
YungFan
2018/12/26
2.5K0
相关推荐
Swift基础语法(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档