自然语言处理 (NLP) 是用于分析和生成人类语言的专业领域。人类语言,正确地称为自然语言,是高度上下文敏感的,并且经常模棱两可以产生独特的含义。 (还记得一个笑话,妻子要求丈夫“拿一盒牛奶,如果有鸡蛋,就拿六盒”,所以他拿了六盒牛奶,因为他们有鸡蛋。) NLP 提供了理解自然语言输入和适当地产生自然语言输出。

计算语言学(CL)是语言理解和建模的更大领域。 NLP 是 CL 的一个子集,处理语言理解和生成的工程方面。 NLP 是一个跨学科领域,涉及多个领域,包括人工智能 (AI)、机器学习 (ML)、深度学习 (DL)、数学和统计学。

您可以使用 NLP 构建的一些应用程序包括:

  • 机器翻译: 世界上有超过 6,000 种语言,NLP 与神经机器翻译相结合,可以轻松地将文本从一种语言翻译成另一种语言。

  • 聊天机器人: Alexa、Siri 和开源Mycroft等个人助理已融入我们今天的生活。 NLP 是这些聊天机器人的核心,帮助机器分析、学习和理解语音,并提供语音响应。

  • 语音支持: NLP 可以以友好的方式为医疗保健、旅游、零售和其他行业的客户提供服务。

  • 情绪分析: 企业总是希望了解客户的脉搏,并在客户感到不满时采取主动行动。 NLP 使这成为可能。

  • HR 生产力: 人力资源专业人员必须处理大量文档,而 NLP 可以使用文档流程自动化来减轻部分负担。

NLP 积木

就像摩天大楼是一砖一瓦建造的一样,您可以通过使用 NLP 的基本和基本构建块来构建像上面这样的大型应用程序。

有几个开源 NLP 库可用,例如 Python 中的 Stanford CoreNLP、spaCy 和 Genism,Java 和其他语言中的 Apache OpenNLP 和 GateNLP。

为了演示 NLP 构建块的功能,我将使用 Python 及其主要 NLP 库自然语言工具包 (NLTK)。 NLTK 是在宾夕法尼亚大学创建的。它是进入 NLP 的一个广泛使用且方便的起点。在了解了它的概念之后,您可以探索其他库来构建您的“摩天大楼”NLP 应用程序。

本文涵盖的基本构建块是:

  • 分词成句子和单词

  • 停用词

  • 搭配

  • 词性识别

  • 词干和词形还原

  • 语料库

设置

本文假设您熟悉 Python。安装 Python 后,下载并安装 NLTK:

pip install nltk

然后安装 NLTK 数据:

python -m nltk.downloader popular

如果你有很多存储空间和良好的带宽,你也可以使用python -m nltk.downloader all。请参阅 NLTK 的安装页面获取帮助。

还有一个用于选择要下载的数据的用户界面,您可以从 Python shell 开始:

蟒蛇 3.8.2 ...

输入“帮助”,...

>>> 导入 nltk

>>> nltk.download()

NLTK UI 截图

图片来源:

(Opensource.com,CC BY-SA 4.0)

标记句子和单词

文本分析和处理的第一步是将文本拆分为句子和单词,这个过程称为标记化。标记文本使进一步的分析更容易。几乎所有的文本分析应用程序都是从这一步开始的。

以下是这行文本的一些示例:

text = "Computers don't speak English. So, we've to learn C, C++, ,C#, Java, Python and the like! Yay!"

句子标记化:

从 nltk.tokenize 导入已发送_tokenize

句子 \u003d sent_tokenize(文本)

print(len(sentences), 'sentences:', 句子)

词标记化:

从 nltk.tokenize 导入单词_tokenize

单词\u003d单词_tokenize(文本)

打印(len(单词),'单词:',单词)

29 word(s): ['Computers', 'do', "n't", 'speak', 'English', '.', 'So', ',', 'we', "'ve", 'to', 'learn', 'C', ',', 'C++', ',', ',', 'C', '#', ',', 'Java', ',', 'Python', 'and', 'the', 'like', '!', 'Yay', '!']

NLTK 在内部使用正则表达式进行标记化。敏锐的读者可能会问,您是否可以在不使用 NLTK 的情况下进行标记化。是的你可以。然而,考虑到所有的变化,NLTK 是精心设计的。例如,像 nltk.org 这样的东西应该保留一个单词['nltk.org']而不是['nltk', 'org']:

text = "I love nltk.org"

如果您使用上面的代码进行标记,nltk.org 将保留为一个单词:

1 句:['我爱 nltk.org']

3 个词:['我','爱','nltk.org']

NLTK 不提供将“don't”替换为“do not”以及将“we've”替换为“we have”的功能,但pycontractions库可以提供帮助。

自己试试

使用 Python 库,下载维基百科关于开源的页面并标记文本。

停用词

像英语这样的语言有许多“绒毛”词(技术上称为“停用词”),这些词在演讲和写作中是必需的,但在分析中没有价值。 NLTK 可以识别和删除这些停用词,以帮助文本处理专注于必要的词。

查看被认为是停用词的词:

从 nltk.corpus 导入停用词

stop_words \u003d stopwords.words('english')

打印(len(停止_words),“停用词:”,停止_words)

179 stopwords: ['i', 'me', 'my', 'myself', 'we', ..., "wouldn't"]

首先标记文本,然后过滤掉停用词:

text \u003d "计算机不会说英语。所以,我们必须学习 C、C++、Java、Python 等!耶!"

从 nltk.tokenize 导入单词_tokenize

单词\u003d单词_tokenize(文本)

print(len(words), "原文:", words)

25 words in original text: ['Computers', 'do', 'not', 'speak', 'English', '.', 'So', ',', 'we', 'have', 'to', 'learn', 'C', ',', 'C++', ',', 'Java', ',', 'Python', 'and', 'the', 'like', '!', 'Yay', '!']

words \u003d [word in words if word not in stop_words]

print(len(words), "没有停用词:", words)

18 words without stopwords: ['Computers', 'speak', 'English', '.', 'So', ',', 'learn', 'C', ',', 'C++', ',', 'Java', ',', 'Python', 'like', '!', 'Yay', '!']

文本仍然有标点符号,这增加了噪音。要删除它们,请使用 Python 的字符串类。一些标点符号很重要,例如问号。此方法可用于删除标点符号(不使用 NLTK)。

查看被认为是标点符号的字符:

导入字符串

标点符号 \u003d 列表(字符串.标点符号)

打印(标点符号)

['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-'、'.'、'/'、':'、';'、'<'、'u003d'、'>'、'?'、'@'、'['、'\'、'] ', '^', '_', '`', '{', '|', '}', '~']

删除标点符号:

单词 \u003d [如果单词不在标点符号中,单词中的单词单词]

print(len(words), "没有停用词和标点符号的单词:", words)

11 words without stopwords and punctuations: ['Computers', 'speak', 'English', 'So', 'learn', 'C', 'C++', 'Java', 'Python', 'like', 'Yay']

自己试试

使用 Python 库,下载维基百科关于开源的页面并删除停用词。页面的百分之几是停用词?

搭配

搭配是指经常一起出现的两个(或更多)词。搭配有助于理解文本形成并有助于文本搜索和相似性比较。

本示例使用Project Gutenberg中的较长文本文件。 (古腾堡计划是一项数字化书籍的倡议。)

下载正文:

# 编码:utf-8

导入 urllib.request

# 下载文本并解码

# 注意:如果在代理后面设置代理 (https://docs.python.org/2/library/urllib.html)

网址\u003d“http://www.gutenberg.org/files/1342/1342-0.txt”

文本 \u003d urllib.request.urlopen(url).read().decode()

打印(文本)

古腾堡计划的傲慢与偏见电子书,简·奥斯汀(Jane Austen)

这本电子书可供任何人在任何地方免费使用

...

第1章

这是一个普遍公认的真理,一个人在

拥有好运

...

把她带到德比郡,是

团结他们。

预处理(标记化、去停用词和去标点):

# 标记化

从 nltk.tokenize 导入单词_tokenize

文本\u003d字_tokenize(文本)

# 删除停用词

从 nltk.corpus 导入停用词

停止 \u003d stopwords.words('english')

# 打印(停止)

words \u003d [如果单词不在停止中,则在文本中逐字逐字]

# 删除标点符号

导入字符串

标点符号 \u003d 列表(字符串.标点符号)

# 打印(标点符号)

单词 \u003d [如果单词不在标点符号中,单词中的单词单词]

print("没有标点符号:", words)

Preprocessed: ['The', 'Project', 'Gutenberg', 'EBook', 'Pride', 'Prejudice', 'Jane', 'Austen', ...

Bigrams(两个单词一起出现):

# 二元组

从 nltk.metrics 导入 BigramAssocMeasures

从 nltk.collocations 导入 BigramCollocationFinder

bigram_collocation \u003d BigramCollocationFinder.from_words(words)

# 出现次数最多的 10 种搭配

打印(“Bigrams:”,bigram_collocation.nbest(BigramAssocMeasures.likelihood_ratio,10))

Bigrams: [('”', '“'), ('Mr.', 'Darcy'), ('Lady', 'Catherine'), ('”', 'said'), ('Mrs.', 'Bennet'), ('Mr.', 'Collins'), ('Project', 'Gutenberg-tm'), ('“', 'I'), ('Sir', 'William'), ('Miss', 'Bingley')]

敏锐的读者可能会注意到双引号字符——”(代码点 8220)和“(代码点 8221)——在取消标点后仍然出现在文本中。string.punctuation没有检测到这些,因为它们与标准双引号“(代码点 34)不同。要处理这些,请将字符添加到标点符号列表中。

Trigrams(三个单词一起出现):

# 三元组

从 nltk.collocations 导入 TrigramCollocationFinder

从 nltk.metrics 导入 TrigramAssocMeasures

trigram_collocation \u003d TrigramCollocationFinder.from_words(文本)

# 出现次数最多的 10 种搭配

print("Trigrams:", trigram_collocation.nbest(TrigramAssocMeasures.likelihood_ratio, 10))

Trigrams: [('late', 'Mr.', 'Darcy'), ('Mr.', 'Darcy', 'returned'), ('saw', 'Mr.', 'Darcy'), ('friend', 'Mr.', 'Darcy'), ('Mr.', 'Darcy', 'walked'), ('civility', 'Mr.', 'Darcy'), ('Mr.', 'Darcy', 'looked'), ('said', 'Mr.', 'Darcy'), ('surprised', 'Mr.', 'Darcy'), ('Mr.', 'Darcy', 'smiled')]

“达西先生”几乎无处不在!你可以暗示他是小说的主角。这是使用 NLP 进行信息提取的示例。

自己试试

编程和开发

  • 红帽开发者博客

  • 编程备忘单

  • 免费试用:红帽学习订阅

  • 电子书:Bash 编程简介

  • Bash Shell 脚本备忘单

  • 电子书:企业 Java 现代化

使用 Python 库,下载维基百科关于开源的页面。您可以假设“开源”是出现次数最多的二元组,而“开源代码”是出现次数最多的三元组。看看你能不能证实这一点。

词性识别

NLTK 具有识别词的词性 (POS) 的能力。识别词性是必要的,因为一个词在不同的上下文中具有不同的含义。 “代码”这个词作为名词可以表示“用于保密目的的单词系统”或“程序指令”,作为动词,它可以表示“将消息转换为秘密形式”或“为计算机编写指令”。这种上下文认知对于正确的文本理解是必要的。

以下是使用此文本的示例:

text = "Computers don't speak English. So, we've to learn C, C++, Java, Python and the like! Yay!"

像之前一样预处理文本:

导入 nltk

从 nltk.tokenize 导入单词_tokenize

单词\u003d单词_tokenize(文本)

识别 POS 标签:

pos_tagged_text \u003d nltk.pos_tag(字)

打印(pos_tagged_text)

[('Computers', 'NNS'), ('do', 'VBP'), ("n't", 'RB'), ('speak', 'VB'), ('English', 'NNP'), ('.', '.'), ('So', 'RB'), (',', ','), ('we', 'PRP'), ("'ve", 'VBP'), ('to', 'TO'), ('learn', 'VB'), ('C', 'NNP'), (',', ','), ('C++', 'NNP'), (',', ','), ('Java', 'NNP'), (',', ','), ('Python', 'NNP'), ('and', 'CC'), ('the', 'DT'), ('like', 'JJ'), ('!', '.'), ('Yay', 'NN'), ('!', '.')]

NNS、VBP等是宾夕法尼亚大学定义的定义的POS码,也可以通过编程方式查看:

nltk.help.upenn_tagset()

NNS:名词,普通,复数

本科生 苏格兰 小古玩 产品 保镖 刻面 海岸

资产剥离 仓库 设计 俱乐部 香水 平均值

主观主义者的忧虑使工厂工作...

VBP:动词,现在时,不是第三人称单数

主要 包裹 度假村 起诉 扭曲 溢出 治疗 加长 刷 终止

出现趋向流浪闪闪发光获得包含厌恶挑逗吸引

强调模具推迟服务器返回摇...

...

可以看到句子中每个词的词性定义:

对于 pos\tagged\text 中的 pos\tag\word:

打印(pos_tag_word[0], ":")

nltk.help.upenn_tagset(pos_tag_word[1])

电脑 :

NNS:名词,普通,复数

...

做 :

VBP:动词,现在时,不是第三人称单数

...

不是:

RB:副词

...

说话 :

VB:动词,基本形式

...

英语 :

NNP:名词、专有名词、单数

...

. :

.: 句子终止符

自己试试

使用 Python 库,下载维基百科关于开源的页面,并识别文本中所有单词的词性。

词干和词形还原

单词通常是变形(例如,字母后缀,附加等)来表达它们的形式(例如,复数,时态等)。Dog -> Dogs是变形的一个例子。通常,必须以它们的原生形式比较单词以进行有效的文本匹配。

词干提取和词形还原是将单词转换为非屈折形式的两种方法。词干提取和词形还原的本质是相同的:将一个词简化为其最原始的形式。但他们的做法不同。

  • Stemming 使用一种简单的机制来移除或修改变形以形成词根,但词根可能不是该语言中的有效词。

  • Lemmatization 也移除或修改变形以形成词根,但词根是该语言中的有效词。

词形还原使用单词数据集(称为语料库,将在下一节中讨论)来获得词根;因此,它比词干慢。在某些情况下,词干就足够了,而在其他情况下,则需要词形还原。

NLTK 有多个词干分析器和词形还原器(例如,RegexpStemmer、LancasterStemmer、PorterStemmer、WordNetLemmatizer、RSLPStemmer 等)。您还可以选择许多内置的词干分析器和词形还原器(请参阅nltk.stem包)。

为了比较它们,试试 PorterStemmer 和 WordNetLemmatizer。

创建一个 PorterStemmer 的实例:

导入 nltk

投票 \u003d nltk.stem.PorterStemmer()

干掉“建筑”这个词:

单词\u003d“建筑”

print("词干", word, stemmer.stem(word))

Stem of building : build

词干没有词性识别,因此名词或动词形式的“建筑”一词被称为“建筑”。

使用 WordNetLemmatizer 进行词形还原不是这种情况:

lemmatizer \u003d nltk.stem.WordNetLemmatizer()

单词\u003d“建筑”

位置 \u003d 'n';

print("Lemmatize of", word, "(" , pos, "):", lemmatizer.lemmatize(word, pos))

位置 \u003d 'v';

print("Lemmatize of", word, "(" , pos, "):", lemmatizer.lemmatize(word, pos))

建筑物的词形化( n ):建筑物

建筑物的词形化( v ):构建

与词干提取相比,词形还原需要更多时间(在此示例中时间稍长,但很明显)。

自己试试

使用 Python 库,下载维基百科关于开源的页面,并对文本进行预处理并将其转换为其原生形式。尝试使用各种词干提取和词形还原模块。使用 Python 的 timer 模块来测量它们的性能。

车身

NLTK 中的语料库是文本数据集。 NLTK 提供了几个语料库。语料库通过开箱即用的数据帮助文本处理。例如,美国总统就职演说的语料库可以帮助分析和准备演讲。

NLTK 中提供了几个语料库阅读器。根据您正在处理的文本,您可以选择最合适的文本。所需语料库必须与 Data 一起安装(参见上面的设置部分)。

有几种类型的语料库表明语料库提供的数据的结构和类型。可以在nltk_dataUI 中找到可用的语料库列表(参见设置)。

NLTK UI 已安装

图片来源:

(Opensource.com,CC BY-SA 4.0)

通过阅读器访问语料库。用于语料库的阅读器取决于语料库的类型。例如,古腾堡语料库以纯文本格式保存文本,并通过PlaintextCorpusReader访问。布朗语料库对文本进行了分类和标记,并通过CategorizedTaggedCorpusReader访问。读者遵循树形结构。这里有一些语料库和他们的读者。

各种语料库及其相关阅读器

图片来源:

(Opensource.com,CC BY-SA 4.0)

以下是访问语料库的方法。

首先,创建一个实用函数来根据语料库阅读器类型显示语料库信息:

def 正文_info(正文):

打印(语料库)

打印()

print("README:", corpus.readme())

打印()

文件 \u003d corpus.fileids()

打印(len(文件),“文件:”)

打印(文件)

打印()

文件\u003d文件[0]

文本 \u003d corpus.raw(文件)

print("文件", file, len(corpus.paras(file)), "paras", len(corpus.sents(file)), "sentences", len(corpus.words(file)), "words", “:”)

打印(文本。编码(“utf-8”))

打印()

如果是实例(语料库,nltk.corpus.TaggedCorpusReader):

标记_words \u003d corpus.tagged_words()

打印(len(标记_words),“标签:”)

打印(标记_words)

打印()

如果是实例(语料库,nltk.corpus.CategorizedTaggedCorpusReader):

类别 \u003d corpus.categories()

打印(len(类别),“类别:”)

打印(类别)

打印()

类别\u003d类别[-1]

文件 \u003d corpus.fileids(类别)

print(len(files), "分类中的文件", category, ":")

打印(文件)

打印()

文件\u003d文件[0]

print("File:", file, len(corpus.paras(file)), "paras", len(corpus.sents(file)), "sentences", len(corpus.words(file)), "words" )

打印()

print("原始文本:")

文本 \u003d corpus.raw(文件)

打印(文本)

打印()

print("标记文本:")

标记_words \u003d corpus.tagged_words(文件)

打印(标记_words)

打印()

以下是两个语料库示例:

  • ABC 是来自澳大利亚广播委员会的新闻集。这是一个基本的纯文本语料库:

corpus_info(nltk.corpus.abc)

<'.../corpora/abc' 中的PlaintextCorpusReader(尚未加载)>

自述文件:b'Australian Broadcasting Commission 2006\nhttp://www.abc.net.au/\n\n内容:\n* 农村新闻 http://www.abc.net.au/rural/news/\n * 科学新闻 http://www.abc.net.au/science/news/\n\n'

2个文件:

['rural.txt', 'science.txt']

文件:rural.txt 2425 段 13015 句 345580 字:

'PM否认知道AWB回扣\n总理否认...

  • 布朗语料库有大约一百万个由布朗大学整理的当代美国英语单词:

corpus_info(nltk.corpus.brown)

<CategorizedTaggedCorpusReader in '.../corpora/brown'(尚未加载)>

自述文件:棕色语料库

当今美国编辑的标准语料库

...

500 个文件:

['ca01', 'ca02', 'ca03', ...]

文件 ca01 67 段 98 句 2242 字:

b"\n\n\tThe/at Fulton/np-tl County/nn-tl Grand/jj-tl Jury/nn-tl ...

1161192 标签:

[('The', 'AT'), ('Fulton', 'NP-TL'), ...]

15类:

[“冒险”、“美女_lettres”、“社论”、“小说”、“政府”、“爱好”、“幽默”、“博学”、“传说”、“神秘”、“新闻”、“宗教” ','评论','浪漫','科学_小说']

science_fiction 类别中的 6 个文件:

['cm01', 'cm02', 'cm03', 'cm04', 'cm05', 'cm06']

文件:cm01 57 段 174 句 2486 字

原始文本:

现在/rb 那/cs 他/pps ...

标记文字:

[('Now', 'RB'), ('that', 'CS'), ('he', 'PPS'), ...]

想象一下,您可以使用这样的语料库做什么!例如,使用 Brown 语料库,您可以训练模型对文本进行分类和标记,以便聊天机器人更好地理解人类意图。您也可以创建自己的语料库。

后续步骤

在我的下一篇文章中,我将向您展示如何使用 NLP 和 NLTK 比较解析的数据、实现实体识别等,从而扩展您对 NLP 构建块的了解。

现在,尝试使用布朗语料库训练机器学习模型来对文本进行分类和标记词。将此应用于PG Woodhouse 书籍的一部分,并查看它标识的类别。

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐