📜  Python | NLP餐厅评论分析

📅  最后修改于: 2021-04-17 03:01:17             🧑  作者: Mango

自然语言处理(NLP)是计算机科学和人工智能的一个领域,与计算机和人类(自然)语言之间的相互作用有关,尤其是如何对计算机进行编程以处理和分析大量自然语言数据。这是机器学习的一个分支,它涉及分析任何文本并处理预测分析。

Scikit-learn是针对Python编程语言的免费软件机器学习库。 Scikit-learn主要是用Python编写的,一些核心算法是用Cython编写的,以实现性能。 Cython是Python编程语言的超集,旨在通过主要用Python编写的代码来提供类似于C的性能。

让我们了解文本处理和NLP流程所涉及的各个步骤。

该算法可以轻松地应用于任何其他类型的文本,例如将书籍分类为“浪漫”,“摩擦”,但现在,让我们使用餐厅评论数据集来评论负面或正面反馈。

涉及的步骤:

第1步:导入数据集,将定界符设置为“ \ t”,因为列被分隔为制表符空间。评论及其类别(0或1)没有用其他任何符号分隔,但带有制表符空格,因为大多数其他符号是评论(例如,价格为$,…。!等),算法可能会将它们用作定界符,这会在输出中导致奇怪的行为(例如错误,奇怪的输出)。

# Importing Libraries
import numpy as np  
import pandas as pd 
  
# Import dataset
dataset = pd.read_csv('Restaurant_Reviews.tsv', delimiter = '\t') 

要下载使用的Restaurant_Reviews.tsv数据集,请单击此处。

步骤2:文本清理或预处理

  • 删除标点,数字:标点,数字在处理给定的文本方面无济于事,如果包括在内,它们只会增加我们将在最后一步中创建的词袋的大小,并降低算法的效率。
  • 词干:扎根词
  • 将每个单词都转换成小写:例如,在不同情况下使用相同的单词(例如,“ good”和“ GOOD”)是无用的。
# 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) 

示例:应用上述代码之前和之后(评论=>之前,语料库=>之后)

步骤3:标记化,涉及从文本主体中拆分句子和单词。

步骤4:通过稀疏矩阵制作单词袋

  • 在数据集中获取评论中所有不同的词,而无需重复词。
  • 每个单词一列,因此将有很多列。
  • 行是评论
  • 如果评论数据集中的行中有单词,则单词计数将在单词列下的单词袋行中存在。

示例:让我们仅获取两个评论的评论数据集

输入:“大坝好牛排”,“美食佳服务”输出:

为此,我们需要CountVectorizer class
我们还可以设置最大数量的功能(通过属性“ max_features”提供最大帮助的最大数量的功能)。对语料库进行训练,然后对语料库“ .fit_transform(corpus)”应用相同的转换,然后将其转换为数组。如果评论为肯定或否定,则答案在数据集[:,1]的第二列中:所有行和第一列(从零开始索引)。

# 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 

步骤5:将语料库分为训练和测试集。为此,我们需要sklearn.cross_validation中的class train_test_split。可以拆分为70/30或80/20或85/15或75/25,这里我通过“ test_size”选择75/25。
X是单词袋,y是0或1(正数或负数)。

# 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:拟合预测模型(此处为随机森林)

  • 由于Random fored是sklearn.ensemble的集成模型(由许多树组成),因此请导入RandomForestClassifier类
  • 使用501树或“ n_estimators”并将准则作为“熵”
  • 通过.fit()方法使用属性X_train和y_train拟合模型
# 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_test的.predict()方法对最终结果进行定价

# Predicting the Test set results
y_pred = model.predict(X_test)
  
y_pred

注意:随机森林的准确度为72%。(使用不同的测试大小进行的实验可能会有所不同,此处= 0.25)。

步骤8:要知道准确度,需要使用混淆矩阵。

混淆矩阵是2X2矩阵。

注意: True或False表示分配的类别是正确或不正确,而Positive或Negative表示分配给Positive或Negative类别

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
  
cm = confusion_matrix(y_test, y_pred)
  
cm