@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府
本文实例讲述了Python自然语言处理 NLTK 库用法。分享给大家供大家参考,具体如下:

在这篇文章中,我们将基于 Python 讨论自然语言处理(NLP)。本教程将会使用 Python NLTK 库。NLTK 是一个当下流行的,用于自然语言处理的 Python 库。

那么 NLP 到底是什么?学习 NLP 能带来什么好处?

简单的说,自然语言处理( NLP )就是开发能够理解人类语言的应用程序和服务。

我们生活中经常会接触的自然语言处理的应用,包括语音识别,语音翻译,理解句意,理解特定词语的同义词,以及写出语法正确,句意通畅的句子和段落。

NLP的作用

正如大家所知,每天博客,社交网站和网页会产生数亿字节的海量数据。

有很多公司热衷收集所有这些数据,以便更好地了解他们的用户和用户对产品的热情,并对他们的产品或者服务进行合适的调整。

这些海量数据可以揭示很多现象,打个比方说,巴西人对产品 A 感到满意,而美国人却对产品 B 更感兴趣。通过NLP,这类的信息可以即时获得(即实时结果)。例如,搜索引擎正是一种 NLP,可以在正确的时间给合适的人提供适当的结果。

但是搜索引擎并不是自然语言处理(NLP)的唯一应用。还有更好更加精彩的应用。

NLP的应用

以下都是自然语言处理(NLP)的一些成功应用:

搜索引擎,比如谷歌,雅虎等等。谷歌等搜索引擎会通过NLP了解到你是一个科技发烧友,所以它会返回科技相关的结果。
社交网站信息流,比如 Facebook 的信息流。新闻馈送算法通过自然语言处理了解到你的兴趣,并向你展示相关的广告以及消息,而不是一些无关的信息。
语音助手,诸如苹果 Siri。
垃圾邮件程序,比如 Google 的垃圾邮件过滤程序 ,这不仅仅是通常会用到的普通的垃圾邮件过滤,现在,垃圾邮件过滤器会对电子邮件的内容进行分析,看看该邮件是否是垃圾邮件。
NLP库

现在有许多开源的自然语言处理(NLP)库。比如:

Natural language toolkit (NLTK)
Apache OpenNLP
Stanford NLP suite
Gate NLP library
自然语言工具包(NLTK)是最受欢迎的自然语言处理(NLP)库。它是用 Python 语言编写的,背后有强大的社区支持。

NLTK 也很容易入门,实际上,它将是你用到的最简单的自然语言处理(NLP)库。

在这个 NLP 教程中,我们将使用 Python NLTK 库。在开始安装 NLTK 之前,我假设你知道一些 Python入门知识。

安装 NLTK

如果你使用的是 Windows , Linux 或 Mac,你可以 使用PIP 安装NLTK: # pip install nltk。

在本文撰写之时,你可以在 Python 2.7 , 3.4 和 3.5 上都可以使用NLTK。或者可以通过获取tar 进行源码安装。

要检查 NLTK 是否正确地安装完成,可以打开你的Python终端并输入以下内容:Import nltk。如果一切顺利,这意味着你已经成功安装了 NLTK 库。

一旦你安装了 NLTK,你可以运行下面的代码来安装 NLTK 包:

import nltk
nltk.download()

这将打开 NLTK 下载器来选择需要安装的软件包。

你可以选择安装所有的软件包,因为它们的容量不大,所以没有什么问题。现在,我们开始学习吧!

使用原生 Python 来对文本进行分词

首先,我们将抓取一些网页内容。然后来分析网页文本,看看爬下来的网页的主题是关于什么。我们将使用 urllib模块来抓取网页:

import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
print (html)

从打印输出中可以看到,结果中包含许多需要清理的HTML标记。我们可以用这个 BeautifulSoup 库来对抓取的文本进行处理:

from bs4 import BeautifulSoup
import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
print (text)

现在,我们能将抓取的网页转换为干净的文本。这很棒,不是么?

最后,让我们通过以下方法将文本分词:

from bs4 import BeautifulSoup
import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = [t for t in text.split()]
print (tokens)

词频统计

现在的文本相比之前的 html 文本好多了。我们再使用 Python NLTK 来计算每个词的出现频率。NLTK 中的FreqDist( ) 函数可以实现词频统计的功能 :

from bs4 import BeautifulSoup
import urllib.request
import nltk
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = [t for t in text.split()]
freq = nltk.FreqDist(tokens)
for key,val in freq.items():print (str(key) + ':' + str(val))

如果你查看输出结果,会发现最常用的词语是PHP。

你可以用绘图函数为这些词频绘制一个图形: freq.plot(20, cumulative=False)。

从图中,你可以肯定这篇文章正在谈论 PHP。这很棒!有一些词,如"the," “of,” “a,” “an,” 等等。这些词是停止词。一般来说,停止词语应该被删除,以防止它们影响我们的结果。

使用 NLTK 删除停止词

NLTK 具有大多数语言的停止词表。要获得英文停止词,你可以使用以下代码:

from nltk.corpus import stopwords
stopwords.words('english')

现在,让我们修改我们的代码,并在绘制图形之前清理标记。首先,我们复制一个列表。然后,我们通过对列表中的标记进行遍历并删除其中的停止词:

clean_tokens = tokens[:]
sr = stopwords.words('english')
for token in tokens:if token in stopwords.words('english'):clean_tokens.remove(token)

最终的代码应该是这样的:

from bs4 import BeautifulSoup
import urllib.request
import nltk
from nltk.corpus import stopwords
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
text = soup.get_text(strip=True)
tokens = [t for t in text.split()]
clean_tokens = tokens[:]
sr = stopwords.words('english')
for token in tokens:if token in stopwords.words('english'):clean_tokens.remove(token)
freq = nltk.FreqDist(clean_tokens)
for key,val in freq.items():print (str(key) + ':' + str(val))

如果你现在检查图表,会感觉比之前那张图标更加清晰,因为没有了停止词的干扰。

freq.plot(20,cumulative=False)

使用 NLTK 对文本分词

我们刚刚了解了如何使用 split( ) 函数将文本分割为标记 。现在,我们将看到如何使用 NLTK 对文本进行标记化。对文本进行标记化是很重要的,因为文本无法在没有进行标记化的情况下被处理。标记化意味着将较大的部分分隔成更小的单元。

你可以将段落分割为句子,并根据你的需要将句子分割为单词。NLTK 具有内置的句子标记器和词语标记器。

假设我们有如下的示例文本:

Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude.
为了将这个文本标记化为句子,我们可以使用句子标记器:

from nltk.tokenize import sent_tokenize
mytext = "Hello Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(sent_tokenize(mytext))

输出如下:

[‘Hello Adam, how are you?’, ‘I hope everything is going well.’, ‘Today is a good day, see you dude.’]

你可能会说,这是一件容易的事情。我不需要使用 NLTK 标记器,并且我可以使用正则表达式来分割句子,因为每个句子前后都有标点符号或者空格。

那么,看看下面的文字:

Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude.

呃!Mr. 是一个词,虽然带有一个符号。让我们来试试使用 NLTK 进行分词:f

rom nltk.tokenize import sent_tokenize
mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(sent_tokenize(mytext))

输出如下所示:

[‘Hello Mr. Adam, how are you?’, ‘I hope everything is going well.’, ‘Today is a good day, see you dude.’]

Great!结果棒极了。然后我们尝试使用词语标记器来看看它是如何工作的:

from nltk.tokenize import word_tokenize
mytext = "Hello Mr. Adam, how are you? I hope everything is going well. Today is a good day, see you dude."
print(word_tokenize(mytext))

输出如下:

[‘Hello’, ‘Mr.’, ‘Adam’, ‘,’, ‘how’, ‘are’, ‘you’, ‘?’, ‘I’, ‘hope’, ‘everything’, ‘is’, ‘going’, ‘well’, ‘.’, ‘Today’, ‘is’, ‘a’, ‘good’, ‘day’, ‘,’, ‘see’, ‘you’, ‘dude’, ‘.’]

正如所料,Mr. 是一个词,也确实被 NLTK 当做一个词。NLTK使用 nltk.tokenize.punkt module 中的 PunktSentenceTokenizer 进行文本分词。这个标记器经过了良好的训练,可以对多种语言进行分词 。

标记非英语语言文本

为了标记其他语言,可以像这样指定语言:

from nltk.tokenize import sent_tokenize
mytext = "Bonjour M. Adam, comment allez-vous? J'espère que tout va bien. Aujourd'hui est un bon jour."
print(sent_tokenize(mytext,"french"))

结果将是这样的:

[‘Bonjour M. Adam, comment allez-vous?’, “J’espère que tout va bien.”, “Aujourd’hui est un bon jour.”]

NLTk 对其他非英语语言的支持也非常好!

从 WordNet 获取同义词

如果你还记得我们使用 nltk.download( ) 安装 NLTK 的扩展包时。其中一个扩展包名为 WordNet。WordNet 是为自然语言处理构建的数据库。它包括部分词语的一个同义词组和一个简短的定义。

通过 NLTK 你可以得到给定词的定义和例句:

from nltk.corpus import wordnet
syn = wordnet.synsets("pain")
print(syn[0].definition())
print(syn[0].examples())

结果是:

a symptom of some physical hurt or disorder
[‘the patient developed severe pain and distension’]

WordNet 包含了很多词的定义

from nltk.corpus import wordnet
syn = wordnet.synsets("NLP")
print(syn[0].definition())
syn = wordnet.synsets("Python")
print(syn[0].definition())

结果是:

the branch of information science that deals with natural language information
large Old World boas

您可以使用 WordNet 来获得同义词:

from nltk.corpus import wordnet
synonyms = []
for syn in wordnet.synsets('Computer'):for lemma in syn.lemmas():synonyms.append(lemma.name())
print(synonyms)

输出是:

[‘computer’, ‘computing_machine’, ‘computing_device’, ‘data_processor’, ‘electronic_computer’, ‘information_processing_system’, ‘calculator’, ‘reckoner’, ‘figurer’, ‘estimator’, ‘computer’]

Cool!

从 WordNet 获取反义词

你可以用同样的方法得到单词的反义词。你唯一要做的是在将 lemmas 的结果加入数组之前,检查结果是否确实是一个正确的反义词。

from nltk.corpus import wordnet
antonyms = []
for syn in wordnet.synsets("small"):for l in syn.lemmas():if l.antonyms():antonyms.append(l.antonyms()[0].name())
print(antonyms)

输出是:

[‘large’, ‘big’, ‘big’]

这就是 NLTK 在自然语言处理中的力量。

NLTK词干提取

单词词干提取就是从单词中去除词缀并返回词根。(比方说 working 的词干是 work。)搜索引擎在索引页面的时候使用这种技术,所以很多人通过同一个单词的不同形式进行搜索,返回的都是相同的,有关这个词干的页面。

词干提取的算法有很多,但最常用的算法是 Porter 提取算法。NLTK 有一个 PorterStemmer 类,使用的就是 Porter 提取算法。

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem('working'))

结果是:

work

结果很清楚。

还有其他一些提取算法,如 Lancaster 提取算法。这个算法的输出同 Porter 算法的结果在几个单词上不同。你可以尝试他们两个算法来查看有哪些不同结果。

提取非英语单词词干

SnowballStemmer 类,除了英语外,还可以适用于其他 13 种语言。支持的语言如下:

from nltk.stem import SnowballStemmer
print(SnowballStemmer.languages)
'danish', 'dutch', 'english', 'finnish', 'french', 'german', 'hungarian', 'italian', 'norwegian', 'porter', 'portuguese', 'romanian', 'russian', 'spanish', 'swedish'

你可以使用 SnowballStemmer 类的 stem()函数来提取非英语单词,如下所示:

from nltk.stem import SnowballStemmer
french_stemmer = SnowballStemmer('french')
print(french_stemmer.stem("French word"))

来自法国的朋友欢迎在评论区 poll 出你们测试的结果!

使用 WordNet 引入词汇

词汇的词汇化与提取词干类似,但不同之处在于词汇化的结果是一个真正的词汇。与词干提取不同,当你试图提取一些词干时,有可能会导致这样的情况:

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
print(stemmer.stem('increases'))

结果是:

increas

现在,如果我们试图用NLTK WordNet来还原同一个词,结果会是正确的:

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('increases'))

结果是:

increase

结果可能是同义词或具有相同含义的不同词语。有时,如果你试图还原一个词,比如 playing,还原的结果还是 playing。这是因为默认还原的结果是名词,如果你想得到动词,可以通过以下的方式指定。

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('playing', pos="v"))

结果是:

play

实际上,这是一个非常好的文本压缩水平。最终压缩到原文本的 50% 到 60% 左右。结果可能是动词,名词,形容词或副词:

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print(lemmatizer.lemmatize('playing', pos="v"))
print(lemmatizer.lemmatize('playing', pos="n"))
print(lemmatizer.lemmatize('playing', pos="a"))
print(lemmatizer.lemmatize('playing', pos="r"))

结果是:

play
playing
playing
playing

词干化和词化差异

好吧,让我们分别尝试一些单词的词干提取和词形还原:

from nltk.stem import WordNetLemmatizer
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()
print(stemmer.stem('stones'))
print(stemmer.stem('speaking'))
print(stemmer.stem('bedroom'))
print(stemmer.stem('jokes'))
print(stemmer.stem('lisa'))
print(stemmer.stem('purple'))
print('----------------------')
print(lemmatizer.lemmatize('stones'))
print(lemmatizer.lemmatize('speaking'))
print(lemmatizer.lemmatize('bedroom'))
print(lemmatizer.lemmatize('jokes'))
print(lemmatizer.lemmatize('lisa'))
print(lemmatizer.lemmatize('purple'))

结果是:

stone
speak
bedroom
joke
lisa
purpl

stone
speaking
bedroom
joke
lisa
purple

词干提取的方法可以在不知道语境的情况下对词汇使用,这就是为什么它相较词形还原方法速度更快但准确率更低。

在我看来,词形还原比提取词干的方法更好。词形还原,如果实在无法返回这个词的变形,也会返回另一个真正的单词;这个单词可能是一个同义词,但不管怎样这是一个真正的单词。当有时候,你不关心准确度,需要的只是速度。在这种情况下,词干提取的方法更好。
非常感谢你的阅读
大学的时候选择了自学python,工作了发现吃了计算机基础不好的亏,学历不行这是
没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习python核心知识,深入的研习计算机基础知识,整理好了,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!
其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?[点击加入]想做你自己想成为高尚人,加油!

Python自然语言处理 NLTK 库用法入门教程【经典】相关推荐

  1. python自然语言处理案例-Python自然语言处理 NLTK 库用法入门教程【经典】

    本文实例讲述了Python自然语言处理 NLTK 库用法.分享给大家供大家参考,具体如下: 在这篇文章中,我们将基于 Python 讨论自然语言处理(NLP).本教程将会使用 Python NLTK ...

  2. Python自然语言处理 NLTK 库用法入门教程

                                                               NLP (Natural Language Processing):自然语言处理 ...

  3. Python 强大的信号库 blinker 入门教程

    作者:金色旭光 来源:https://www.cnblogs.com/goldsunshine/p/15426970.html 1 信号 信号是一种通知或者说通信的方式,信号分为发送方和接收方.发送方 ...

  4. python使用教程pandas-Python 数据处理库 pandas 入门教程基本操作

    pandas是一个Python语言的软件包,在我们使用Python语言进行机器学习编程的时候,这是一个非常常用的基础编程库.本文是对它的一个入门教程. pandas提供了快速,灵活和富有表现力的数据结 ...

  5. python做数据处理软件_程序员用于机器学习编程的Python 数据处理库 pandas 入门教程...

    入门介绍 pandas适合于许多不同类型的数据,包括: · 具有异构类型列的表格数据,例如SQL表格或Excel数据 · 有序和无序(不一定是固定频率)时间序列数据. · 具有行列标签的任意矩阵数据( ...

  6. python notebook软件_Jupyter notebook快速入门教程(推荐)

    本文主要介绍了Jupyter notebook快速入门教程,分享给大家,具体如下: 本篇将给大家介绍一款超级好用的工具:Jupyter notebook. 为什么要介绍这款工具呢? 如果你想使用Pyt ...

  7. 用python写一个彩票过滤器_python入门教程NO.6 用python做个简单的彩票号码统计分析工具...

    python入门教程 python入门教程NO.6 用python做个简单的彩票号码统计分析工具 本文涉及的python基础语法是:字典.集合及for循环 字典的定义 字典也是一种可变的容器,它可以存 ...

  8. python输入城市找省份_Python入门教程(1)

    人生苦短,我用Python! Python(英语发音:/ˈpaɪθən/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于2020年12月09日底发明,第一个公开发行 ...

  9. python处理word_Python操作Word的入门教程

    Python操作Word的入门教程 前言 今天来介绍下,如何用 Python 来操作 Word. 再来介绍操作 Word 之前,先来说一个最近看书学到的法则,即 3W 法则. 3W:3W分别指 Wha ...

最新文章

  1. 深入DataGrid分页样式实例
  2. c 全局变量多线程调用_c语言局部变量 静态局部变量 全局变量与静态全局变量...
  3. ML之RFXGBoost:基于RF/XGBoost(均+5f-CrVa)算法对Titanic(泰坦尼克号)数据集进行二分类预测(乘客是否生还)
  4. (三)线程同步工具集_2---控制并发访问资源的多个副本
  5. 验证码类,生成验证码
  6. 小波滤波器与其他滤波器的区别_滤波器国产 VS 国外
  7. ajax请求 apend,jsp如何获取ajax append的数据?
  8. Spring —— context:property-placeholder/元素
  9. ssm框架图片上传与显示_SSM在线考试系统
  10. TomCat7安装与配置
  11. vue导出Excel
  12. Mysql索引优化和锁机制
  13. 关于结构体、类、联合体、位域等所占内存大小计算
  14. python尔雅答案_2020尔雅通识课Python》程序设计查题公众
  15. 无线局域网WLAN的入门概念
  16. 工作十年,我是如何达到年薪40W以上
  17. zzulioj1008: 美元和人民币
  18. 解决win11不能拖拽图片进ppt/ps的问题
  19. 【Ubuntu】[待机时间]:修改Ubuntu待机时间
  20. ele表格合并行之后的selection选中

热门文章

  1. 2022年成都市施工员(市政工程)考试练习题及答案
  2. try - catch 语句真的会影响性能吗?
  3. PHP打一动物,十万火急打一生肖 猜一动物 代表什么生肖
  4. 趋势预测图使用方法全解析
  5. splinterlands链游开发 链游开发app 链游开发公司
  6. Ubuntu16.04交叉编译openssl、openssh
  7. 使用ICEM绘制非结构网格时,如何提高网格质量?【转载】
  8. bwa 0.7.17-r1188
  9. 类型“JsonConvert”同时存在于“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6a
  10. Driver not loaded Driver not loaded