Python编程使用NLTK进行自然语言处理详解
作者:白马负金羁 发布时间:2022-07-05 11:47:06
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言工具箱(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”,你可以不必理会,它基本不影响你的使用与开发。
既然你已经安装成功,我们来小试牛刀一下。当然本文涉及的主要任务都是自然语言处理中最常用,最基础的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中requests库session对象的妙用详解
13个最常用的Python深度学习库介绍
python爬虫系列Selenium定向爬取虎扑篮球图片详解
如有不足之处,欢迎留言指出。
来源:http://blog.csdn.net/baimafujinji/article/details/51051505
猜你喜欢
- FLV在线转换,是目前主流播客网上通用的一种视频解决方案需要用到的组件 ASPExecmencoderffmpeg.exe第一步骤: 在线转
- 在网站的一些应用中需要提供用户直接打印页面的功能,最明显的就是电子优惠券,商家根据网站提供的模板输入内容,然后生成优惠券页面,用户打印这个页
- 1 、据说python3就没有这个问题了2 、u'字符串' 代表是unicode格式的数据,路径最好写成这个格式,别直接跟字
- 这个示例使用的Python版本为3.7版本,一、bing壁纸接口访问bing的官网,通过浏览器开发者工具,查看网络可以找到一个请求壁纸的接口
- 1、信息表新建立一个字段,并用0、1的方法判断信息的状态。 2、新建一个页面,定时刷新,并查询表中是否有字段值为0的记录。 3、当管理员点击
- 本文实例讲述了php绘制圆形的方法。分享给大家供大家参考。具体实现方法如下:php绘图的基本步骤,有四步(php.ini里的 extensi
- sql server 全文检索有两种搜索方式,一种是contains,另一种是freetext。前者是包含,类似于 like '%关
- 数据完整性是任何数据库系统要保证的重点。不管系统计划得有多好,空数据值的问题总是存在。本文探讨了在SQL Server中处理这些值时涉及的3
- meta是html语言head区的一个辅助性标签。几乎所有的网页里,我们可以看到类似下面这段的html代码:<head> <meta&nbs
- 求英文字母、数字、下划线、汉字的js正则表达式英文字母或数字或下划线,英文字母数字下划线是:/^\w+$/汉字的是:/^[\u0391-\u
- 原文:10 Principles Of Effective Web Design翻译:熊猫2008-02-03本文由熊猫同学授权翻译首发。并
- matplotlibmatplotlib是最流行的python底层绘图库,接下来就由小编为大家介绍一些关于matplotlib的一些基本图形
- 用途:图片经常使用onload来改变宽度,但这样会出现图片的闪烁,这个简单的类就是用来解决这个问题的。函数loadImage,用来加载图片,
- 由于:Django处理静态文件不太友好;以后有可能需要处理php或者其他资源的请求;所以考虑结合nginx,使用nignx做它擅长的路由分发
- 前言今天的文章比较基础,但却是必须掌握的,而且本文有些内容,也许你之前没想过。希望这篇文章能够让你理解环境变量并掌握 Go 环境变量相关操作
- 解决了ACCESS数据库路径的问题!采用DBType=0或DBType=1来区分AC库还是MSSQL库具体采用AC库时应注意的事项,请看程序
- 打开php.ini,首先找到;;;;;;;;;;;;;;;;; file uploads ;;;;;;;;;;;;;;;;;区域,有影响文件
- 如何将123456789转化成123,456,789这样的形式呢?很多流量大的站比如优酷都有这样的格式。也是设计程序最常用的算
- 代码如下:Create PROCEDURE Batch_Delete @TableName nvarchar(100), --表
- <% On Error Resume Next Const uploadPath = "/uploads/"