『Nltk』常用方法
引言
在nltk的介绍文章中,前面几篇主要介绍了nltk自带的数据(书籍和语料),感觉系统学习意义不大,用到哪里看到那里就行(笑),所以这里会从一些常用功能开始,适当略过对于数据本体的介绍。
文本处理
词频提取
把切分好的词表进行词频排序(按照出现次数排序),
all_words = nltk.FreqDist(w.lower() for w in nltk.word_tokenize("I'm foolish foolish man"))
print(all_words.keys())
all_words.plot()
dict_keys(["'m", 'man', 'i', 'foolish'])

只考虑最高频率的两个词,并且绘制累积图,
all_words.plot(2, cumulative=True)

英文词干提取器
import nltk
porter = nltk.PorterStemmer()
porter.stem('lying')
'lie'
英文分词
text = nltk.word_tokenize("And now for something completely different")
print(text)
['And', 'now', 'for', 'something', 'completely', 'different']
分词&词形还原&词根还原使用概览
import nltk sent = "I'm super lying man" '''
分词
'''
print(nltk.word_tokenize(sent))
print(nltk.tokenize.word_tokenize(sent)) '''
词根还原
'''
porter = nltk.PorterStemmer()
print([porter.stem(x) for x in nltk.word_tokenize(sent)]) '''
词形还原(lemmatizer),即把一个任何形式的英语单词还原到一般形式,与词根还原不同(stemmer),
后者是抽取一个单词的词根。
'''
porter2 = nltk.stem.WordNetLemmatizer()
print([porter2.lemmatize(x) for x in nltk.word_tokenize(sent)])
词性标注
print(nltk.pos_tag(text))
print(nltk.pos_tag(['i','love','you']))
print( nltk.pos_tag(['love','and','hate']))
[('And', 'CC'), ('now', 'RB'), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ')]
[('i', 'NN'), ('love', 'VBP'), ('you', 'PRP')]
[('love', 'NN'), ('and', 'CC'), ('hate', 'NN')]
厉害的地方在这里:第二局里面的love是动词,第三句里面的love是名词。
词性标注语料制作
tagged_token = nltk.tag.str2tuple('fly/NN')
print(tagged_token)
('fly', 'NN')
中文的也行,
sent = '我/NN 是/IN 一个/AT 大/JJ 傻×/NN'
[nltk.tag.str2tuple(t) for t in sent.split()] # 中文语料词性标注(&分词)
[('我', 'NN'), ('是', 'IN'), ('一个', 'AT'), ('大', 'JJ'), ('傻×', 'NN')]
词性标注器
默认标注器:
不管什么词,都标注为频率最高的一种词性。比如经过分析,所有中文语料里的词是名次的概率是13%最大,那么我们的默认标注器就全部标注为名次。这种标注器一般作为其他标注器处理之后的最后一道门,即:不知道是什么词?那么他是名词。
raw = '我 累 嗯个 e去?'
tokens = nltk.word_tokenize(raw)
default_tagger = nltk.DefaultTagger('NN')
tags = default_tagger.tag(tokens)
print(tokens)
print(tags)
['我', '累', '嗯个', 'e去', '?']
[('我', 'NN'), ('累', 'NN'), ('嗯个', 'NN'), ('e去', 'NN'), ('?', 'NN')]
正则表达式标注器:
满足特定正则表达式的认为是某种词性,比如凡是带“们”的都认为是代词(PRO)。
pattern = [('.*们$','PRO')]
tagger = nltk.RegexpTagger(pattern)
print(tagger.tag(nltk.word_tokenize('我们 累 个 去 你们 和 他们 啊')))
[('我们', 'PRO'), ('累', None), ('个', None), ('去', None), ('你们', 'PRO'), ('和', None), ('他们', 'PRO'), ('啊', None)]
查询标注器:
找出最频繁的n个词以及它的词性,然后用这个信息去查找语料库,匹配的就标记上,剩余的词使用默认标注器(回退)。这一般使用一元标注的方式,见下面。
一元标注:基于已经标注的语料库做训练,然后用训练好的模型来标注新的语料。
sents = [[u'我', u'你', u'小兔']] tagged_sents = [[(u'我', u'PRO'), (u'小兔', u'NN')]]
unigram_tagger = nltk.UnigramTagger(tagged_sents)
tags = unigram_tagger.tag(sents[0]) print(tags)
[('我', 'PRO'), ('你', None), ('小兔', 'NN')]
二元标注和多元标注:一元标注指的是只考虑当前这个词,不考虑上下文,二元标注器指的是考虑它前面的词的标注,用法只需要把上面的UnigramTagger换成BigramTagger,同理三元标注换成TrigramTagger(并未有示例)。
组合标注器:
为了提高精度和覆盖率,我们对多种标注器组合,比如组合二元标注器、一元标注器和默认标注器,如下,
t0 = nltk.DefaultTagger('NN')
t1 = nltk.UnigramTagger(train_sents, backoff=t0)
t2 = nltk.BigramTagger(train_sents, backoff=t1)
直接调用t2即可。
持久化&较为完整的训练一个标注器:
sent = '我/NN 是/IN 一个/AT 好的/JJ 人/NN'
train_sents = [[nltk.tag.str2tuple(t) for t in sent.split()]] t0 = nltk.DefaultTagger('NN')
t1 = nltk.UnigramTagger(train_sents, backoff=t0)
t2 = nltk.BigramTagger(train_sents, backoff=t1) from pickle import dump
output = open('t2.pkl', 'wb')
dump(t2, output, -1)
output.close()
加载在这里,
from pickle import load
input = open('t2.pkl', 'rb')
tagger = load(input)
input.close()
『Nltk』常用方法的更多相关文章
- 『Json』常用方法记录
json模块可以把字典结构改写为string然后保存,并可以反向读取字典 pickle模块则可以持久化任意数据结构 但是即使同样是字典数据结构,两个包也是有差别的, json字典value不支持其他对 ...
- 『Numpy』常用方法记录
numpy教程 防止输出省略号 import numpy as np np.set_printoptions(threshold=np.inf) 广播机制 numpy计算函数返回默认是一维行向量: i ...
- 『Os』常用方法记录
os.rename(name_old, name_new) 『Scrapy』爬取斗鱼主播头像 重命名函数os.rename比win下的重命名强多了,它可以对路径重命名达到修改文件位置的功效. os.p ...
- 『Networkx』常用方法
这是一个用于分析'图'结构的包,由于我只是用到了浅显的可视化功能,所以这个介绍会对其使用浅尝辄止. 解决matplotlib中文字体缺失问题, from pylab import mpl mpl.rc ...
- 『Scipy』常用方法记录
优化器使用教程 J = lambda wb: self.get_cost_grad(wb, X, Y_one_hot) theta = self.wb_init(X,Y_one_hot) result ...
- 『Glob』常用方法记录
glob.glob(file) 返回匹配的文件 glob.glob(./flower_photos/tulips/*.jpg) Out[1]:<br># ['./flower_photos ...
- 『Re』正则表达式模块_常用方法记录
『Re』知识工程作业_主体识别 一个比较完备的正则表达式介绍 几个基础函数 re.compile(pattern, flags=0) 将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的m ...
- 『cs231n』通过代码理解风格迁移
『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...
- 『AngularJS』$location 服务
项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...
随机推荐
- IO(字符流)
1. 由于Java采用16位的Unicode字符,因此需要基于字符的输入/输出操作.从Java1.1版开始,加入了专门处理字符流的抽象类Reader和Writer,前者用于处理输入,后者用于处 ...
- clock_gettime接口和linux时间系统
RTC/OSCRTC,Real Time Clock,真实时钟,也叫做CMOS时钟,又叫walltimeOSC,Operation System Clock,系统时钟.在开机时操作系统取得RTC中的时 ...
- QPropertyAnimation 几行代码快速制作流畅的动画效果
QPropertyAnimation Class 官方英文文档[点击前往] QPropertyAnimation Class 中文译文文档[点击前往] 简介 QPropertyAnimation ...
- [转载]ViewState使用小结
ViewState是.Net中提出的状态保存的一种新途径,web程序保存状态的方式有这样几种:1.Application:保存在Application中的数据是全局有效的:Application里面存 ...
- 基于Spring Cloud的微服务落地
微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的微服务 ...
- pyDay6
内容来自廖雪峰的官方网站 1.在Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好,1行代码能实现的功能,决不写5行代码.请始终牢记,代码越少,开发效率越高. 2.取指 ...
- UVa 10635 Prince and Princess - 动态规划
讲一下题目大意,就是有两个长度为p + 1和q + 1的序列,求它们的LCS. 如果用O(pq)的算法对于这道题来说还是太慢了.所以要另外想一些方法.注意到序列中的所有元素都不相同,所以两个序列中数对 ...
- C# 取form表单的数据
//key代表form表单中html元素的name属性值 public static string StringForm(string key) { string result = null; res ...
- Git 基础 —— 常见使用场景
Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 突然插入 Bugifx 工作, ...
- window 环境下jdbc访问启用kerberos的impala
最近,公司生产集群添加kerberos安全认证后,访问集群的任何组件都需要进行认证,这样问题来了,对于impala,未配置kerberos安全认证之前通过impala的jdbc驱动(impala-jd ...