自然语言处理(NLP) 是计算机科学和人工智能的一个领域,涉及计算机和人类(自然)语言之间的交互,尤其是如何编程计算机来处理和分析大量自然语言数据。它是机器学习的一个分支,是关于分析任何文本和处理预测分析的。 Scikit学习 是Python编程语言的自由软件机器学习库。Scikit learn主要是用Python编写的,有些核心算法是用Cython编写的,以实现性能。Cython是Python编程语言的超集,旨在通过主要使用Python编写的代码提供类似C的性能。 让我们了解文本处理的各个步骤以及NLP的流程。 这个算法可以很容易地应用于任何其他类型的文本,比如将一本书分为浪漫、摩擦,但现在,让我们使用 餐厅评论 用于查看负面或正面反馈的数据集。
涉及的步骤:
第一步: 导入将分隔符设置为“”的数据集,因为列被分隔为选项卡空间。评论及其类别(0或1)不由任何其他符号分隔,而是带有制表符空间,因为大多数其他符号都是评论(如价格为$,等等),算法可能会使用它们作为分隔符,这将导致输出中出现奇怪的行为(如错误、奇怪的输出)。
Python3
# Importing Libraries import numpy as np import pandas as pd # Import dataset dataset = pd.read_csv( 'Restaurant_Reviews.tsv' , delimiter = ' ' ) |
下载餐厅评论。使用tsv数据集,单击 在这里 . 第二步: 文本清理或预处理
- 删除标点符号、数字 :标点符号、数字对处理给定文本没有多大帮助,如果包含标点符号、数字,它们只会增加我们最后一步创建的一袋单词的大小,并降低算法的效率。
- 阻止 :扎根这个词
- 将每个单词转换成小写 :例如,在不同的情况下使用一些单词是没有用的(例如“good”和“good”)。
Python3
# library to clean data import re # Natural Language Tool Kit import nltk nltk.download( 'stopwords' ) # to remove stopword from nltk.corpus import stopwords # for Stemming propose from nltk.stem.porter import PorterStemmer # Initialize empty array # to append clean text corpus = [] # 1000 (reviews) rows to clean for i in range ( 0 , 1000 ): # column : "Review", row ith review = re.sub( '[^a-zA-Z]' , ' ' , dataset[ 'Review' ][i]) # convert all cases to lower cases review = review.lower() # split to array(default delimiter is " ") review = review.split() # creating PorterStemmer object to # take main stem of each word ps = PorterStemmer() # loop for stemming each word # in string array at ith row review = [ps.stem(word) for word in review if not word in set (stopwords.words( 'english' ))] # rejoin all string array elements # to create back into a string review = ' ' .join(review) # append each string to create # array of clean text corpus.append(review) |
例如: 应用上述代码前后(评论=>之前,语料库=>之后)
第三步: 符号化 ,包括从正文中拆分句子和单词。 第4步: 通过稀疏矩阵生成单词包
- 获取数据集中所有不同的评论词,不要重复。
- 每个单词对应一列,因此会有很多列。
- 行是评论
- 如果一个单词出现在评论数据集的一行中,那么该单词的计数将出现在该单词列下一袋单词的一行中。
例如: 让我们看一个只有两篇评论的评论数据集
Input : "dam good steak", "good food good service"Output :
为此,我们需要sklearn的CountVectorizer类。特征提取。文本 我们还可以设置功能的最大数量(通过属性“max_features”帮助最大的功能的最大数量)。对语料库进行训练,然后对语料库“.fit_transform(语料库)”应用相同的变换,然后将其转换为数组。如果审查是肯定的或否定的,则答案位于数据集[:,1]的第二列:所有行和第一列(从零开始索引)。
Python3
# Creating the Bag of Words model from sklearn.feature_extraction.text import CountVectorizer # To extract max 1500 feature. # "max_features" is attribute to # experiment with to get better results cv = CountVectorizer(max_features = 1500 ) # X contains corpus (dependent variable) X = cv.fit_transform(corpus).toarray() # y contains answers if review # is positive or negative y = dataset.iloc[:, 1 ].values |
要使用的数据集的说明:
- 以分隔的列(选项卡空间)
- 第一个专栏是关于人的评论
- 在第二列中,0代表负面评价,1代表正面评价
第5步: 将语料库拆分为训练集和测试集。为此,我们需要从sklearn中分离出课堂培训和测试。交叉验证。拆分可以是70/30或80/20或85/15或75/25,这里我通过“测试尺寸”选择75/25。 X是一堆单词,y是0或1(正或负)。
Python3
# Splitting the dataset into # the Training set and Test set from sklearn.cross_validation import train_test_split # experiment with "test_size" # to get better results X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25 ) |
第6步: 拟合预测模型(此处为随机森林)
- 因为随机森林是sklearn的集成模型(由许多树组成)。集成,导入随机分类器类
- 有501棵树或“n_估计量”,标准为“熵”
- 通过安装来安装模型。具有属性X_train和y_train的fit()方法
Python3
# Fitting Random Forest Classification # to the Training set from sklearn.ensemble import RandomForestClassifier # n_estimators can be said as number of # trees, experiment with n_estimators # to get better results model = RandomForestClassifier(n_estimators = 501 , criterion = 'entropy' ) model.fit(X_train, y_train) |
第7步: 通过应用预测最终结果。带有属性X_检验的predict()方法
Python3
# Predicting the Test set results y_pred = model.predict(X_test) y_pred |
注: 随机森林的准确率为72%。(当使用不同的测试尺寸进行实验时,可能会有所不同,此处=0.25)。 第8步: 要知道准确度,需要一个混淆矩阵。 混淆矩阵是一个2X2矩阵。
真正积极的: 测量正确识别的实际阳性的比例。 真阴性: 测量未正确识别的实际积极因素的比例。 假阳性: 测量正确识别的实际负片的比例。 假阴性: 测量未正确识别的实际负片的比例。
注: 正确或错误指的是指定的分类正确或不正确,而积极或消极指的是指定的积极或消极类别
Python3
# Making the Confusion Matrix from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) cm |