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

本文实例讲述了Python自然语言处理 NLTK
库用法。分享给大家供大家参考,具体如下:

正文

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

本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库。NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库。

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

什么是NLP?

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

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

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

这里讨论一些自然语言处理(NLP)的实际应用例子,如语音识别、语音翻译、理解完整的句子、理解匹配词的同义词,以及生成语法正确完整句子和段落。

NLP的作用

这并不是NLP能做的所有事情。

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

NLP实现

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

搜索引擎:
比如谷歌,Yahoo等。谷歌搜索引擎知道你是一个技术人员,所以它显示与技术相关的结果;

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

社交网站推送:比如Facebook News Feed。如果News
Feed算法知道你的兴趣是自然语言处理,就会显示相关的广告和帖子。

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

语音引擎:比如Apple的Siri。

NLP的应用

垃圾邮件过滤:如谷歌垃圾邮件过滤器。和普通垃圾邮件过滤不同,它通过了解邮件内容里面的的深层意义,来判断是不是垃圾邮件。

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

NLP库

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

下面是一些开源的自然语言处理库(NLP):

NLP库

  1. Natural language toolkit (NLTK);
  2. Apache OpenNLP;
  3. Stanford NLP suite;
  4. Gate NLP library

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

其中自然语言工具包(NLTK)是最受欢迎的自然语言处理库(NLP),它是用Python编写的,而且背后有非常强大的社区支持。

  • Natural language toolkit (NLTK)
  • Apache OpenNLP
  • Stanford NLP suite
  • Gate NLP library

NLTK也很容易上手,实际上,它是最简单的自然语言处理(NLP)库。

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

在这个NLP教程中,我们将使用Python NLTK库。

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

安装 NLTK

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

如果您使用的是Windows/Linux/Mac,您可以使用pip安装NLTK:

安装 NLTK

pip install nltk

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

打开python终端导入NLTK检查NLTK是否正确安装:

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

import nltk

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

如果一切顺利,这意味着您已经成功地安装了NLTK库。首次安装了NLTK,需要通过运行以下代码来安装NLTK扩展包:

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

import nltk
nltk.download()
import nltk
nltk.download()

这将弹出NLTK 下载窗口来选择需要安装哪些包:

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

永利网址 1

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

您可以安装所有的包,因为它们的大小都很小,所以没有什么问题。

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

使用Python Tokenize文本

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

首先,我们将抓取一个web页面内容,然后分析文本了解页面的内容。

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

我们将使用urllib模块来抓取web页面:

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

import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
print (html)
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)

从打印结果中可以看到,结果包含许多需要清理的HTML标签。

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

然后BeautifulSoup模块来清洗这样的文字:

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

from bs4 import BeautifulSoup
import urllib.request
response = urllib.request.urlopen('http://php.net/')
html = response.read()
soup = BeautifulSoup(html,"html5lib")
# 这需要安装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)

现在我们从抓取的网页中得到了一个干净的文本。

词频统计

下一步,将文本转换为tokens,像这样:

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

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 = text.split()
print (tokens)
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。

text已经处理完毕了,现在使用Python NLTK统计token的频率分布。

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

可以通过调用NLTK中的FreqDist()方法实现:

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

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 = text.split()
freq = nltk.FreqDist(tokens)
for key,val in freq.items():
  print (str(key) + ':' + str(val))

使用 NLTK 删除停止词

永利网址,如果搜索输出结果,可以发现最常见的token是PHP。

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

您可以调用plot函数做出频率分布图:

from nltk.corpus import stopwords
stopwords.words('english')
freq.plot(20, cumulative=False)
# 需要安装matplotlib库

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

永利网址 2

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

这上面这些单词。比如of,a,an等等,这些词都属于停用词。

你可以在这里查看Python List
函数
, 
了解如何处理列表。

一般来说,停用词应该删除,防止它们影响分析结果。

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

处理停用词

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))

NLTK自带了许多种语言的停用词列表,如果你获取英文停用词:

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

from nltk.corpus import stopwords
stopwords.words('english')
freq.plot(20,cumulative=False)

现在,修改下代码,在绘图之前清除一些无效的token:

使用 NLTK 对文本分词

clean_tokens = list()
sr = stopwords.words('english')
for token in tokens:
  if token not in sr:
    clean_tokens.append(token)

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

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

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

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 = text.split()
clean_tokens = list()
sr = stopwords.words('english')
for token in tokens:
  if not token in sr:
    clean_tokens.append(token)
freq = nltk.FreqDist(clean_tokens)
for key,val in freq.items():
  print (str(key) + ':' + str(val))

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

现在再做一次词频统计图,效果会比之前好些,因为剔除了停用词:

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

freq.plot(20,cumulative=False)

为了将这个文本标记化为句子,我们可以使用句子标记器:

永利网址 3

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))

使用NLTK Tokenize文本

输出如下:

在之前我们用split方法将文本分割成tokens,现在我们使用NLTK来Tokenize文本。

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

文本没有Tokenize之前是无法处理的,所以对文本进行Tokenize非常重要的。token化过程意味着将大的部件分割为小部件。

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

你可以将段落tokenize成句子,将句子tokenize成单个词,NLTK分别提供了句子tokenizer和单词tokenizer。

那么,看看下面的文字:

假如有这样这段文本:

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

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

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

使用句子tokenizer将文本tokenize成句子:

from 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))
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 Mr. Adam, how are you?’, ‘I hope everything is going well.’,
‘Today is a good day, see you dude.’]

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

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

这是你可能会想,这也太简单了,不需要使用NLTK的tokenizer都可以,直接使用正则表达式来拆分句子就行,因为每个句子都有标点和空格。

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.

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

这样如果使用标点符号拆分,Hello Mr将会被认为是一个句子,如果使用NLTK: