本文系书稿选登。
2.1 自然语言处理概述
自然语言处理(Natural Language Processing,NLP)是计算机科学、人工智能和语言学的交叉学科,其范畴广泛,比如:语音合成、分词、词法分析、问答系统、机器翻译、情感分析等等。
2.1.1 什么是自然语言处理
对于开发者而言,至少掌握了一种自然语言,也至少掌握了一种计算机编程语言。自然语言是人与人之间用于相互分享信息的语言,比如在程序中的注释,都是以自然语言的方式说明相应代码的含义,以便于其他人理解;编程语言是我们用以告诉计算机应该做什么的“命令”,一般是通过编译器或解释器转化为“机器能理解”的“机器语言”。
在人与人之间通常信息交流中,不需要将自然语言“翻译”成“机器语言”,但是,在解决某些场景的任务时,如果要将计算机作为解决问题的工具,则需要让“机器”能理解“自然语言”。
例如:在对《红楼梦》这部名著研究上(称为“红学”),对于其前八十回和后四十回是否是同一个作者,在“红学”界曾经有争论。以胡适、俞平伯、周汝南等研究者为代表的一派认为前八十回为曹雪芹创作,后四十回是高鹗续写;而鲁迅、林语堂、王国维、白先勇等研究者则认为整部书是曹雪芹一人写就。可以说,文学家是用“文学方法”对《红楼梦》进行研究,得出上述论断的。如果让工程师来研究这个命题,一种简单的方法就是对《红楼梦》文本中的关键词进行聚类,如果前八十回和四十回的关键词汇所在的类别,有比较明显区分,那么就可以判断是两个作者(代码参考:https://nbviewer.org/github/yunshuipiao/sw-kaggle/blob/master/experimental/sidamingzhu/01.ipynb),从而为“作者是谁”的纠纷提供了科学证据。类似的工作还有判断戏剧《亨利八世》的作者(参考:https://arxiv.org/pdf/1911.05652.pdf),也是用“技术”作为工具,为结论提供证据。
在上述示例中,“计算机”是人研究著作中的自然语言的工具,须让“机器”读懂自然语言,这个过程就是自然语言处理(NLP)。
以文学作品为载体的自然语言,毕竟是少量的,更大量的自然语言以网页、社交媒体、电话、邮件、广播以及各种日常交谈等媒介和方式、途径传播,据 IBM 研究,2017年的时候,每天产生 2.5 艾字节(艾字节,即:Exabyte,缩写为 EB,是信息的计量单位,
)。显然,现如今应该比这个数字还大。而这些自然语言,多数是以非结构化的文本或语音形式存在,如何理解和处理这些海量的非结构化数据,是 NLP 的核心目标之一。例如针对特定问题的基于社交媒体的舆情分析,就是要通过对社交媒体上的大量文本和音、视频中的自然语言进行分析,从而得出或者帮助相关人员得出某些结论。
有很大可能,读者已经在使用日常生活中使用到了 NLP 技术,比如用翻译软件将一段中文翻译为英文,这背后就是 NLP 技术的支撑。在这里,我们可以用一种简单的方式,初步体验 NLP 技术。
在本地计算机上安装如下两个 Python 第三方模块。
PyAudio:这是一款适用于多种操作系统的音频 I/O 库,通过它能够在 Python 程序中播放和记录音频信息。
- 在 Windows 系统上,执行如下安装指令:
pip install pyaudio
- 在 MacOS 系统上,执行如下安装指令:
brew install portaudio
pip install pyaudio
- 在 GNU/Linux 系统上,首先安装
portaudio19-dev
,方法如下:sudo apt-get update -y
sudo apt-get install -y portaudio19-dev
并且已经配置了 Python 3 开发环境,而后执行如下指令安装:pip install pyaudio
也可以用下述指令直接安装,但不保证是最新版:sudo apt install python3-pyaudio
SpeechRecognition:这是一款实现语音识别的库,支持多种引擎,提供了在线和离线两种模式。安装方法如下:
代码语言:javascript复制pip install SpeechRecognition
以上模块安装完毕,创建一个 Python 程序(此处命名为 speech.py
),该程序代码如下:
#coding:utf-8
import speech_recognition as sr
r = sr.Recognizer()
with sr.Microphone() as source:
print("Talk")
audio_text = r.listen(source)
print("Time over, thanks")
try:
print(f"Text: {r.recognize_google(audio_text)}")
except:
print("Sorry, I did not get that.")
执行此程序,并在出现提示语 Talk
的时候,对着计算机的话筒说一句简短的话(仅限于说英语,这是由所用模块决定的) ,比如我在测试中说的是 What's your name
,而后程序就会把我说的这句话(语音)转化为文本,并打印出来。
code % python speech.py
Talk
Time over, thanks
Text: what's your name
通过上述示例,初步体验到了 NLP 技术,特别是使用有关库和模块,自己也能完成有关技术的开发。诚然,自然语言处理所要解决的问题还很多,下面就具体介绍。
2.1.2 自然语言处理的任务
在实际的生活、生产等领域,NLP 能够完成的或者我们希望 NLP 完成的的任务有很多种,下面列出几项:
- 分词(Tokenization):一般认为,词是研究一个句子所表达含义的最小单位(即所谓最小“粒度”)。不同的自然语言,分词的难易程度不同。对于英文,会用空格区分句子中的词,如“I am an old coder”。但是,中文则不然,比如本书中的中文内容,每个字和每个字之间并没有天然的分隔符,更何况,不同的划分结果,还会出现对句子含义的不同理解。例如“打死老虎”,如果是“打死/老虎”,那么就显示了“武松”的气概;但在鲁迅先生的《坟·论“费厄泼赖”应该缓行》一文中,须为“打/死老虎”,才与后文的“装怯作勇,颇含滑稽,虽然不免有卑怯之嫌,却怯得令人可爱。”相匹配。故,中文分词有难度。
- 词义消歧(Word-sense Disambiguation,WSD):同一个词在不同句子中,会有不同的含义,这种现象在各类自然语言中都比较常见,比如“秋后算账”和“会计正在算账”中的“算账”,在两个句子中有不同的含义。WSD 的任务就在于识别词的正确含义。
- 命名实体识别(Named Entity Recognition,NER):所谓命名实体,是指可以用专有名词(或名称)标识的事物,在句子中,一般包括人名、地名、机构名、专有名词等,也包括时间、数字等。NER 的任务就是将这些词从句子中抽取出来。例如“《机器学习数学基础》是电子工业出版社2022年出版的”,其中的“机器学习数学基础”(作品)、“电子工业出版社”(组织机构)、“2022年”(时间)就是这句话中的命名实体。NER 是信息检索和知识表示的基础。
- 词性标注(Part-of-Speech(PoS)tagging):即用一个表示词性的标签标记句子中的词,如名词、动词、形容词、副词、介词等。
- 文本分类(Text Classification),也又称为“文本标注”(Text Tagging):指在给定的分类体系中,将文本划分到某个或某几个类别中。被分类的文本可能是短文本,例如句子、标题、商品评论等等;也可能是长文本,如文章等。分类体系一般是人为规定,比如新闻类别:政治、体育、军事等;商品评论的情感倾向:正向、负向;等等。
- 自然语言生成(Natural Language Generation,NLG):是指用大量文本组成的语料库训练深度学习模型,而后用该模型自动生成新的文本,比如“自动写新闻”、“聊天机器人”等,都是 NLG 的典型应用。
- 问答(Question Answering, QA):自动地为客户解答有关问题,是 NLP 在商业上的一个重要任务。一个智能化的 QA 系统涉及 NLP 的很多方面内容,比如信息检索、知识表示等,甚至于也与特定的商业内容息息相关。这也说明,开发智能化程度较高的 QA 系统是一项具有挑战性的工作。
- 机器翻译(Machine Translation,MT):由于操不同自然语言的人之间分享信息的需要,机器翻译也就很早即成为了科学家们的研究对象。自从 1954 年成功将 60 句俄文自动翻译为英文之后,研究者通过不同方法提升机器翻译的效果,并降低成本,直到现如今被普遍采用的在线翻译工具。当然,如今的 MT ,距离“如同真人一样”的目标仍有很大的发展空间。
以上几项,并非 NLP 的全部任务。一个能够协助人完成日常任务的 NLP 系统,往往是多项任务的组合。比如通过语音向电商平台的智能客服询问:请给我推荐一本不错的深度学习的书。而后智能客服也用语音回复:《飞桨:深度学习入门与实战》是读者反应很好的一本书。这个问答中至少包含了“语音和文本的相互转换”、“语义和情感分析”、“智能问答”等任务。