引言

nltk的介绍文章中,前面几篇主要介绍了nltk自带的数据(书籍和语料),感觉系统学习意义不大,用到哪里看到那里就行(笑),所以这里会从一些常用功能开始,适当略过对于数据本体的介绍。

文本处理

词频提取

把切分好的词表进行词频排序(按照出现次数排序),

  1. all_words = nltk.FreqDist(w.lower() for w in nltk.word_tokenize("I'm foolish foolish man"))
  2. print(all_words.keys())
  3. all_words.plot()

dict_keys(["'m", 'man', 'i', 'foolish'])

只考虑最高频率的两个词,并且绘制累积图,

  1. all_words.plot(2, cumulative=True)

英文词干提取器

  1. import nltk
  2. porter = nltk.PorterStemmer()
  3. porter.stem('lying')

'lie'

英文分词

  1. text = nltk.word_tokenize("And now for something completely different")
  2. print(text)

['And', 'now', 'for', 'something', 'completely', 'different']

分词&词形还原&词根还原使用概览

  1. import nltk
  2.  
  3. sent = "I'm super lying man"
  4.  
  5. '''
  6. 分词
  7. '''
  8. print(nltk.word_tokenize(sent))
  9. print(nltk.tokenize.word_tokenize(sent))
  10.  
  11. '''
  12. 词根还原
  13. '''
  14. porter = nltk.PorterStemmer()
  15. print([porter.stem(x) for x in nltk.word_tokenize(sent)])
  16.  
  17. '''
  18. 词形还原(lemmatizer),即把一个任何形式的英语单词还原到一般形式,与词根还原不同(stemmer),
  19. 后者是抽取一个单词的词根。
  20. '''
  21. porter2 = nltk.stem.WordNetLemmatizer()
  22. print([porter2.lemmatize(x) for x in nltk.word_tokenize(sent)])

『TensorFlow』测试项目_对评论分类

词性标注

  1. print(nltk.pos_tag(text))
  2. print(nltk.pos_tag(['i','love','you']))
  3. 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是名词。

  • 词性标注语料制作

  1. tagged_token = nltk.tag.str2tuple('fly/NN')
  2. print(tagged_token)

('fly', 'NN')

中文的也行,

  1. sent = '我/NN 是/IN 一个/AT 大/JJ 傻×/NN'
  2. [nltk.tag.str2tuple(t) for t in sent.split()] # 中文语料词性标注(&分词)

[('我', 'NN'), ('是', 'IN'), ('一个', 'AT'), ('大', 'JJ'), ('傻×', 'NN')]

  • 词性标注器

默认标注器:

不管什么词,都标注为频率最高的一种词性。比如经过分析,所有中文语料里的词是名次的概率是13%最大,那么我们的默认标注器就全部标注为名次。这种标注器一般作为其他标注器处理之后的最后一道门,即:不知道是什么词?那么他是名词。

  1. raw = '我 累 嗯个 e去?'
  2.  
  3. tokens = nltk.word_tokenize(raw)
  4.  
  5. default_tagger = nltk.DefaultTagger('NN')
  6. tags = default_tagger.tag(tokens)
  7.  
  8. print(tokens)
  9. print(tags)

['我', '累', '嗯个', 'e去', '?']

[('我', 'NN'), ('累', 'NN'), ('嗯个', 'NN'), ('e去', 'NN'), ('?', 'NN')]

正则表达式标注器:

满足特定正则表达式的认为是某种词性,比如凡是带“们”的都认为是代词(PRO)。

  1. pattern = [('.*们$','PRO')]
  2.  
  3. tagger = nltk.RegexpTagger(pattern)
  4.  
  5. print(tagger.tag(nltk.word_tokenize('我们 累 个 去 你们 和 他们 啊')))

[('我们', 'PRO'), ('累', None), ('个', None), ('去', None), ('你们', 'PRO'), ('和', None), ('他们', 'PRO'), ('啊', None)]

查询标注器:

找出最频繁的n个词以及它的词性,然后用这个信息去查找语料库,匹配的就标记上,剩余的词使用默认标注器(回退)。这一般使用一元标注的方式,见下面。

一元标注:基于已经标注的语料库做训练,然后用训练好的模型来标注新的语料。

  1. sents = [[u'我', u'你', u'小兔']]
  2.  
  3. tagged_sents = [[(u'我', u'PRO'), (u'小兔', u'NN')]]
  4. unigram_tagger = nltk.UnigramTagger(tagged_sents)
  5. tags = unigram_tagger.tag(sents[0])
  6.  
  7. print(tags)

[('我', 'PRO'), ('你', None), ('小兔', 'NN')]

二元标注和多元标注:一元标注指的是只考虑当前这个词,不考虑上下文,二元标注器指的是考虑它前面的词的标注,用法只需要把上面的UnigramTagger换成BigramTagger,同理三元标注换成TrigramTagger(并未有示例)。

组合标注器:

为了提高精度和覆盖率,我们对多种标注器组合,比如组合二元标注器、一元标注器和默认标注器,如下,

  1. t0 = nltk.DefaultTagger('NN')
  2. t1 = nltk.UnigramTagger(train_sents, backoff=t0)
  3. t2 = nltk.BigramTagger(train_sents, backoff=t1)

直接调用t2即可。

持久化&较为完整的训练一个标注器:

  1. sent = '我/NN 是/IN 一个/AT 好的/JJ 人/NN'
  2. train_sents = [[nltk.tag.str2tuple(t) for t in sent.split()]]
  3.  
  4. t0 = nltk.DefaultTagger('NN')
  5. t1 = nltk.UnigramTagger(train_sents, backoff=t0)
  6. t2 = nltk.BigramTagger(train_sents, backoff=t1)
  7.  
  8. from pickle import dump
  9. output = open('t2.pkl', 'wb')
  10. dump(t2, output, -1)
  11. output.close()  

加载在这里,

  1. from pickle import load
  2. input = open('t2.pkl', 'rb')
  3. tagger = load(input)
  4. input.close()

  

『Nltk』常用方法的更多相关文章

  1. 『Json』常用方法记录

    json模块可以把字典结构改写为string然后保存,并可以反向读取字典 pickle模块则可以持久化任意数据结构 但是即使同样是字典数据结构,两个包也是有差别的, json字典value不支持其他对 ...

  2. 『Numpy』常用方法记录

    numpy教程 防止输出省略号 import numpy as np np.set_printoptions(threshold=np.inf) 广播机制 numpy计算函数返回默认是一维行向量: i ...

  3. 『Os』常用方法记录

    os.rename(name_old, name_new) 『Scrapy』爬取斗鱼主播头像 重命名函数os.rename比win下的重命名强多了,它可以对路径重命名达到修改文件位置的功效. os.p ...

  4. 『Networkx』常用方法

    这是一个用于分析'图'结构的包,由于我只是用到了浅显的可视化功能,所以这个介绍会对其使用浅尝辄止. 解决matplotlib中文字体缺失问题, from pylab import mpl mpl.rc ...

  5. 『Scipy』常用方法记录

    优化器使用教程 J = lambda wb: self.get_cost_grad(wb, X, Y_one_hot) theta = self.wb_init(X,Y_one_hot) result ...

  6. 『Glob』常用方法记录

    glob.glob(file) 返回匹配的文件 glob.glob(./flower_photos/tulips/*.jpg) Out[1]:<br># ['./flower_photos ...

  7. 『Re』正则表达式模块_常用方法记录

    『Re』知识工程作业_主体识别 一个比较完备的正则表达式介绍 几个基础函数 re.compile(pattern, flags=0) 将正则表达式模式编译成一个正则表达式对象,它可以用于匹配使用它的m ...

  8. 『cs231n』通过代码理解风格迁移

    『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...

  9. 『AngularJS』$location 服务

    项目中关于 $location的用法 简介 $location服务解析在浏览器地址栏中的URL(基于window.location)并且让URL在你的应用中可用.改变在地址栏中的URL会作用到$loc ...

随机推荐

  1. python服务器端、客户端的模型,客服端发送请求,服务端进行响应(web.py)

    服务器端.客户端的模型,客服端发送的请求,服务端的响应 相当于启动了一个web server install web.py 接口框架用到的包 http://webpy.org/tutorial3.zh ...

  2. Js基础知识7-Es6新增对象Map和set数据结构

    前言 JavaScript中对象的本质是键值对的集合,ES5中的数据结构,主要是用Array和Object,但是键只能是字符串.为了弥补这种缺憾,ES6带来了一种新的数据结构Map. Map也是键值对 ...

  3. Linux中Postfix邮件接收配置(四)

    Dovecot介绍 MRA邮件取回代理也有很多如courier-imap,cyrus-imap和dovecot这三个个工具,下面重点介绍Dovecot: 1.高安全性.据 Dovecot 的作者声称, ...

  4. 解决“ 故障模块名称: clr.dll ”

    错误内容: 微软的错误说明:http://support.microsoft.com/kb/2640103/zh-cn 类似下面的错误: 错误应用程序名称:xxx.exe,版本: 1.0.0.0,时间 ...

  5. SQL学习之SQL注入学习总结

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. 测试数据库 我们本文就以如下数据库作为测试数据库,完成我们的注入分析 ...

  6. 了解微信小程序

    了解微信小程序 版权声明:未经博主授权,内容严禁转载分享! 微信小程序官方网址:https://mp.weixin.qq.com/cgi-bin/wx 某大神知乎专栏地址:七月在夏天 https:// ...

  7. 20145225《网络对抗》Exp8 Web基础

    参考博客:5215~ 这次试验,没搞懂,只做了一部分,求老师酌情给分啊 啊啊 基础问题回答 什么是表单? 表单是一个包含表单元素的区域,表单元素是允许用户在表单中(比如:文本域.下拉列表.单选框.复选 ...

  8. tf.reduce_sum tensorflow维度上的操作

    tensorflow中有很多在维度上的操作,本例以常用的tf.reduce_sum进行说明.官方给的api reduce_sum( input_tensor, axis=None, keep_dims ...

  9. linux下去掉pdf的密码(前提:知道密码)

    一.背景 Linux jello 4.16.3 SMP Thu Apr 19 07:32:02 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux 二.去掉密码 2.1 先 ...

  10. 51Nod 1344 走格子(贪心

    1344 走格子   有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值.如果A[i ...