博舍

Python人工智能(自学)应用一自然语言处理(3) 人工智能文本处理

Python人工智能(自学)应用一自然语言处理(3)

构建人工智能系统目录

构建人工智能系统

一.总览

 二.步骤

(1)提取数据集的文本特征和对应的标签

 (2)将数据集划分为训练集和测试集

 (3)选择一个合适的监督学习算法

(4)在训练集上执行算法,生成一个分类器模型

(5)通过测试集来评估模型的准确率

一.总览

目标:区分文本的情感正负

方法:监督学习

监督学习是机器学习中的一种训练方式。它是指通过让机器去学习我们“标记好”的数据集,训练出一个模型,然后根据该模型对“未标记”的数据进行分类或预测。

 在监督学习中,用于训练模型的数据都既有特征(feature)又有对应标签(label)。我们将这样的数据集称为训练集(trainset)。

通常,特征需要使用代码提取,标签则是人工直接标注在数据集上的。

在获取了训练集的文本特征和对应标签后,我们就可以根据自己的需求,选择一个合适的监督学习算法。通过该算法,让计算机学习文本特征和标签之间的联系,训练生成一个分类器(也称为分类模型)。再通过这个分类器模型,计算机就可以预测未标记的评价,并为它打上正确的标签。

分类器形成后,在正式使用它对未标记数据进行预测前,我们还需要通过一组“已标记”的数据来检验它的最终效果。这类已标记并用于做模型最终评估的数据集被称为测试集(testset)。

因此,原始的已标记数据集在提取特征和标签后,通常会被随机分为两个部分:1.80%用于训练模型的训练集(trainset)2.20%用于检验模型效果的测试集(testset)训练集相当于上课学知识;测试集则相当于期末考试,用来最终评估学习效果。

通过测试集的评估,我们会得到一些最终的评估指标,例如:模型的准确率等。

在对没有标签的数据进行预测的过程中,我们也需要先提取数据的文本特征。然后将这些特征输入到分类器中,生成对应的标签。

步骤:

通过监督学习搭建模型的流程大概可以分为6步:1.提取数据集的文本特征和对应的标签2.将数据集划分为训练集和测试集3.选择一个合适的监督学习算法4.在训练集上执行算法,生成一个分类器模型5.通过测试集来评估模型的准确率6.对“没有标签”的评价进行预测

 二.步骤(1)提取数据集的文本特征和对应的标签

注意点:

1.当我们训练分类器模型时,必须提取数据集中每一条评价的文本特征。因此,在构造词袋模型时,不需要传入参数max_features=15。

 2.为了训练分类器模型,我们需要将文本特征从稀疏矩阵转换为一个二维的NumPy数组。这是因为每条评价都对应多个特征,通过二维数组的行和列,可以清晰定位出某一个词语在某条评价里出现的次数。同时,不论之后选择哪一种机器学习的算法,都可以直接传入NumPy数组进行训练,非常方便。我们只需对X使用toarray()函数,就可以将其转换为二维数组了。

数组概念详见Python数据分析基础-Numpy和Pandas基础-1.Numpy和数组_编程爱好者^O^的博客-CSDN博客N维数组(ndarray)是一个多维数组,描述了相同类型数据的集合。https://blog.csdn.net/2201_75514764/article/details/130997809我们来尝试一下提取评价的文本特征~STEP1.构造词袋模型,提取数据集中所有文本特征STEP2.使用toarray()函数,将X转换为一个NumPy数组,方便后续调用在最后,输出X进行查看。

#导入csv模块importcsv#导入jieba模块importjieba#从sklearn.feature_extraction.text中导入CountVectorizerfromsklearn.feature_extraction.textimportCountVectorizer#使用open()函数打开数据集file=open("/Users/yequ/TVComments.csv","r")#使用csv.reader()函数读取数据集reader=csv.reader(file)#创建一个空列表datadata=[]#使用for循环遍历readerforinfoinreader:#将info逐一添加到data列表中data.append(info)#创建一个空列表word存储结果word=[]#遍历data的每一行数据forrowindata:#获取所有的评论内容text=row[0]#分词处理ret=jieba.lcut(text)#将分词结果以空格合并为字符串ret='.join(ret)#添加分词结果到列表word.append(ret)#创建CountVectorizer对象,并存储在vect中vect=CountVectorizer()#将word中的数据传递给vectX=vect.fit_transform(word)#使用toarray()函数,将x转换为数组X=X.toarray()#输出X进行查看print(X)

下面我们要做的是提取数据集中的标签

接下来,我们需要提取这199条评价里每一个文本特征所对应的标签,是“正面”还是“负面”。

标签存储在data中每个小列表的第二个元素里。

读取评价的步骤如下:

1.创建一个空列表y用于存储标签数据2.使用for循环来遍历data中的每一行数据3.只从中提取标签部分,即每行的第二个数据,allInfo[1]4.将每行的标签数据逐一添加到列表y中

#创建一个空列表y,用于存储标签y=[]#使用for循环遍历data,将遍历的数据存储到allInfo变量中forallInfoindata:#提取allInfo中的标签数据label=allInfo[1]#将标签逐一添加到列表y中y.append(label)#输出列表y进行查看print(y) (2)将数据集划分为训练集和测试集

我们可以人为划分数据集,但这样的结果并不够随机和客观。因此,可以借助sklearn.model_selection这个模块,它包含了划分数据的相关功能。该模块中有一个train_test_split类,其中的train_test_split()函数,可按照用户设定的比例,将数据集随机划分为训练集和测试集。(默认为3:1划分)

下面代码将测试集与训练集划分为4:1

(1)如果train_size传入的是浮点数,值应在0.0和1.0之间,表示训练集占数据集的比例;如果train_size传入的是整数,表示训练集里数据的个数。

(2)random_state为可选参数,指随机数种子,随机数的产生取决于随机数种子,可以理解为随机数种子是随机数的编号。也就是说,如果想要每次划分数据的结果保持一致,可以让随机数种子固定。

#从sklearn.model_selection中导入train_test_splitfromsklearn.model_selectionimporttrain_test_split#划分数据集,将数据分为训练集和测试集result=train_test_split(X,y,train_size=0.8,random_state=1)#输出resultprint(result)

result是一个列表,里面的元素依次是:训练集的文本特征测试集的文本特征训练集的标签测试集的标签这些数据会在后续训练和测试模型时用到

#依次提取result中训练集和测试集数据train_feature=result[0]test_feature=result[1]train_label=result[2]#TODO提取测试集的标签test_labeltest_label=result[3]

 (3)选择一个合适的监督学习算法

我们选择了一种应用最广泛的人工神经网络:多层感知器(MultilayerPerceptron)。

人工神经网络,也称为神经网络,是机器学习的一个子集,也是最常见的监督学习算法之一。它模拟了人脑的神经系统对复杂信息的处理机制,允许计算机程序解决人工智能、机器学习和深度学习领域的常见问题。

人工神经网络的名称和结构受到人类大脑的启发,模仿了节点(也称神经元)相互发送信号的方式。它至少由3个节点层组成:一个输入层、一个或多个隐藏层和一个输出层。

输入层:接收数据,如特征、字母、概念;隐藏层:处在输入层和输出层之间,会对输入层的数据进行计算,并将信息传递到输出层;输出层:输出分类或预测的处理结果。

优点:它们能够学习训练集中特征与标签之间的关系,完成高速分类的预测任务。像谷歌现在就是由神经网络算法进行机器翻译和搜索任务。这就是为什么会选择人工神经网络里应用最广泛的多层感知器作为我们的监督学习算法。

多层感知器(MultilayerPerceptron,简称MLP)是最基础、最简单的一种人工神经网络。它通常应用于监督学习问题,是自然语言处理、计算机视觉和其他神经网络的基础。 

我们举个简单的例子来看看MLP是如何处理数据的:当原始数据传入到第一个隐藏层时,这些节点会返回对应的预测结果,而第二层的感知器会根据第一层返回的结果来进行二次处理。通过这样的方式,第二层的感知器就能处理更复杂和更抽象的数据。以此类推,多层感知器这样的层级结构,增强了信息的表示和处理能力,可以更加快速解决复杂问题。

(4)在训练集上执行算法,生成一个分类器模型

sklearn.neural_network是sklearn中的神经网络模块,我们可以使用其中的MLPClassifier类。它为我们提供了多层感知器算法,能直接搭建和训练一个分类器模型。

具体步骤如下:

1.导入模块

首先,我们需使用from...import...,从sklearn.neural_network模块中导入MLPClassifier类。

2.创建分类器模型

导入模块后,直接使用MLPClassifier(),创建一个MLPClassifier对象,也就是我们的分类器模型。我们将返回的对象存储在变量mlp中。

3.训练分类器模型

接下来,就可以对mlp对象使用fit()函数,来完成模型的训练。只需将训练集的数据,也就是文本特征train_feature和标签train_label,依次传入该函数中即可。我们的分类器会学习传入的文本特征和标签之间的关系。

#从sklearn.neural_network中导入MLPClassifierfromsklearn.neural_networkimportMLPClassifier#创建MLPClassifier对象,并存储在mlp变量中mlp=MLPClassifier()#通过train_feature和train_label,训练分类器mlp.fit(train_feature,train_label)(5)通过测试集来评估模型的准确率

如何使用测试集评估模型的准确率呢?

我们可以先把测试集的文本特征传入到训练好的模型中,该模型会预测出对应的标签数据。然后将预测结果和测试集原本的标签进行对比,就可以评估该模型的准确率啦。

1.对测试集的文本特征进行预测

MLPClassifier类中提供了predict()函数,它会通过刚刚创建的多层感知器对测试集的数据进行预测。只需对创建的分类器对象使用predict()函数,再将测试集的文本特征作为参数传入该函数中即可。该函数会返回预测的标签数据。

2.计算准确率

有了预测结果后,我们就可以通过对比【依靠模型生成的测试集标签数据test_pred】和【测试集原本的标签数据test_label】,来检验模型的准确率。

sklearn.metrics模块中的accuracy_score类,为我们提供了一个可以计算准确率的函数:accuracy_score()。

#对测试集数据进行预测test_pred=mlp.predict(test_feature)#从sklearn.metrics中导入accuracy_scorefromsklearn.metricsimportaccuracy_score#计算预测准确率,并将结果赋值给scorescore=accuracy_score(test_pred,test_label)#输出score进行查看print(score)

 

最终我们训练出的模型准确率大概在80%左右,不算是一个完美的模型,还有一些改进的空间。比如:可以尝试添加更多的训练数据;

在创建分类器,也就是使用MLPClassifier()时,传入不同的参数并进行调整等。

6.对“没有标签”的评价进行预测 

我们只需定义一条评价,然后剩余的步骤和之前一样。最后我们将预测结果输出,根据输出就可以检验搭建的模型效果如何

例:

#自定义一条评价,并存储在变量comment中comment="太差了,新电视买回家不到十多天,底座支架因质量问题断裂,电视直接从桌子上摔坏!"#使用jieba.lcut()对comment进行分词comment=jieba.lcut(comment)#使用join()函数处理分词结果comment=['.join(comment)]#构造词袋模型try_feature=vect.transform(comment)#使用toarray()函数把结果转换为NumPy数组try_feature=try_feature.toarray()#使用predict()函数预测结果try_pred=mlp.predict(try_feature)#输出预测结果print(try_pred)

小科普(会涉及到一点数学概念)

细心的同学可能已经发现,我们在处理数据集时使用的是fit_transform()函数,但在处理没有标签的预测数据时使用的是transform()函数,为什么呢?fit_transform()其实是fit()和transform()的组合,多用于在训练数据时使用。在调用fit_transform()时,会先通过fit(),计算和学习数据中每个特征的均值和方差;再通过transform(),使用各自的均值和方差来变换所有特征。

小科普

那么对于没有标签的数据,如果使用fit()函数,则会重新计算一份新的特征均值和方差,这样的话我们的模型就会又学习一遍没有标签数据的特征。因此,我们只需要使用transform(),这样就可以使用相同的均值和方差来对没有标签的数据进行转换,同时又避免了我们的模型学习预测数据的特征。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇