Python编程使用NLTK进行自然语言处理详解


Posted in Python onNovember 16, 2017

自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言工具箱(NLTK,NaturalLanguageToolkit)是一个基于Python语言的类库,它也是当前最为流行的自然语言编程与开发工具。在进行自然语言处理研究和应用时,恰当利用NLTK中提供的函数可以大幅度地提高效率。本文就将通过一些实例来向读者介绍NLTK的使用。

NLTK

NaturalLanguageToolkit,自然语言处理工具包,在NLP领域中,最常使用的一个Python库。

NLTK是一个开源的项目,包含:Python模块,数据集和教程,用于NLP的研究和开发  。
NLTK由Steven Bird和Edward Loper在宾夕法尼亚大学计算机和信息科学系开发。
NLTK包括图形演示和示例数据。其提供的教程解释了工具包支持的语言处理任务背后的基本概念。

开发环境:我所使用的Python版本是最新的3.5.1,NLTK版本是3.2。Python的安装不在本文的讨论范围内,我们略去不表。你可以从NLTK的官网上http://www.nltk.org/获得最新版本的NLTK。Anyway,使用pip指令来完成NLTK包的下载和安装无疑是最简便的方法。

当然,当你完成这一步时,其实还不够。因为NLTK是由许多许多的包来构成的,此时运行Python,并输入下面的指令(当然,第一条指令还是要导入NLTK包)

>>> import nltk 
>>> nltk.download()

然后,Python Launcher会弹出下面这个界面,建议你选择安装所有的Packages,以免去日后一而再、再而三的进行安装,也为你的后续开发提供一个稳定的环境。某些包的Status显示“out of date”,你可以不必理会,它基本不影响你的使用与开发。

Python编程使用NLTK进行自然语言处理详解

既然你已经安装成功,我们来小试牛刀一下。当然本文涉及的主要任务都是自然语言处理中最常用,最基础的pre-processing过程,结合机器学习的高级应用我们会在后续文章中再进行介绍。

1、SentencesSegment(分句)

也就是说我们手头有一段文本,我们希望把它分成一个一个的句子。此时可以使用NLTK中的punktsentencesegmenter。来看示例代码

>>> sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') 
>>> paragraph = "The first time I heard that song was in Hawaii on radio.  
... I was just a kid, and loved it very much! What a fantastic song!" 
>>> sentences = sent_tokenizer.tokenize(paragraph) 
>>> sentences 
['The first time I heard that song was in Hawaii on radio.',  
 'I was just a kid, and loved it very much!',  
 'What a fantastic song!']

由此,我们便把一段话成功分句了。

2、SentencesSegment(分词)

接下来我们要把每个句话再切割成逐个单词。最简单的方法是使用NLTK包中的WordPuncttokenizer。来看示例代码

>>> from nltk.tokenize import WordPunctTokenizer 
>>> sentence = "Are you old enough to remember Michael Jackson attending  
... the Grammys with Brooke Shields and Webster sat on his lap during the show?" 
>>> words = WordPunctTokenizer().tokenize(sentence) 
>>> words 
['Are', 'you', 'old', 'enough', 'to', 'remember', 'Michael', 'Jackson', 'attending', 
 'the', 'Grammys', 'with', 'Brooke', 'Shields', 'and', 'Webster', 'sat', 'on', 'his', 
 'lap', 'during', 'the', 'show', '?']

我们的分词任务仍然完成的很好。除了WordPunct tokenizer之外,NLTK中还提供有另外三个分词方法,
TreebankWordTokenizer,PunktWordTokenizer和WhitespaceTokenizer,而且他们的用法与WordPunct tokenizer也类似。然而,显然我们并不满足于此。对于比较复杂的词型,WordPunct tokenizer往往并不胜任。此时我们需要借助正则表达式的强大能力来完成分词任务,此时我所使用的函数是regexp_tokenize()。来看下面这段话

>>> text = 'That U.S.A. poster-print costs $12.40...'

目前市面上可以参考的在Python下进行自然语言处理的书籍是由Steven Bird、Ewan Klein、Edward Loper编写的Python 自然语言处理。但是该书的编写时间距今已有近十年的时间,由于软件包更新等语言,在新环境下进行开发时,书中的某些代码并不能很正常的运行。最后,我们举一个书中代码out of date的例子(对上面这就话进行分词),并给出相应的解决办法。首先来看书中的一段节录

>>> text = 'That U.S.A. poster-print costs $12.40...' 
>>> pattern = r'''''(?x)  # set flag to allow verbose regexps 
...   ([A-Z]\.)+    # abbreviations, e.g. U.S.A. 
...  | \w+(-\w+)*    # words with optional internal hyphens 
...  | \$?\d+(\.\d+)?%? # currency and percentages, e.g. $12.40, 82% 
...  | \.\.\.      # ellipsis 
...  | [][.,;"'?():-_`] # these are separate tokens; includes ], [ 
... ''' 
>>> nltk.regexp_tokenize(text, pattern)

我们预期得到输出应该是这样的

['That', 'U.S.A.', 'poster-print', 'costs', '$12.40', '...']

但是我们实际得到的输出却是这样的(注意我们所使用的NLTK版本)

[('', '', ''), 
 ('A.', '', ''), 
 ('', '-print', ''), 
 ('', '', ''), 
 ('', '', '.40'), 
 ('', '', '')]

会出现这样的问题是由于nltk.internals.compile_regexp_to_noncapturing()在V3.1版本的NLTK中已经被抛弃(尽管在更早的版本中它仍然可以运行),为此我们把之前定义的pattern稍作修改

pattern = r"""(?x)          # set flag to allow verbose regexps 
       (?:[A-Z]\.)+      # abbreviations, e.g. U.S.A. 
       |\d+(?:\.\d+)?%?    # numbers, incl. currency and percentages 
       |\w+(?:[-']\w+)*    # words w/ optional internal hyphens/apostrophe 
       |\.\.\.        # ellipsis 
       |(?:[.,;"'?():-_`])  # special characters with meanings 
      """

再次执行前面的语句,便会得到

>>> nltk.regexp_tokenize(text, pattern) 
['That', 'U.S.A.', 'poster-print', 'costs', '12.40', '...']

以上便是我们对NLTK这个自然语言处理工具包的初步探索,日后主页君将结合机器学习中的方法再来探讨一些更为深入的应用。最后,我想说Python 自然语言处理仍然是当前非常值得推荐的一本讲述利用NLTK和Python进行自然语言处理技术的非常值得推荐的书籍。

总结

以上就是本文关于Python编程使用NLTK进行自然语言处理详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

如有不足之处,欢迎留言指出。

Python 相关文章推荐
Python+OpenCV目标跟踪实现基本的运动检测
Jul 10 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
解决Django加载静态资源失败的问题
Jul 28 Python
在django中,关于session的通用设置方法
Aug 06 Python
Python中Unittest框架的具体使用
Aug 27 Python
基于python中__add__函数的用法
Nov 25 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
python线程join方法原理解析
Feb 11 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
jupyter notebook快速入门及使用详解
Nov 13 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 Python
python数字图像处理实现图像的形变与缩放
Jun 28 Python
高质量Python代码编写的5个优化技巧
Nov 16 #Python
python使用fork实现守护进程的方法
Nov 16 #Python
详解Python map函数及Python map()函数的用法
Nov 16 #Python
python中lambda()的用法
Nov 16 #Python
Python reduce()函数的用法小结
Nov 15 #Python
python简单实例训练(21~30)
Nov 15 #Python
python下10个简单实例代码
Nov 15 #Python
You might like
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
2010/02/08 PHP
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
JS异常处理try..catch语句的作用和实例
2014/05/05 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
如何阻止复制剪切和粘贴事件为了表单内容的安全
2013/05/23 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
webpack4.0 入门实践教程
2018/10/08 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
[49:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 KG VS TNC
2018/03/31 DOTA
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
python下载图片实现方法(超简单)
2017/07/21 Python
基于Python os模块常用命令介绍
2017/11/03 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Django密码存储策略分析
2020/01/09 Python
TensorFlow梯度求解tf.gradients实例
2020/02/04 Python
详解Python的三种拷贝方式
2020/02/11 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
医科学校毕业生自荐信
2013/11/09 职场文书
大学同学聚会邀请函
2014/01/29 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
十一国庆节“向国旗敬礼”主题班会活动方案
2014/09/27 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
十大最强妖精系宝可梦,哲尔尼亚斯实力最强,第五被称为大力士
2022/03/18 日漫