📜  Python | NLP餐厅评论的分析

📅  最后修改于: 2020-04-23 11:17:40             🧑  作者: Mango

自然语言处理(NLP)是计算机科学和人工智能的一个领域,与计算机和人类(自然)语言之间的交互有关,尤其是如何对计算机进行编程以处理和分析大量自然语言数据。这是机器学习的一个分支,它涉及分析任何文本并处理预测分析。
Scikit-learn是用于Python编程语言的免费软件机器学习库。Scikit-learn主要用Python编写,一些核心算法用Cython编写以实现性能。Cython是Python编程语言的超集,旨在通过主要用Python编写的代码来提供类似于C的性能。

让我们了解文本处理和NLP流程所涉及的各个步骤。
该算法可以轻松地应用于任何其他类型的文本,例如将书籍分类为“浪漫”,“恐怖”。但现在,让我们使用餐厅评论数据集来评论负面或正面反馈。

涉及的步骤:

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

# 导入库
import numpy as np
import pandas as pd
# 导入数据集
dataset = pd.read_csv('Restaurant_Reviews.tsv', delimiter = '\t')

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

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

  • 删除标点,数字:标点,数字对于处理给定的文本没有太大帮助,如果包括在内,它们只会增加我们将在最后一步中创建的词袋的大小,并降低算法的效率。
  • 词干:词根系列

  • 将每个单词都转换成小写:例如,在不同情况下使用相同的单词(例如“good”和“GOOD”)是没有用的。
    # 导入库
    import re
    # 自然语言工具包
    import nltk
    nltk.download('stopwords')
    # 删除停用词
    from nltk.corpus import stopwords
    # 给词干建议
    from nltk.stem.porter import PorterStemmer
    # 初始化空数组,追加纯文本
    corpus = []
    # 1000(评论)行要清洁
    for i in range(0, 1000):
        # 列:“review",第i行
        review = re.sub('[^a-zA-Z]', ' ', dataset['Review'][i])
        # 将所有情况转换为小写
        review = review.lower()
        # 拆分为数组(默认分隔符为“ ")
        review = review.split()
        # 创建PorterStemmer对象,获取每个单词的主词干
        ps = PorterStemmer()
        # 循环第i行的字符串数组中的每个单词
        review = [ps.stem(word) for word in review
                    if not word in set(stopwords.words('english'))]
        # 重新加入所有字符串数组元素以重新创建为字符串
        review = ' '.join(review)
        # 附加每个字符串以创建个纯文本数组
        corpus.append(review)

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

步骤3: 标记化,涉及从文本主体中拆分句子和单词。
步骤4:通过稀疏矩阵制作单词袋

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

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

输入:”dam good steak”, “good food good servic”

输出:

 

为此,我们需要CountVectorizer classsklearn.feature_extraction.text。

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

# 创建单词袋模型
from sklearn.feature_extraction.text import CountVectorizer
# 提取最大1500个功能.
# “ max_features"是实验的属性,以获得更好的结果
cv = CountVectorizer(max_features = 1500)
# X包含语料库(因变量)
X = cv.fit_transform(corpus).toarray()
# 如果评论是肯定或否定,则y包含答案
y = dataset.iloc[:, 1].values

要使用的数据集说明:

  • 列用\ t分隔
  • 第一栏是关于人们的评论
  • 在第二栏中,0表示负面评论,而1表示正面评论


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

# 将数据集分为训练集和测试集
from sklearn.cross_validation import train_test_split
# 实验“ test_size"获得更好的结果
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拟合模型
    # 使随机森林分类编号适合训练集
    from sklearn.ensemble import RandomForestClassifier
    # 可以将n_estimators表示为树的数量,尝试使用n_estimators以获得更好的结果
    model = RandomForestClassifier(n_estimators = 501,
                                criterion = 'entropy')
    model.fit(X_train, y_train)

步骤7:使用带有属性X_test的.predict()方法对最终结果进行定价

# 预测测试集结果
y_pred = model.predict(X_test)
y_pred


注意:随机森林的准确度为72%。(使用不同的测试大小进行的实验可能会有所不同,此处= 0.25)。
步骤8:要知道准确性,需要混淆矩阵。
混淆矩阵是2X2矩阵。
TRUE POSITIVE:正确识别的实际阳性的比例。
TRUE NEGATIVE:未正确识别的实际阳性的比例。
FALSE POSITIVE假阳性:正确识别的实际阴性的比例。
FALSE NEGATIVE假阴性:未正确识别的实际负片的比例。
注意: True或False表示分配的类别是正确或不正确,而Positive或Negative表示分配给Positive或Negative类别


# 制作混乱矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm