目录

安装

文本分类

结论


自然语言工具包(NLTK)提供了许多用于对文本内容执行自然语言处理(NLP)和机器学习分析的功能。我们将通过一个情感分析示例来演示其文本分类功能。

  • 下载源1.6 KB

这是我们学习Python系列及其在机器学习和AI中的使用的第六个模块。在上一篇中,我们讨论了使用OpenCV进行图像识别。现在让我们看一下自然语言工具包(NLTK)可以做什么。

安装

可以使用Anaconda安装NTLK:

conda install nltk

或使用pip,通过在Jupyter Notebook单元中运行此命令:

!pip install --upgrade nltk

如果以下Python代码正确运行,则安装成功:

import nltk

NLTK附带了许多您可以下载的数据(语料库、语法、模型等)。只需运行以下Python命令即可显示一个交互式下载窗口:

ntlk.download()

对于此模块,您需要安装“停用词”语料库。下载后,创建一个名为NLTK_DATA的环境变量,该变量包含下载目录的路径(如果您进行集中安装,则不需要此变量;有关安装数据的完整指南,请参考文档)。

文本分类

对文本进行分类意味着为其分配标签。可以通过多种方式对文本进行分类,例如,通过情感分析(积极/消极[/中性]),垃圾邮件分类(垃圾邮件/非垃圾邮件),文档主题等等。

在本模块中,我们将使用“大型电影评论数据集”浏览文本分类示例,该数据集提供25,000个电影评论(正片和负片)进行培训,并提供相同数量的测试片。

NLTK提供了朴素贝叶斯分类器来处理机器学习工作。我们的工作主要是编写一个从文本中提取“功能”的函数。分类器使用这些功能执行分类。

我们的函数称为功能提取器,它以字符串(文本)作为参数,并返回将功能名称映射到其值的字典,称为功能集

对于电影评论,我们的功能将是前N字(不包括停用词)。因此,特征提取器将返回以这N单词为键的特征集,并以布尔值指示其存在或不存在作为值。

第一步是浏览评论,存储所有单词(停用词除外),并找到最常用的单词。

首先,此辅助函数获取文本并输出其不间断字词:

import nltk
import nltk.sentiment.util
from nltk.corpus import stopwordsimport nltk.sentiment.util
stop = set(stopwords.words("english"))
def extract_words_from_text(text):tokens = nltk.word_tokenize(text)tokens_neg_marked = nltk.sentiment.util.mark_negation(tokens)return [t for t in tokens_neg_markedif t.replace("_NEG", "").isalnum() andt.replace("_NEG", "") not in stop]

word_tokenize 将文本拆分为标记列表(仍保留标点符号)。

mark_negation标记与_NEG取反之后的标记。因此,例如,“I did not enjoy this.”,在标记和标记否定之后变为:

["I", "did", "not", "enjoy_NEG", "this_NEG", "."]。

最后一行删除所有停用词(包括否定词)和标点符号。文本中仍然有许多无用的词,例如“I”或“This”,但是这种过滤足以满足我们的演示要求。

接下来,我们构造一个从审阅文件中读取的所有单词的列表。我们会保留一个单独的肯定和否定单词列表,以确保在我们选择最重要的单词时保持平衡。(我也对它进行了测试,但没有将单词列表分开,然后发现大多数肯定评论都归为否定。)同时,我们还可以创建所有肯定评论和所有否定评论的列表。

import ospositive_files = os.listdir("aclImdb/train/pos")
negative_files = os.listdir("aclImdb/train/neg")positive_words = []
negative_words = []positive_reviews = []
negative_reviews = []for pos_file in positive_files:with open("aclImdb/train/pos/" + pos_file, "r") as f:txt = f.read().replace("<br />", " ")positive_reviews.append(txt)positive_words.extend(extract_words_from_text(txt))
for neg_file in negative_files:with open("aclImdb/train/neg/" + neg_file, "r") as f:txt = f.read().replace("<br />", " ")negative_reviews.append(txt)negative_words.extend(extract_words_from_text(txt))

因为有很多文件,所以运行此代码可能要花一些时间。

然后,我们只保留肯定和否定单词列表中的前N单词(在此示例中为2000个单词),并将它们组合在一起。

N = 2000freq_pos = nltk.FreqDist(positive_words)
top_word_counts_pos = sorted(freq_pos.items(), key=lambda kv: kv[1], reverse=True)[:N]
top_words_pos = [twc[0] for twc in top_word_counts_pos]freq_neg = nltk.FreqDist(negative_words)
top_word_counts_neg = sorted(freq_neg.items(), key=lambda kv: kv[1], reverse=True)[:N]
top_words_neg = [twc[0] for twc in top_word_counts_neg]top_words = list(set(top_words_pos + top_words_neg))

现在我们可以编写一个特征提取器。如前所述,它应返回一个字典,其中每个高位单词均作为键,True或者False作为值,取决于单词是否在文本中出现。

def extract_features(text):text_words = extract_words_from_text(text)return { w: w in text_words for w in top_words }

然后,我们创建一个训练集,并将其输入到朴素贝叶斯分类器中。训练集应该是一个元组列表,其中每个元组的第一个元素是功能集,第二个元素是标签。

training = [(extract_features(review), "pos") for review in positive_reviews] + [(extract_features(review), "neg") for review in negative_reviews]

上面的行消耗大量RAM,并且速度很慢,因此您可能需要使用一部分评论,而只需要查看一部分评论列表。

训练分类器很简单:

classifier = nltk.NaiveBayesClassifier.train(training)

要立即对评论进行分类,请在新功能集上使用classify方法:

print(classifier.classify(extract_features("Your review goes here.")))

如果要查看每个标签的概率,请改用prob_classify:

def get_prob_dist(text):prob_dist = classifier.prob_classify(extract_features(text))return { "pos": prob_dist.prob("pos"), "neg": prob_dist.prob("neg") }print(get_prob_dist("Your review goes here."))

分类器具有基于测试集确定模型准确性的内置方法。该测试集的形状与训练集相同。电影评论数据集具有一个单独的目录,其中包含可用于此目的的评论。

test_positive = os.listdir("aclImdb/test/pos")[:2500]
test_negative = os.listdir("aclImdb/test/neg")[:2500]test = []for pos_file in test_positive:with open("aclImdb/test/pos/" + pos_file, "r") as f:txt = f.read().replace("<br />", " ")test.append((extract_features(txt), "pos"))
for neg_file in test_negative:with open("aclImdb/test/neg/" + neg_file, "r") as f:txt = f.read().replace("<br />", " ")test.append((extract_features(txt), "neg"))print(nltk.classify.accuracy(classifier, test))

使用N = 2000,在训练集中有5000条正面评论和5000条负面评论,使用此代码,我的准确率约为85%。

结论

在本模块中,我们研究了NLTK在文本分类中的工作原理,并使用情感分析进行了演示。您可以将其以相同的方式用于其他分类,包括具有两个以上标签的分类。

在接下来的模块,我们将看看Keras。

NLTK自然语言处理简介相关推荐

  1. Py之nltk:nltk包的简介、安装、使用方法、代码实现之详细攻略

    Py之nltk:nltk包的简介.安装.使用方法.代码实现之详细攻略 目录 nltk包的简介 nltk包的安装 nltk包的使用方法 nltk包的代码实现 nltk包的简介 NLTK is a lea ...

  2. python和nltk自然语言处理书评_Python和NLTK自然语言处理

    模块1 NLTK基础知识 第 1章 自然语言处理简介 3 1.1 为什么要学习NLP 4 1.2 从Python的基本知识开始 7 1.2.1 列表 7 1.2.2 自助 8 1.2.3 正则表达式 ...

  3. python和nltk自然语言处理 pdf_NLTK基础教程:用NLTK和Python库构建机器学习应用 完整版pdf...

    本书主要介绍如何通过NLTK库与一些Python库的结合从而实现复杂的NLP任务和机器学习应用.全书共分为10章.第1章对NLP进行了简单介绍.第2章.第3章和第4章主要介绍一些通用的预处理技术.专属 ...

  4. Python和NLTK自然语言处理

    作者:[印度] 尼天·哈登尼亚(Nitin Hardeniya)雅各布·帕金斯 出版社:人民邮电出版社 出版时间:2019年04月 Python和NLTK自然语言处理

  5. 1_自然语言处理简介、数据源、应用领域、课程体系

    1.自然语言处理简介 1.1.自然语言处理 1.2.数据源 1.3.应用领域 1.4.课程体系 1.自然语言处理简介 1.1.自然语言处理 为什么需要自然语言处理 人工成本较高,海量数据挖掘困难,人 ...

  6. python和nltk自然语言处理书评_python自然语言处理_自然语言处理入门

    说明:本文是<Python数据分析与数据化运营>中的"3.12.4 自然语言文本预处理".下面是正文内容-与数据库 本文从概念和实际操作量方面,从零开始,介绍在Pyth ...

  7. U1.自然语言处理简介_刘知远老师NLP训练营笔记

    文章目录 一.自然语言处理简介 (一)什么是自然语言? (二)什么是自然语言处理? 二.自然语言处理的挑战 (一)指数级增长搜索空间 (二)多样性 (三)递归性 (四)歧义性 三.自然语言处理的重要性 ...

  8. Python NLTK 自然语言处理入门与例程

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

  9. NLTK自然语言处理入门

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

最新文章

  1. MySQL-数据类型
  2. 21、Power Query-列文本格式处理
  3. SAP CRM里的settype和relationship有什么区别
  4. python中zip的使用_浅谈Python中的zip()与*zip()函数详解
  5. python正则匹配找到所有的浮点数_如何利用Python抓取静态网站及其内部资源
  6. css 属性名 查询表
  7. sscanf函数详解
  8. 哇撒!这几个SpringBoot前后端分离项目(附源码),star过千,快去收藏夹吃灰吧。。。
  9. opencv多通道图像转单通道
  10. 如何写Java单元测试
  11. fuzor2020安装教程附安装包
  12. Java单例模式简单代码
  13. AMBA_AXI总线详解
  14. BZOJ 3991 set维护dfs序
  15. 云计算数据中心的特点
  16. Linux- Showdown 命令详解
  17. 我的推荐系统入门经验~
  18. 复阻抗法 求解 传递函数
  19. Linux内核的下载和解压
  20. 打车软件盛行,如何判断是否拒载

热门文章

  1. 神经网络的输出层有哪些_深度学习的数学-神经网络、输入层、隐藏层、输出层...
  2. 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
  3. ajax context this,如何使ajax里的this指向不改变
  4. 本田da屏怎么进wince系统_本田新XR-V首试:配置提升,依然好开
  5. 新年元旦海报设计模板|具有浓厚中国风味的画面
  6. 电商海报模板|psd分层海报素材轻松教你凸显你的主体产品!
  7. 在线教学视频的设计与实现
  8. redis 管理工具_「程序猿同事的分享」redis cluster管理工具redis-trib.rb详解
  9. python 注销一大段_Django框架用户注销功能实现方法分析
  10. Kotlin 基础语法(四)