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 相关文章推荐
Linux下编译安装MySQL-Python教程
Feb 02 Python
python友情链接检查方法
Jul 08 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 Python
python圣诞树编写实例详解
Feb 13 Python
django 外键创建注意事项说明
May 20 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
利用python爬取有道词典的方法
Dec 08 Python
Pytorch DataLoader shuffle验证方式
Jun 02 Python
Python编程super应用场景及示例解析
Oct 05 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 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
PHP输出时间差函数代码
2013/01/28 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
jquery之Document元素选择器篇
2008/08/14 Javascript
Javascript操作select方法大全[新增、修改、删除、选中、清空、判断存在等]
2008/09/26 Javascript
深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP
2012/01/15 Javascript
表单验证的完整应用案例探讨
2013/03/29 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
详解使用Nuxt.js快速搭建服务端渲染(SSR)应用
2019/03/13 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
[53:36]Liquid vs VP Supermajor决赛 BO 第三场 6.10
2018/07/05 DOTA
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python基于windows平台锁定键盘输入的方法
2015/03/05 Python
Python网页解析利器BeautifulSoup安装使用介绍
2015/03/17 Python
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
Flask数据库迁移简单介绍
2017/10/24 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
python添加模块搜索路径和包的导入方法
2019/01/19 Python
python几种常用功能实现代码实例
2019/12/25 Python
python实现在线翻译功能
2020/03/03 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
python爬虫工具例举说明
2020/11/30 Python
台湾良兴购物网:EcLife
2019/12/01 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
产品促销活动策划书
2014/01/15 职场文书
房产公证书范本
2014/04/10 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书