人工智能
自然语言处理广纳了众多技术,对自然或人类语言进行自动生成,处理与分析。虽然大部分 NLP 技术继承自语言学和人工智能,但同样受到诸如机器学习,计算统计学和认知科学这些相对新兴的学科影响。
在展示 NLP 技术的例子前,有必要介绍些非常基础的术语。请注意:为了让文章通俗易懂,这些定义在语言上就不一定考究。
词例(Token):对输入文本做任何实际处理前,都需要将其分割成诸如词、标点符号、数字或纯字母数字(alphanumerics)等语言单元(linguistic units)。这些单元被称为词例。
句子:由有序的词例序列组成。
词例还原(Tokenization):将句子还原成所组成的词例。以分割型语言(segmented languages)英语为例,空格的存在使词例还原变得相对容易同时也索然无味。然而,对于汉语和阿拉伯语,因为没有清晰的边界,这项工作就稍显困难。另外,在某些非分割型语言(non-segmented languages)中,几乎所有的字符(characters)都能以单字(one-character)存在,但同样也可以组合在一起形成多字(multi-characterwords)形式。
语料库:通常是由丰富句子组成的海量文本。
词性标签(Part-of-speech (POS) Tag):任一单词都能被归入到至少一类词汇集(set of lexical)或词性条目(part-of-speech categories)中,例如:名词、动词、形容词和冠词等。词性标签用符号来代表一种词汇条目——NN(名词)、VB(动词)、JJ(形容词)和 AT(冠词)。Brown Corpus 是最悠久,也是最常用的标注集之一。详情且听下回分解。
剖析树(Parse Tree):利用形式语法(formal grammar)的定义,可以用树状图来表示给定句子的句法(syntactic)结构。
认识了基本的术语,下面让我们了解 NLP 常见的任务:
词性标注(POS Tagging):给定一个句子和组词性标签,常见的语言处理就是对句子中的每个词进行标注。举个例子,The ball is red,词性标注后将变成 The/AT ball/NN is/VB red/JJ。最先进的词性标注器[9]准确率高达 96%。文本的词性标注对于更复杂的 NLP 问题,例如我们后面会讨论到的句法分析(parsing)和机器翻译(machine translation)非常必要。
计算形态学(Computational Morphology):大量建立在“语素”(morphemes/stems)基础上的词组成了自然语言,语素虽然是最小的语言单元,却富含意义。计算形态学所关心的是用计算机发掘和分析词的内部结构。
句法分析(Parsing):在语法分析的问题中,句法分析器(parser)将给定句子构造成剖析树。为了分析语法,某些分析器假定一系列语法规则存在,但目前的解析器已经足够机智地借助复杂的统计模型[1]直接推断分析树。多数分析器能够在监督式设置(supervised setting)下操作并且句子已经被词性标注过了。统计句法分析是自然语言处理中非常活跃的研究领域。
机器翻译(Machine Translation(MT)):机器翻译的目的是让计算机在没有人工干预的情况下,将给定某种语言的文本流畅地翻译成另一种语言文本。这是自然语言处理中最艰巨的任务之一,这些年来已经用许多不同的方式解决。几乎所有的机器翻译方法都依赖了词性标注和句法分析作为预处理。
Python 是一种动态类型(dynamically-typed),面向对象的解释式(interpreted)编程语言。虽然它的主要优势在于允许编程人员快速开发项目,但是大量的标准库使它依然能适应大规模产品级工程项目。Python 的学习曲线非常陡峭并且有许多优秀的在线学习资源[
NLTK是构建Python程序与人类语言数据工作的主要平台。它提供了易于使用的界面,以超过50语料库和词汇资源,如WordNet的,连同一套文字处理库进行分类,标记化,词干,标记,分析和语义推理,和活跃的william hill官网 。
得益于动手指南介绍编程基础在旁边计算语言学课题,NLTK适合语言学家,工程师,学生,教育工作者,研究人员和行业用户的一致好评。 NLTK可用于Windows,Mac OS X和Linux。最重要的是,NLTK是一个免费,开源,社区驱动的项目。
NLTK 官网提供了很棒的说明文件和教程进行学习指导[13]。单纯复述那些作者们的文字对于他们和本文都不公平。因此我会通过处理四个难度系数依次上升的 NLP 任务来介绍 NLTK。这些任务都来自于 NLTK 教程中没有给出答案的练习或者变化过。所以每个任务的解决办法和分析都是本文原创的。
正如前文所说,NLTK 囊括数个在 NLP 研究圈里广泛使用的实用语料库。在本节中,我们来看看三个下文会用到的语料库:
布朗语料库(Brown Corpus):Brown Corpus of Standard American English 被认为是第一个可以在计算语言学处理[6]中使用的通用英语语料库。它包含了一百万字 1961 年出版的美语文本。它代表了通用英语的样本,采样自小说,新闻和宗教文本。随后,在大量的人工标注后,诞生了词性标注过的版本。
古登堡语料库(Gutenberg Corpus):古登堡语料库从最大的在线免费电子书[5]平台 古登堡计划(Gutenberg Project) 中选择了 14 个文本,整个语料库包含了一百七十万字。
Stopwords Corpus:除了常规的文本文字,另一类诸如介词,补语,限定词等含有重要的语法功能,自身却没有什么含义的词被称为停用词(stop words)。NLTK 所收集的停用词语料库(Stopwords Corpus)包含了 来自 11 种不同语言(包括英语)的 2400 个停用词。
在开始利用 NLTK 处理我们的任务以前,我们先来熟悉一下它的命名约定(naming conventions)。最顶层的包(package)是 nltk,我们通过使用完全限定(fully qualified)的加点名称例如:nltk.corpus and nltk.utilities 来引用它的内置模块。任何模块都能利用 Python 的标准结构 from 。 。 。 import 。 。 。 来导入顶层的命名空间。
python安装
选择 2.7x版本进行下载,不建议下载3.X版本,因为现在很多python代码库还是基于旧的版本编写的,所以不建议使用3.X版本。安装完成后,使用打开自带的IDLE,结果如下:
Note:
推荐编写python代码好用的IDE:pycharm,上手比较简单,文档较齐全
下载地址:http://www.jetbrains.com/pycharm/
附几个PyCharm4注册码:
name :newasp
=====LICENSE BEGIN =====
09086-12042010
00001EBwqd8wkmP2FM34Z05iXch1Ak
KI0bAod8jkIffywp2WalWZejIQ6AAu
AVVPbzHZpOvqvdJFHEBbvbXW2t1jQI
=====LICENSE END =====
name :newasp
=====LICENSE BEGIN =====
58877-12042010
00002h9ii68IdWfbdJz2UraWcsVxFY
!w1WD9cwRDMoW2pOUeC0WBqLAMo5PX
lQ7cE8qMukEYuWY6!EnjYWn!2EDTio
=====LICENSE END =====
name :newasp
=====LICENSE BEGIN =====
46753-12042010
000013xjAPHl95oQRCb“KnLsrXfWYa
L3aYClCOtBVysdtzBBPU5XCB3QUjLC
T1yMRB7YNC0d15A2cbwXTwXCwCjJEP
=====LICENSE END =====
name :newasp
=====LICENSE BEGIN =====
62458-12042010
00002r53OfrSCVqjsI0zdG5E4pMM5Z
dBAGbxVOX!OPwIkBqunfKf2zQDgECf
XrLosbjBEp!2JfFuydkblmqWPevvB0
===== LICENSE END =====
下载NLTK及安装
官方网站:http://www.nltk.org/ 下载网址:https://pypi.python.org/pypi/nltk
由于是在windows环境下安装nltk,选择:
下载完成后,正常安装,在python安装目录下的能找到相应的NLTK库,作者机器路径如下:
C:Python27Libsite-packages ltk
安装完成后,进行测试:
下载NLTK数据源
输入import nltk如果没有出现异常,则表明nltk已经安装正确,但还需要下载相应的训练数据源,使用nltk.download()进行下载:
得到结果如图:
选择all,等待下载结束即可。
Note:
可能出现的问题:ImportError:No module named yaml
该问题是由于没有安装pyyaml,下载地址:http://pyyaml.org/download/pyyaml/PyYAML-3.10.win32-py2.7.exe
下载安装即可。
NLTK进行分句
函数:
sent_tokenize(text,language=‘english’)
参数:
text : 将要被分割的语句文本
language:Punkt分句程序指定模型名字,可忽略
返回值:
list类型:使用NTLK推荐分句程序得到的结果
示例:
NLTK进行分词
函数:
word_tokenize(text,language=‘english’)
参数:
text:将要进行分词的句子文本
language:Punkt分词程序指定模型名字,可忽略
返回值:
list类型,使用NTLK推荐分词程序得到的结果
示例:
NLTK词性标注
词性标注的结果含义可参照作者的另一篇博文:(自然语言处理文档系列)Penn Treebank词性标记集
函数:
pos_tag(tokens,tagset=None)
参数:
tokens:list(str)类型,将要被标注单词的序列
tagset:可忽略
返回值:
list(tuple(str,str)),进行词性标注后的结果
示例:
NLTK命名实体识别(NER)
函数:
ne_chunk(tagged_tokens,binary=False)
使用推荐的NER工具包进行处理,处理之前需要利用词性标注的结果
参数:
tagged_tokens:list(tuple(str,str)),NLTK进行词性标注的结果
binary:
返回值:
示例:
nltk没有好的parser,推荐使用stanfordparser,但是nltk有很好的树类,该类用list实现。可以利用stanfordparser的输出构建一棵python的句法树。关于stanfordparser在第3章中有详细介绍。
自然语言处理是非常热门的研究领域因此每年吸引了非常多研究生。它集合了多个学科诸如语言学,心理学,计算科学和数学的优势来研究人类语言。另外选择 NLP 作为研究生生涯更重要的原因是大量有意思的难题都没有固定的解决办法。举个例子,机器翻译初始问题(original problem)的存在推动了该领域的发展,即使经过二十年诱人而又活跃的研究以后,这个难题依旧尚待解决。还有另外几个前沿的 NLP 问题目前已经有大量的研究工作,其中一些列举如下:
基于句法的机器翻译:从过去的数十年到现在,绝大部分的机器翻译都聚焦在使用统计方法通过大量语料库来学习词和短语的翻译。然而,越来越多的研究者开始在研究中加入句法[10]。
多文本摘要:目前大量工作都是利用计算机从相近的文档集合[8]中自动生成高度相关的摘要。这个任务被视为比单文本的摘要困难,因为多文本中冗余信息更多。
计算句法分析:虽然使用概率模型自动生成给定文本的句法结构由来已久,但进步空间还很大。最大的挑战是准确的分析,当英语拿来和中文[7]、阿拉伯语比较的时候,语言特性差异很大。
Python 和 NLTK 使每个编程人员不需要花费大量时间在获取资源上,直接可以接触 NLP 任务。文本意在给任何对学习 NLP 感兴趣的人提供解决这些简单的任务例子和参考。
全部0条评论
快来发表一下你的评论吧 !