Java自然语言处理(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-17 22:45:03

点击下载

作者:(美)理查德M.里斯(Richard M.Reese),邹伟,孙逢举

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Java自然语言处理

Java自然语言处理试读:

前言

自然语言处理(NLP)已用于解决各种各样的问题,包括对搜索引擎的支持,对网页文本的总结与分类,以及结合机器学习技术解决诸如语音识别、查询分析等问题。它已经在任何包含有用信息的文件中使用。

NLP用于增强应用程序的实用性和功能,主要通过简化用户输入以及将文本转换成更加可用的形式来实现。实际上,NLP能够处理各种来源的文本,使用一系列核心NLP任务从文本中转化或提取信息。

本书重点介绍NLP应用中可能遇到的核心NLP任务,每个NLP任务都从问题的描述以及可应用领域开始。介绍每项任务中比较困难的问题,以便你能更好地理解问题。随后通过使用大量的Java技术和API来支持NLP任务。

本书涵盖内容

第1章解释了NLP的重要性和用法。本章以简单的例子来解释如何使用NLP技术。

第2章主要讨论标记化,标记化是使用更为先进的NLP技术的第一步,本章介绍了核心Java和Java NLP标记化API。

第3章证明句子边界消歧技术是一个重要的NLP任务。这一步是其他许多下游NLP任务的预处理步骤,其中文本元素不应跨越句子边界进行分隔。这样就可以确保所有短语都在一个句子中,并支持词性分析。

第4章涵盖了通常所说的命名实体识别。这个任务主要涉及识别人、地点和文本中相似的实体。该技术是处理查询和搜索的初始步骤。

第5章说明如何检测词性,词性是文本中的语法元素,例如名词和动词。识别这些元素是确定文本含义和检测文本内关系的重要步骤。

第6章证明文本分类对于垃圾邮件检测和情感分析等任务非常有用。此外,本章也对支持文本分类的NLP技术进行了调查和说明。

第7章演示解析树。解析树可应用于很多目的,其中包括信息提取。信息提取拥有这些元素之间关系的信息。通过一个实现简单查询的例子来说明这个过程。

第8章包含从各种类型的文件(如PDF和Word文件)中提取数据的技术。接下来主要介绍了如何将以前的NLP技术结合至一个管道中以解决更大的问题。

阅读本书的技术准备

Java SDK 7用于说明NLP技术。各种NLP API是必需的并可以随时下载。IDE可选择,并不做强制要求。

本书读者对象

对NLP技术感兴趣的、有Java经验的开发人员会发现这本书很有用。不需要事先具备NLP知识。第1章NLP简介自然语言处理(NLP)是一个宽泛的主题,它以借助计算机分析自然语言为核心,主要涉及语音处理、关系结构提取、文档分类、文本摘要等任务。不过,这些看似各异的任务都依赖于一些基本技术,包括分词、断句、分类和关系提取等,而本书也更侧重于这些基本技术的研究。首先,本章将详细讨论什么是NLP,为何NLP非常重要,以及NLP的具体应用领域有哪些。很多语言和工具都支持NLP任务。本书主要讨论Java语言以及各种Java API如何支持NLP。本章首先介绍一些常用的API,包括Apache的OpenNLP、斯坦福的NLP库,以及LingPipe和GATE等。接下来进一步分析前面提到的那些NLP基本技术。本书将基于NLP API介绍这些技术的基本原理及其具体使用方法。很多技术都会使用一些模型,这些模型可以看作一组规则,这些规则用于执行分词等任务。它们通常由从文件实例化的类表示。最后会说明如何为支持NLP任务准备数据。NLP并不简单。虽然有些问题可以相对简单地解决,但大多数问题都需要使用非常复杂的技术。本书仅使读者对NLP处理技术有初步认识,使其在处理具体问题时能够使用相应的技术。NLP是一个非常复杂的领域,本书通过Java实现一些核心的NLP任务,以帮助读者略窥自然语言处理中冰山的一角。在书中,通过Java SE SDK和OpenNLP、Stanford NLP等开源库展示了NLP的一些基本技术。使用这些库以前,需要将一些API JAR文件关联到相关API的项目中。关于这些库的说明可以参照1.4节,相关的下载链接也一并附上。本书所有例子都是在NetBeans 8.0.2下开发的,读者需要通过工程的属性对话框自行添加相关API JAR文件的链接。1.1什么是NLP

NLP的定义为:NLP是一个使用计算机科学、人工智能和形式语言概念对自然语言进行分析与研究的领域。用通俗的话来讲,就是如何用一些方法和工具从类似网页、文档这样的自然语言资源中得到有意义的、有用的信息。

这不仅是一个有意思的学术难题,也充斥着巨大的商业价值,从它在搜索引擎上的应用就可以看出。用户输入的查询语句经过NLP技术处理后才能返回他们想要的结果,现代的搜索引擎在这方面已经非常做得非常成功了。此外,NLP技术在自动救援系统、复杂问答系统(如IBM Watson项目)中也有广泛应用。

当进行处理语言时,会频繁使用词、语法、语义。语法是构成一个有效语句的规则,例如最常见的英语句子结构是“主语+谓语动词+宾语”结构,如“Tim hit the ball”。而不是其他反常语序,类似“Hit ball Tim”。尽管相比于计算机语言,英语的语法很不严格,但语句基本还是会遵守一定的语法规则。

语义是指一个句子所表达的意思。懂英语的人都明白“Tim hit the ball”这句话的意思。但不管是英语还是其他语言,在很多情况下都存在一定的二义性,一个句子的意思可能需要通过上下文才能真正确定。我们会看到很多机器学习技术是如何尝试理解文本的正确含义的。

后续的讨论将会介绍很多语言学的词汇,这些术语一方面可以帮助读者更好地理解自然语言,另一方面也可以在解释大量NLP技术的时候提供一个共同的词汇表。我们将看到文本如何被拆分成独立的元素,而这些元素又如何被分类。

总的来说,NLP技术是用来增强应用程序的,用程序为用户提供更有价值的服务。NLP技术既包含相对简单的应用,也包含最前沿科技。本书将通过具体实例说明一些可以解决特定问题的简单NLP方法,也会介绍应用于更复杂需求的高级库和类。1.2为何使用NLP

NLP技术应用的方式多种多样,解决的问题也各有不同。以文本分析为例,它既包括用户在网上输入的简单查询语句,也包括需要生成摘要的大型文件。近些年来,非结构化数据数量在飞速增加,它们以博客、微博等社交媒体的形式广泛散布于整个网络,其数量之大已远远超过人类阅读能力的极限。NLP技术是分析这些数据的最佳手段。

机器学习和文本分析是提高应用价值的常用手段。常见应用领域如下。

·搜索:识别文本中的特定元素,可以仅仅是寻找文件中的名字,也可以涉及同义词、误拼写单词分析,以找到与原搜索近似的条目。

·机器翻译:将一种语言翻译成另一种语言。

·提取摘要:对段落、文章、文档或文档集合自动提取摘要。NLP在这一方向已经十分成功。

·命名实体识别(NER):从文本中提取地点、任务、事物的名称,通常用于和其他NLP任务(如查询)的连接。

·信息分组:主要基于文本数据,可自动创建一系列反映文件内容的类别。比如有些网站会根据用户需要将内容自动分类列在网页一侧。

·词性标注(POS):将文本分隔为不同的语法元素(如名词、动词),作为文本后续分析的基础。

·情感分析:自动分析人们对书、电影或其他产品的情绪和态度,自动获得消费者对产品的反馈。

·问答系统:IBM的Watson系统是很好的例子,它已经在Jeopardy竞赛中胜过人类,当然智能问答不仅限于玩这种综艺游戏,它在医疗等行业已经有很好的应用。

·语音识别:虽然人的语音很难分析,但NLP技术在语音识别领域取得了很多成就。

·自然语言生成:通过知识数据自动产生文本,可用于自动播报天气信息或总结医疗报告单。

NLP技术主要基于机器学习方法解决问题,因此基本流程为训练模型,验证模型准确度,并利用这个模型解决实际问题,1.6节会对该过程进行详述。1.3NLP的难点

由于多种因素的影响,使得NLP非常复杂。比如,世界上有几百种自然语言,每一种都有不一样的语法规则。单词很多具有歧义性,需要结合上下文才能确定其含义。本章主要探讨其中更有意义的几个难点。

在字符层面上,需要考虑以下因素。首先要确定文档的字符编码方式,是ASCII、UTF-8、UTF-16,还是Latin-1。其次,需要确定文本是否区分大小写,标点符号和数字是否需要特殊处理,有时候还需要考虑字符表情(一些特定的字符组合、字符图像)、超链接、重复标点(…或┄)、文件后缀名以及夹在名字中的点号等。这些大多会出现在文本预处理阶段,1.7节会进一步进行说明。

NLP的第一步是将一个句子/文本拆分成一个词语序列,这些词语称为词项,而这种处理技术就称为分词。对于用空格来分隔单词的语言,分词并不难做,但对于像汉语这样词与词之间无间隔的语言,分词是件十分困难的事情。

第二步,给字词和语素标注语义标签,标注它们是哪种类型的单元。语素是文本中最小的语法单位,例如前缀和后缀。在处理单词的时候,我们往往需要考虑同义词、缩写、首字母缩写、拼写习惯等。

第三步,词干化处理,也就是找出单词中的主干部分,例如单词“walking”“walked”“walks”的词干是“walk”。搜索引擎通常会使用词干法来处理查询语句。

与词干化类似的还有词形还原。这个过程主要确定单词的基本形式,也称为词元。举个例子,单词“operating”的词干是“oper”,但它的词元是“operate”。词形还原是比词干化更精确的一个过程,通常会基于单词表或形态学技巧来得到词元,很多场景下的分析结果都很精确。

一个个词汇的组合就是短语或句子。但句子的确定并不是简单地寻找句子末尾的句点,因为很多其他地方也会出现句点,如“Ms.”,又或者数字“12.834”。

在此基础上,还需要进一步理解句子中哪些是名词,哪些是动词。有时人们并不明确单词之间的指代关系。共指消解很好地解决了这个问题,它主要确定一个单词在一个或多个句子中的指代关系。比如下面这个句子:

“The city is large but beautiful.It fills the entire valley.”

句子中的“it”指代“city”。然而,当一个单词有多个意思的时候,需要使用词义消歧算法来确定含义,有时候这很困难。比如“John went back home”中“home”指的是一间房子,一个城市还是其他的什么东西?它的具体意思往往只能通过上下文来推断。比如“John went back home.It was situated at the end of a cul-de-sac.”

尽管困难很多,但在多数情况下NLP技术还是可以合理地处理好这些问题的,并提供附加的信息。比如通过推特数据分析消费者情绪,进而为不满意的消费者提供免费的产品。又如对医疗检查报告进行总结,突出显示比较重要的条目。

提取摘要是指对文本内容产生一个简短描述的过程,这些文本内容可以是多个句子、段落、一个或多个文档。其主旨是找到能表达这个内容的语句,或要理解这些内容的主要信息,或获取用户想得到的条目。通常弄清楚内容的上下文是提取摘要的关键。1.4NLP工具汇总

NLP工具有很多。一部分可以借助Java SE SDK使用,但功能有限,只能处理简单的问题;另外一部分是开源库,如Apache的OpenNLP和LingPipe,可以用来解决比较复杂的NLP问题。

Java的字符串类,如String、StringBuilder、StringBuffer可以视为低级的NLP工具,这些类包含了最基本的搜索、匹配、文本替换功能。此外,Java也支持正则表达式,这些正则表达式主要用于特殊编码和子串匹配。Java也为使用正则表达式提供一组丰富的方法。

Java也在一定程度上支持分词(将文本分隔为独立的元素):

·String类中的split方法

·StreamTokenizer类

·StringTokenizer类

此外,就是各种NLP库和API。下面的表格中列出了部分Java语言的NLP API,大多数都是开源的。当然还有一些是商业API,本书主要关注开源API。

很多NLP任务可以组成一个流水线,里面包含一系列NLP任务,可以实现某个目标。支持流水线的示例框架有GATE和Apache UIMA等。

下一节将会进一步研究部分NLP API,包括这些API的整体框架以及每个API包含的一些相关链接。1.4.1 Apache OpenNLP

Apache OpenNLP不仅具备了大多数常用的NLP功能,还包括执行特定任务、训练模型、测试模型等的组件。OpenNLP的使用步骤一般是先从文件中实例化一个支持当前任务的模型,然后在该模型上执行相关方法来完成任务。

下面的例子中,我们将对一个简单的字符串进行分词。当然,要让代码正确执行,FileNotFoundException和IOException的异常捕获代码需要补全。使用try-with-resource模块,借助en-token.bin文件打开一个FileInputStream实例,其中en-token.bin文件包含一个已使用英文文本训练好的分词模型:

在try块中,用这个文件创建一个TokenizerModel类实例,再用这个实例创建Tokenizer类实例:

然后调用tokenize方法,可以对字符串进行分词,该方法返回一个String对象数组:

使用一个for循环输出分词结果,使用中括号标记每个词项:

执行完后,可以得到如下结果:

在这个例子中,tokenizer识别出W.是一个缩略词,而最后的句点是标记句子结尾的分隔词项。

本书中的许多示例都将使用OpenNLP API。OpenNLP链接如下表所示:1.4.2 Stanford NLP

作为NLP领域的领导者,Stanford NLP组开发了很多NLP工具,Stanford CoreNLP是其中之一。此外,他们还开发了其他的工具组,如Stanford Parser、Stanford POS tagger、Stanford Classifier等。Stanford系列工具同时支持中英文和基本NLP功能,包括分词和命名实体识别。

所有这些工具都基于GPL开源协议发布,但不允许用于商业应用。发布的API不论是组织结构,还是对核心的NLP功能的支持度,都非常优秀。

Stanford工具组支持多种分词技术,本书使用其中的PTBTokenizer类来说明NLP库的用法。构造器的参数包括一个Reader对象,一个LexedTokenFactory参数,以及一个指定选项设置的字符串。

LexedTokenFactory是一个由CoreLabelTokenFactory和WordTokenFactory类实现的接口。前一个类会保留每个词项在字符串中的起止位置,而后一个类仅仅返回词项,不保留任何位置信息,默认选择后一个类。

下面的例子使用CoreLabelTokenFactory类。用待处理字符串初始化一个StringReader实例,最后的选项设置字符串设为null。PTBTokenizer实现了Iterator接口,因此可以用hasNext和next方法来列出得到的词项列表。

输出结果如下:

本书频繁使用Stanford NLP库。下表为一些Stanford NLP相关链接,主要包括各个库的说明文档和下载链接等。1.4.3 LingPipe

LingPipe是一组实现了常用NLP功能的工具,支持模型训练和测试。这组工具包括完全免费版与需要许可版,其中,免费版也禁止用于商业产品。

还是以Tokenizer类进行分词为例说明LingPipe的用法。先声明两个列表,一个用于存放词项,另一个用于存放空格:

接下来,声明一个待分词的字符串:

然后创建一个Tokenizer类的实例。使用基于Indo-European factory类的Tokenizer类的静态tokenizer方法来创建类实例:

调用tokenize方法可以产生上面定义的两个列表:

最后,输出分词结果:

结果如下:

LingPipe相关的链接如下表所示:1.4.4 GATE

文本工程通用架构(GATE)是英国Sheffield大学开发的一组Java工具,支持多种语言和NLP任务,还可以用于构建NLP处理工作流。

GATE在提供API的同时还包括其他一些工具。GATE Developer是一个文本可视化工具,可以展示文本标注,通过高亮标记来检查文本。GATE Mimir对大量来源文本进行索引和搜索。GATE Embedded具有直接向代码中植入GATE的功能。用GATE来实现NLP任务代码量很少。下面是一些与GATE相关的链接。1.4.5 UIMA

结构信息标准组织(OASIS)是信息商业技术领域的一个协会,提出了一套NLP工作流框架标准UIMA,由Apache UIMA支持。

UIMA虽然是关于工作流的标准,但它也对相关的设计模式、数据表达、文本分析的用户角色进行了描述。UIMA相关的链接如下:1.5文本处理概览

NLP任务种类很多,本书仅对其中一部分进行介绍。下面是本书涉及内容的纲要,在后续章节将一一讨论。

·文本分词

·文本断句

·人物识别

·词性判断

·文本分类

·关系提取

·方法组合

当然,为实现一些自然语言处理目标,这些任务往往会组合起来使用,这一点在后面章节中会有更多体现。比如分词技术只是一个基础性步骤,它通常会作为某些任务的第一步。1.5.1 文本分词

文本可以分解成不同类型的基本元素,如词、句子、段落,这些元素的分类方法也有很多。本书的文本分解特指将文本分隔成词,也称为词项。形态学是研究词语结构的专业,我们会用到很多形态学的专业词汇来解释NLP技术。词的类型很多,下面列出一些常见的类别:

·简单词语:像这句话里这些词都可以算是简单词语。

·词素:一个单词中最小的有意义单元成为词素。比如单词“bounded”中,“bound”是词素,词素也包括后缀“ed”。

·前缀/后缀:是指词根前后的辅助部分。比如单词“graduation”中“ation”是词根“graduate”的后缀。

·同义词:是指具有相同意义的词语。“small”和“tiny”可以算是同义词。解决这一问题需要进行词义消歧。

·缩写词:比如我们将Mister Smith缩写成Mr.Smith。

·首字母缩写:在计算机等很多专业领域,首字母缩写都十分常见。通常把一些较长词句的首字母组合起来,形成缩写。比如将FORmula TRANslation写成FORTRAN,甚至还有递归缩写GNU(Gnu's Not Unix),当然还有我们正在讨论的NLP。

·缩约词:像”We’ll”“won’t”这种将两个单词合并的写法,也是很常见的。

·数字:普通的数字只包含基本的0~9十个字符,但复杂的数字可能还包括小数点、正负号等多种科学计数标志。

在NLP任务中,确定这些词项的类型十分重要,比如在断句时,我们需要将句子分隔成词,并判断词是否是句子的结尾。

这一过程称为分词。分词的结果是一组词项,其中决定文本在哪里断开的元素叫作分隔符。对于大多数英文文本来说,空格是常用的分隔符,包括空白符、tab符、回车符。

分词可以简单,也可以复杂。我们用String类的split函数来做一个简单的分词。首先定义一个字符串,包含如下待分词文本:

split方法用一个正则表达式参数来指定文本分隔的方式。下面代码中参数是\\s+,表示一个以上的空格作为分隔的分隔符:

再用一个for-each循环显示分词结果:

结果如下所示:

第2章会更深入地探讨分词技术。1.5.2 文本断句

我们普遍认为断句非常简单,因为在英文中,只需要找到点号、问号、感叹号等这些句终字符就可以确定一个句子的结尾。然而,事情并非想象得这么简单,短语中嵌入的点号(“Dr.Smith”或“204SW.Park Street”)等其他因素使得准确断句变难,第3章中我们会详细分析。这一步骤也称为句子边界消歧(SBD)。英文的SBD相较于句终符明确的汉语、日语更有研究意义。

断句是很多其他NLP任务的前导工作,像词性标注、实体检测都需要在独立的句子上进行,问答应用也需要对句子进行识别。要完成这项任务,必须先准确地完成断句。

下面我们用Stanford的DocumentPreprocessor类来演示如何断句。这个类接受一个简单的文本或XML文档,返回一个句子列表,并给出了Iterable接口,方便循环遍历。

首先声明一个字符串存放文本:

对这个字符串创建一个StringReader对象,该支持DocumentPreprocessor类的构造器所需的read方法:

现在,DocumentPreprocessor对象里存储了对应的文本段落。我们可以再创建一个字符串列表来存储从文本中提取出来的句子:

对documentPreprocessor的每一个元素进行处理。这些元素是HasWord列表,每个HasWord对象表示一个词。我们用一个StringBuilder来存储HasWord列表中的每个元素,然后把它转成字符串加入到上面定义的sentenceList:

最后,用for-each语句输出sentenceList中所有的句子:

输出结果如下:

在第3章会更深入地介绍SBD。1.5.3 人物识别

搜索引擎极大地满足了大多数用户寻找商家网址、电影上映时间等需求,文本处理器可以很轻松地从文档中找到指定的单词或短语。然而如果想进一步考虑同义词的问题,事情就会复杂得多,如何找到与用户搜索词意思相近或相同主题的内容是一个很有难度的任务。

举个例子,比如我们想买一台新的笔记本电脑的时候去网上搜索,当在搜索引擎中搜索指定配置的笔记本时,搜索引擎如何得到我们想要的结果?实际上,搜索引擎通常是在我们进行搜索之前就一直在对商家提供的各种信息进行分析,需要从网上各种杂乱无章的信息中获取到有用的信息,并反馈给用户。

最终展现给用户的结果往往是按照类别进行分组的,通常会将类别显示在网页左侧。比如,笔记本电脑的类别可能包括超级笔记本(Ultrabook)、谷歌笔记本(Chromebook),或者按硬盘大小进行分类。下面是亚马逊搜索结果的一个截图:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载