关于自然语言处理(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可以轻松地将文本流分别分为单词或句子列表。
  • 词干提取/词形还原:这两个过程的目的是相同的,将每个词的变形形式减少为一个共同的基数或词根。词干提取/词形还原密切相关,不同之处在于,词干提取在不了解上下文的情况下对单个单词进行操作,因此无法根据词性区分具有不同含义的单词。但是,词干提取通常更易于实现且运行速度更快,而精度的损失对于某些情况下可能并不重要。

词形还原表现更好

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

  • 删除数据中的空白行(如果有)
  • 将所有文本更改为小写
  • 词标记化
  • 删除停用词
  • 删除非字母文字
  • 词合法化
# 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 Labels Encoded Labels
__label__1 0
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)

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

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

  1. r与python自然语言处理_Python自然语言处理实践: 在NLTK中使用斯坦福中文分词器 | 我爱自然语言处理...

    斯坦福大学自然语言处理组是世界知名的NLP研究小组,他们提供了一系列开源的Java文本分析工具,包括分词器(Word Segmenter),词性标注工具(Part-Of-Speech Tagger), ...

  2. python自然语言分析_Python自然语言用金庸的武侠小说做分析和处理

    最近在了解到,在机器学习中,自然语言处理是较大的一个分支.存在许多挑战.例如: 如何分词,识别实体关系,实体间关系,关系网络展示等. 我用Jieba + Word2vec + NetworkX 结合在 ...

  3. python自然语言处理_Python自然语言处理

    Python自然语言处理 作者:(印)雅兰·萨纳卡(Jalaj Thanaki) 著 出版日期:2018年08月 文件大小:30.79M 支持设备: ¥50.00在线试读 适用客户端: 言商书局 iP ...

  4. 对python的评价语_Python自然语言处理学习笔记之评价(evaluationd)

    对模型的评价是在test set上进行的,本文首先介绍测试集应该满足的特征,然后介绍四种评价方法. 一.测试集的选择 1.首先,测试集必须是严格独立于训练集的,否则评价结果一定很高,但是虚高,不适用于 ...

  5. python中加法表达式_Python自然语言处理练习一

    1.尝试使用Python解释器作为一个计算器,输入表达式,如12/(4+1) >>>12/(4+1) 2 2.26个字母可以组成26的10次方或者26**10个字母长的字符串,也就是 ...

  6. python中codecs模块_python自然语言编码转换模块codecs介绍

    python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理. 有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码 ...

  7. python分块处理功能_Python自然语言处理学习笔记之信息提取步骤分块(chunking)...

    一.信息提取模型 信息提取的步骤共分为五步,原始数据为未经处理的字符串, 第一步:分句,用nltk.sent_tokenize(text)实现,得到一个list of strings 第二步:分词,[ ...

  8. python词汇网络流行语_python 自然语言处理(五)____WordNet

    WordNet是面向语义的英语词典,与传统辞典类似,但结构更丰富.nltk中包括英语WordNet,共有155287个单词和117659个同义词. 1.寻找同义词 这里以motorcar为例,寻找它的 ...

  9. 如何开发python sdk调用数据_Python SDK调用示例

    开发者可以通过Python SDK,调用物联网数据分析中生成的API. 步骤一:安装SDK 登录Python官方网站下载2.6.5及以上版本的Python,并按说明完成安装. (可选)安装Python ...

最新文章

  1. php方法数组注释,php中的注释、变量、数组、常量、函数应用介绍
  2. URAL-1982 Electrification Plan 最小生成树
  3. 为什么长视频没有强算法推荐的产品
  4. main,tmain,winmain()等函数——UNICODE - sensensen - 博客园
  5. apache的源代码编译安装
  6. ASA上的NAT配置及互联网接入(动态NAT、动态PAT、静态NAT、静态PAT以及NAT豁免、使用思科TFTP服务器上传ASDM模块)
  7. 新手入门C语言易错点
  8. 计算机等级考试中0是升序,2017年03月计算机等级VisualFoxPro考试试题
  9. html转换vmax,CSS里px、em、rem、%、vw、vh、vmin、vmax这些单位的区别
  10. VC6.0 快捷键整理
  11. 蚂蚁金服面试经历(内含大量干货)
  12. 小白采坑 非法反射警告 An illegal reflective access operation has occurred错误
  13. SOA 的定义 ——谢炯
  14. 升级iOS CocoaPods 版本
  15. Nature:Deep Learning 深度学习综述
  16. 人工智能实践教程(一)
  17. 金融风控数据挖掘--Task1
  18. 怎么卸载linux里面的matlab
  19. 不凡的夫夫 斯特林公式的应用
  20. 泛微文档存放在服务器哪个地址,泛微服务器配置

热门文章

  1. P2596 [ZJOI2006]书架(fhq treap)
  2. ARC078F - Mole and Abandoned Mine(状压DP)
  3. CF924D. Contact ATC
  4. CF 1529E. Trees of Tranquillity
  5. 2020 CSP-S 游记
  6. 总结:8.9 模拟(枚举搜索)
  7. P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)
  8. 强连通分量:洛谷P3387 模板:缩点
  9. P3243-[HNOI2015]菜肴制作【拓扑排序,优先队列】
  10. 2018年10月17日普级B组【模拟赛】