练习用Python在NLP中解析文本
自然语言处理 (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()

图片来源:
(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 中找到可用的语料库列表(参见设置)。

图片来源:
(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 书籍的一部分,并查看它标识的类别。
更多推荐

所有评论(0)