NLTK自然语言处理简介
目录
安装
文本分类
结论
自然语言工具包(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自然语言处理简介相关推荐
- Py之nltk:nltk包的简介、安装、使用方法、代码实现之详细攻略
Py之nltk:nltk包的简介.安装.使用方法.代码实现之详细攻略 目录 nltk包的简介 nltk包的安装 nltk包的使用方法 nltk包的代码实现 nltk包的简介 NLTK is a lea ...
- 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 正则表达式 ...
- python和nltk自然语言处理 pdf_NLTK基础教程:用NLTK和Python库构建机器学习应用 完整版pdf...
本书主要介绍如何通过NLTK库与一些Python库的结合从而实现复杂的NLP任务和机器学习应用.全书共分为10章.第1章对NLP进行了简单介绍.第2章.第3章和第4章主要介绍一些通用的预处理技术.专属 ...
- Python和NLTK自然语言处理
作者:[印度] 尼天·哈登尼亚(Nitin Hardeniya)雅各布·帕金斯 出版社:人民邮电出版社 出版时间:2019年04月 Python和NLTK自然语言处理
- 1_自然语言处理简介、数据源、应用领域、课程体系
1.自然语言处理简介 1.1.自然语言处理 1.2.数据源 1.3.应用领域 1.4.课程体系 1.自然语言处理简介 1.1.自然语言处理 为什么需要自然语言处理 人工成本较高,海量数据挖掘困难,人 ...
- python和nltk自然语言处理书评_python自然语言处理_自然语言处理入门
说明:本文是<Python数据分析与数据化运营>中的"3.12.4 自然语言文本预处理".下面是正文内容-与数据库 本文从概念和实际操作量方面,从零开始,介绍在Pyth ...
- U1.自然语言处理简介_刘知远老师NLP训练营笔记
文章目录 一.自然语言处理简介 (一)什么是自然语言? (二)什么是自然语言处理? 二.自然语言处理的挑战 (一)指数级增长搜索空间 (二)多样性 (三)递归性 (四)歧义性 三.自然语言处理的重要性 ...
- Python NLTK 自然语言处理入门与例程
Python NLTK 自然语言处理入门与例程 在这篇文章中,我们将基于 Python 讨论自然语言处理(NLP).本教程将会使用 Python NLTK 库.NLTK 是一个当下流行的,用于自然语言 ...
- NLTK自然语言处理入门
Python NLTK 自然语言处理入门与例程 在这篇文章中,我们将基于 Python 讨论自然语言处理(NLP).本教程将会使用 Python NLTK 库.NLTK 是一个当下流行的,用于自然语言 ...
最新文章
- MySQL-数据类型
- 21、Power Query-列文本格式处理
- SAP CRM里的settype和relationship有什么区别
- python中zip的使用_浅谈Python中的zip()与*zip()函数详解
- python正则匹配找到所有的浮点数_如何利用Python抓取静态网站及其内部资源
- css 属性名 查询表
- sscanf函数详解
- 哇撒!这几个SpringBoot前后端分离项目(附源码),star过千,快去收藏夹吃灰吧。。。
- opencv多通道图像转单通道
- 如何写Java单元测试
- fuzor2020安装教程附安装包
- Java单例模式简单代码
- AMBA_AXI总线详解
- BZOJ 3991 set维护dfs序
- 云计算数据中心的特点
- Linux- Showdown 命令详解
- 我的推荐系统入门经验~
- 复阻抗法 求解 传递函数
- Linux内核的下载和解压
- 打车软件盛行,如何判断是否拒载
热门文章
- 神经网络的输出层有哪些_深度学习的数学-神经网络、输入层、隐藏层、输出层...
- 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
- ajax context this,如何使ajax里的this指向不改变
- 本田da屏怎么进wince系统_本田新XR-V首试:配置提升,依然好开
- 新年元旦海报设计模板|具有浓厚中国风味的画面
- 电商海报模板|psd分层海报素材轻松教你凸显你的主体产品!
- 在线教学视频的设计与实现
- redis 管理工具_「程序猿同事的分享」redis cluster管理工具redis-trib.rb详解
- python 注销一大段_Django框架用户注销功能实现方法分析
- Kotlin 基础语法(四)