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

简介: Python自然语言处理 NLTK 库用法入门教程

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


那么 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)库。


安装 NLTK

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

pip install nltk

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

image.png

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

import nltk
nltk.download()

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

使用 NLTK 删除停止词

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

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

使用 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 进行分词:


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

输出如下所示:


['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 算法的结果在几个单词上不同。你可以尝试他们两个算法来查看有哪些不同结果。


使用 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


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


目录
相关文章
|
6天前
|
Python
在Python中绘制K线图,可以使用matplotlib和mplfinance库
使用Python的matplotlib和mplfinance库可绘制金融K线图。mplfinance提供便利的绘图功能,示例代码显示如何加载CSV数据(含开盘、最高、最低、收盘价及成交量),并用`mpf.plot()`绘制K线图,设置类型为'candle',显示移动平均线(mav)和成交量信息。可通过调整参数自定义图表样式,详情参考mplfinance文档。
17 2
|
6天前
|
机器学习/深度学习 边缘计算 TensorFlow
【Python机器学习专栏】Python机器学习工具与库的未来展望
【4月更文挑战第30天】本文探讨了Python在机器学习中的关键角色,重点介绍了Scikit-learn、TensorFlow和PyTorch等流行库。随着技术进步,未来Python机器学习工具将聚焦自动化、智能化、可解释性和可信赖性,并促进跨领域创新,结合云端与边缘计算,为各领域应用带来更高效、可靠的解决方案。
|
6天前
|
机器学习/深度学习 自然语言处理 PyTorch
【Python 机器学习专栏】自然语言处理中的深度学习应用
【4月更文挑战第30天】本文探讨了深度学习在自然语言处理(NLP)中的应用,包括文本分类、情感分析和机器翻译等任务。深度学习的优势在于自动特征学习、强大的表达能力和处理大规模数据的能力。常见模型如RNN、LSTM、GRU、CNN和注意力机制在NLP中发挥作用。Python的TensorFlow、PyTorch、NLTK和SpaCy等工具支持NLP研究。然而,数据稀缺、模型解释性和计算资源需求高等挑战仍待解决。随着技术进步,未来深度学习将进一步推动NLP发展,实现更智能的语言交互。
|
7天前
|
Serverless Python
使用Python的pandas和matplotlib库绘制移动平均线(MA)示例
使用Python的pandas和matplotlib库绘制移动平均线(MA)示例:加载CSV数据,计算5日、10日和20日MA,然后在K线图上绘制。通过`rolling()`计算平均值,`plot()`函数展示图表,`legend()`添加图例。可利用matplotlib参数自定义样式。查阅matplotlib文档以获取更多定制选项。
18 1
|
7天前
|
数据采集 SQL 数据挖掘
Python数据分析中的Pandas库应用指南
在数据科学和分析领域,Python语言已经成为了一种非常流行的工具。本文将介绍Python中的Pandas库,该库提供了强大的数据结构和数据分析工具,使得数据处理变得更加简单高效。通过详细的示例和应用指南,读者将了解到如何使用Pandas库进行数据加载、清洗、转换和分析,从而提升数据处理的效率和准确性。
|
12月前
|
Linux Python
不可出外网的主机如何快速、方便、优雅的安装Python库?
不可出外网的主机如何快速、方便、优雅的安装Python库?
455 0
不可出外网的主机如何快速、方便、优雅的安装Python库?
|
Linux 计算机视觉 Python
Windows下使用Pycharm安装python GUI库Kivy教程
Windows下使用Pycharm安装python GUI库Kivy教程
609 0
Windows下使用Pycharm安装python GUI库Kivy教程
|
Linux 测试技术 API
树莓派4B:1gRAM安装Python GUI库Kivy教程
树莓派4B:1gRAM安装Python GUI库Kivy教程
463 0
树莓派4B:1gRAM安装Python GUI库Kivy教程
|
文字识别 Python
安装python的文字识别库easyocr出现的问题及解决办法
安装python的文字识别库easyocr出现的问题及解决办法
1676 0