用python进行自然语言处理_Python自然语言处理示例:SVM和贝叶斯分类

关于自然语言处理(NLP)方面的文章、书籍非常之多,对于自然语言处理的上手,很多人是不知所措的。通过对本文的浏览,您应该能够对自然语言处理会有一个能够完整的有趣的基于Python的对自然语言处理的了解。

什么是文本分类

文本分类是将文本按照预定义的类别进行自动化归类的过程。例如,我们可以将电子邮件分为垃圾邮件或非垃圾邮件,新闻文章分为不同类别,例如政治、财经,体育等。借助自然语言处理和不同的分类算法(如朴素贝叶斯,SVM 甚至 Python 中的神经网络)来完成。

什么是自然语言处理

自然语言处理(NLP)是人工智能的一个分支,其主要内容是使计算机能够理解和解释人类语言。解释人类语言的问题在于并且理解对话内容,这跟将规则或二进制数据输入到计算机完全不是一回事。但是,随着机器学习的最新发展,借助神经网络的深度学习和易于使用的 Python 模型为我们打开了大门,使我们可以通过编程的方式使计算机理解复杂的人类语言。

文本分类

现在,通过监督的 ML 模型对文本进行分类来实现这一点:本文将使用具有 10,000 行文本数据的 Amazon Review 数据集,这些数据分为“标签 1”和“标签 2”。数据集有两列“文本”和“标签”。你可以从此处下载数据。

第一步:安装工具库

本文前面将使用以下 Python 库。如果你本地没有安装,可以通过各自的网站轻松下载。推荐使用 pip 工具安装。

import pandas as pdimport numpy as npfrom nltk.tokenize import word_tokenizefrom nltk import pos_tagfrom nltk.corpus import stopwordsfrom nltk.stem import WordNetLemmatizerfrom sklearn.preprocessing import LabelEncoderfrom collections import defaultdictfrom nltk.corpus import wordnet as wnfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn import model_selection, naive_bayes, svmfrom sklearn.metrics import accuracy_score

第二步:设置随机种子

如果脚本保持一致,则每次都可以使用此方法来重现相同的结果,否则每次运行都会产生不同的结果。种子可以设置为任意数量。

np.random.seed(500)

第三步:添加语料库

借助“ read_csv”功能,可以轻松将数据集添加为Pandas数据集。我将编码设置为“latin-1”,因为文本主要是英文和很多特殊字符。如果在中文环境下,视情况可以设置为“utf-8”、“utf-8-sig”或者“gbk”

Corpus = pd.read_csv(r"D:\NLP\corpus.csv",encoding='latin-1')

第四步:数据初加工

这一步这是任何数据挖掘过程中的重要步骤。主要是将原始数据转换为NLP模型可理解的格式。现实世界的实际数据通常不完整、不一致或缺少某些行为或趋势,并且可能包含许多错误。数据预处理是解决此类问题的一种行之有效的方法,这将有助于通过分类算法获得更好的结果。下面,我解释了除了数据预处理中其他易于理解的步骤之外还执行的两种技术:

  • 标记化:这是将文本流分解为单词、短语、符号或其他称为标记的有意义元素的过程。Token列表成为用于进一步处理的输入。NLTK库工具word_tokenize和send_tokenize可以轻松地将文本流分别分为单词或句子列表。
  • 词干提取/词形还原:这两个过程的目的是相同的,将每个词的变形形式减少为一个共同的基数或词根。词干提取/词形还原密切相关,不同之处在于,词干提取在不了解上下文的情况下对单个单词进行操作,因此无法根据词性区分具有不同含义的单词。但是,词干提取通常更易于实现且运行速度更快,而精度的损失对于某些情况下可能并不重要。

9f4a897bbde017f2b5634b96c4d89443.png词形还原表现更好

这是执行上述数据预处理步骤的完整脚本,您始终可以添加或删除最适合您要处理的数据集的步骤:

  • 删除数据中的空白行(如果有)
  • 将所有文本更改为小写
  • 词标记化
  • 删除停用词
  • 删除非字母文字
  • 词合法化
# Step - a : Remove blank rows if any.Corpus['text'].dropna(inplace=True)# Step - b : Change all the text to lower case. This is required as python interprets 'dog' and 'DOG' differentlyCorpus['text'] = [entry.lower() for entry in Corpus['text']]# Step - c : Tokenization : In this each entry in the corpus will be broken into set of wordsCorpus['text']= [word_tokenize(entry) for entry in Corpus['text']]# Step - d : Remove Stop words, Non-Numeric and perfom Word Stemming/Lemmenting.# WordNetLemmatizer requires Pos tags to understand if the word is noun or verb or adjective etc. By default it is set to Nountag_map = defaultdict(lambda : wn.NOUN)tag_map['J'] = wn.ADJtag_map['V'] = wn.VERBtag_map['R'] = wn.ADVfor index,entry in enumerate(Corpus['text']):    # Declaring Empty List to store the words that follow the rules for this step    Final_words = []    # Initializing WordNetLemmatizer()    word_Lemmatized = WordNetLemmatizer()    # pos_tag function below will provide the 'tag' i.e if the word is Noun(N) or Verb(V) or something else.    for word, tag in pos_tag(entry):        # Below condition is to check for Stop words and consider only alphabets        if word not in stopwords.words('english') and word.isalpha():            word_Final = word_Lemmatized.lemmatize(word,tag_map[tag[0]])            Final_words.append(word_Final)    # The final processed set of words for each iteration will be stored in 'text_final'    Corpus.loc[index,'text_final'] = str(Final_words)

第五步:准备训练和测试数据集

语料库将分为两个数据集:培训和测试。训练数据集将用于拟合模型,并对测试数据集进行预测,这可以通过sklearn库中的train_test_split完成。由于我们设置了参数test_size=0.3,因此训练数据将占主体的70%,测试数据将拥有剩余的30%。

Train_X, Test_X, Train_Y, Test_Y = model_selection.train_test_split(Corpus['text_final'],Corpus['label'],test_size=0.3)

第六步:转化代码

标签对目标变量进行编码-这样做是为了将数据集中的字符串类型的分类数据转换为模型可以理解的数值。

Raw LabelsEncoded Labels
__label__10
Encoder = LabelEncoder()Train_Y = Encoder.fit_transform(Train_Y)Test_Y = Encoder.fit_transform(Test_Y)

第七步:向量化

这是将文本文档集合转换为数字特征向量的一般过程,它们有很多将文本数据转换为模型可以理解的向量的方法,但到目前为止,最流行的方法称为TF-IDF。这是首字母缩写词,而不是“术语频率-反向文档”频率的缩写,它们是分配给每个单词的结果分数的组成部分。

  • 词频:总结给定单词在文档中出现的频率。
  • 反向文档频率:缩小文档中出现的单词的比例。TF-IDF是词频得分,无需突出数学内容,它们就会尝试突出显示更有趣的词,例如经常出现在文档中,但不是跨文档。可以使用以下语法首先将TG-IDF模型拟合到整个语料库。这将帮助TF-IDF建立从语料库数据中学到的单词词汇,并将为每个单词分配一个唯一的整数。由于我们设置了参数max_features = 5000,因此它们最多可包含5000个唯一字/功能。最后,我们将Train_X和Test_X转换为向量化Train_X_Tfidf和Test_X_Tfidf。现在,它们将为每一行包含一个唯一整数列表,以及由TF-IDF计算出的其相关重要性。
Tfidf_vect = TfidfVectorizer(max_features=5000)Tfidf_vect.fit(Corpus['text_final'])Train_X_Tfidf = Tfidf_vect.transform(Train_X)Test_X_Tfidf = Tfidf_vect.transform(Test_X)

您可以使用以下语法查看从语料库学到的词汇

print(Tfidf_vect.vocabulary_)

此时的输出应该如下:

 {‘even’: 1459, ‘sound’: 4067, ‘track’: 4494, ‘beautiful’: 346, ‘paint’: 3045, ‘mind’: 2740, ‘well’: 4864, ‘would’: 4952, ‘recomend’: 3493, ‘people’: 3115, ‘hate’: 1961, ‘video’: 4761 …………}

您可以直接打印矢量化数据以查看其外观

print(Train_X_Tfidf)

4097628d82c68d18ff87c138a9bf5ea9.png

1-"Train_X_Tfidf"的行号;
2-第一行中每个单词的唯一整数号;
3-由TF-IDF矢量化器计算的得分;

现在,我们的数据集已准备好输入不同的分类算法了。

第八步:使用机器学习算法预测结果

首先,让我们尝试一下朴素贝叶斯分类器算法。

# fit the training dataset on the NB classifierNaive = naive_bayes.MultinomialNB()Naive.fit(Train_X_Tfidf,Train_Y)# predict the labels on validation datasetpredictions_NB = Naive.predict(Test_X_Tfidf)# Use accuracy_score function to get the accuracyprint("Naive Bayes Accuracy Score -> ",accuracy_score(predictions_NB, Test_Y)*100)

输出如下:

Naive Bayes Accuracy Score -> 83.1%

然后我们再试一下SVM分类算法。

# Classifier - Algorithm - SVM# fit the training dataset on the classifierSVM = svm.SVC(C=1.0, kernel='linear', degree=3, gamma='auto')SVM.fit(Train_X_Tfidf,Train_Y)# predict the labels on validation datasetpredictions_SVM = SVM.predict(Test_X_Tfidf)# Use accuracy_score function to get the accuracyprint("SVM Accuracy Score -> ",accuracy_score(predictions_SVM, Test_Y)*100)

输出如下:

SVM Accuracy Score -> 84.6%

总结

相信这能很好地解释什么是文本分类以及如何在Python中轻松实现它。下一步,您可以尝试以下操作:

  • 进行数据预处理步骤,看看它如何影响准确性。
  • 尝试使用其他字向量化技术,例如Count Vectorizer和Word2Vec。
  • 在这些算法上,尝试使用GridSearchCV进行参数调整。
  • 尝试其他分类算法,例如线性分类器,Boosting模型甚至神经网络。

参考文献:

  1. https://medium.com/@bedigunjit/simple-guide-to-text-classification-nlp-using-svm-and-naive-bayes-with-python-421db3a72d34

  2. https://neptune.ai/blog/text-classification-tips-and-tricks-kaggle-competitions

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329746.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Build 2016,你可能忽视的几个细节

微软公司主办的Build 2016大会尚在进程中,但是两场重量级的主题演讲已经结束。下面列举了我个人非常关注的几个细节,介绍一些背景知识以饲读者。 Bash on Windows背后的历史和未来 微软和IBM二十多年前联合开发NT内核的时候就已经为接驳多种操作系统留下…

JAVA面试常考系列五

转载自 JAVA面试常考系列五 题目一 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么?吞吐量收集器使用并行版本的新生代垃圾收集器,它用于中等规模和大规模数据的应用程序。串行收集器对大多数的小应用(在现代处理器上需要大概100M左右的内存…

kafka消费者开发方式小结

【README】 1, 本文总结了 kafka消费者开发方式;2, 本文使用的是最新的kafka版本 3.0.0;【1】 kafka消费则 【1.1】消费者与消费者组 1)消费者: 应用程序需要创建消费者对象,订阅主题并开始接…

微软发布Azure Functions、Service Fabric和IoT Starter Kits新服务

微软此次 Build 2016 大会的重点主题一直都围绕开发和 Microsoft Azure 云服务,今天更是对外发布了 Azure Functions、Service Fabric 和 IoT Starter Kit 等一系列新服务。就目前与其它友商的竞争而言,微软近期不断的修炼内功,使 Microsoft …

python发送邮件 退回_python 发送邮件(收到的邮件要有发送方才能回复)

Python使用SMTP(简单邮件传输协议)发送邮件普通文本邮件普通文本邮件发送的实现,关键是要将MIMEText中_subtype设置为plain## -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMEText#导入MIMEText类from email import encodersfrom email.heade…

JAVA面试常考系列六

转载自 JAVA面试常考系列六 题目一一个Applet有哪些生命周期? 一个Applet的生命周期分为以下四个阶段: Init 每次加载时都会初始化一个小程序。此方法通知Applet,方法已经被装入系统,在第一次调用start方法之前总是先调用它。Init…

.NET的未来包含一个开源的Mono

在微软Build 2016大会的第二天,微软项目经理Scott Hunter和Scott Hanselman就.NET平台的现状和未来计划做了一场演讲。演讲的题目是“.NET概述”,他们的精彩演讲耗时一个小时,描绘了公司对于.NET的目标以及开发人员可以期待什么。就像开幕式主…

kafka消费者接收分区测试

【README】 本文演示了当有新消费者加入组后,其他消费者接收分区情况;本文还模拟了 broker 宕机的情况;本文使用的是最新的 kafka3.0.0 ;本文测试案例,来源于 消费者接收分区的5种模型,建议先看模型&#…

python数据分析架构_Python数据分析

引言:本文重点是用十分钟的时间帮读者建立Python数据分析的逻辑框架。其次,讲解“如何通过Python 函数或代码和统计学知识来实现数据分析”。本次介绍的建模框架图分为六大版块,依次为导入数据,数据探索,数据处理&…

JAVA面试常考系列七

转载自 JAVA面试常考系列七 题目一 Swing的方法中,有哪些是线程安全的? Swing的规则是:当Swing组件被具现化时,所有可能影响或依赖于组件状态的代码都应该在事件派发线程中执行。 因此有3个线程安全的方法: repaint()…

图片中的Build 2016

微软主办的Build 2016大会刚刚落幕,让我们通过下面的图片集锦来回顾大会的一些容易被人忽视的细节。 Xamarin加入微软大家庭 微软公司于二月底花大价钱买下了Xamarin这家移动开发平台提供商,终于补全了它Mobile First Cloud First战略的短板。 图片一&am…

diy实现spring依赖注入

【README】 本文diy代码实现了 spring 依赖注入,一定程度上揭示了依赖注入原理; 【1】控制反转-Inversion of Control 是一种编码思想,简而言之就是 应用程序A可以使用组件B,但A无法控制B的生命周期(如创建&#xff…

html 中一个格子拆分成两个_一个效果惊人的数字游戏

安爸曾多次讲过数学推理能力对孩子成长的重要性,听到有位家长说自己用扔骰子的方法教孩子数学等式。步骤大致是扔骰子时,如果骰子是3,就在棋盘上从0出发走3步,并且写出033的加法等式。扔到负数就后退,写出减法等式。科…

JAVA面试常考系列八

转载自 JAVA面试常考系列八 题目一 JDBC是什么? JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,由一组用Java语言编写的类和接口组成。JDBC提供…

【广州/深圳 活动】 MVP社区巡讲

紧跟当今的技术发展趋势还远远不够,我们要引领变革!加入本地技术专家社区,获取真实案例、实况培训演示以及探讨新一代解决方案。在此活动中,您将: 了解如何运用开源(OSS)技术、Microsoft 技术及…

java socket实现简单即时通讯

【1】socket服务器 /*** Description 即时消息服务器* author xiao tang* version 1.0.0* createTime 2022年01月23日*/ public class IMSocketServer {private static int PORT 13;public static void main(String[] args) {ServerSocket server null;try {// 开启端口serv…

蝌蚪网课助手mac_疫情期间如何录网课?(干货教程)手把手教你录出高质量网课。...

鉴于国外疫情的持续爆发,中小学开学日期进一步延期,我们的网课教学也同样面临持续后延。我们的很多教师朋友,可能此时他们正需要这么一个教程来熟悉网课的录制方法。于是这篇文章就应运而生了,希望它能给各位老师带来些许帮助。​…

JAVA面试常考系列九

转载自 JAVA面试常考系列九 题目一 RMI架构层的结构是如何组成的? RMI体系结构由三层组成,分别是: 存根和骨架层(Stub and Skeleton Layer) 远程引用层(Remote Reference Layer) 传输层&#xf…

WebAPI前置知识:HTTP与RestfulAPI

对HTTP协议的基本了解是能理解并使用RestFul风格API的基础,在了解了这些基础之后,使用各种RestFul的开发框架才能得心应手。我一开始使用WebApi的时候就因为对这些知识缺乏了解,觉得用起来各种不顺手,直到熟悉了这些HTTP的知识后&…

Java三种代理模式-静态代理,动态代理和cglib代理

【README】 本文阐述了3种代理模式的定义,并编写了代码测试案例; 代理其实是一种设计模式,可以在访问目标对象的方法上下文添加处理逻辑(扩展目标对象的功能),是 切面编程的基石; 【举个例子】…