侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   214

自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。自然语言工具箱(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编程使用NLTK进行自然语言处理详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

python中requests库session对象的妙用详解

13个最常用的Python深度学习库介绍

python爬虫系列Selenium定向爬取虎扑篮球图片详解

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


  • 上一条:
    python内置函数:lambda、map、filter简单介绍
    下一条:
    高质量Python代码编写的5个优化技巧
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客