目录
一、数据清洗
1.导入必要的库
2.创建停用词表
3. 对句子进行中文分词
4. 给出文档路径
5.将结果输出保存并且打印处理过程
二、转换数据格式
1.将处理完毕的数据读取查看
2.创建data
3. 将评论数据按行写入data中的“评论”一列
4.读取评分数据
5.将评分数据以逗号形式分割
6.将评分数据作为label按行写入data中的“评分”一列
7.查看数据,并将数据保存为CSV格式
三、机器学习部分
1.导入必要的第三方库
2.读取数据
3.划分数据集
4.可选操作,引入停用词,当作参数传入特征提取器
5.TfidfVectorizer()和 CountVectorizer()分别进行特征提取
6.使用TF_IDF提取的向量当作特征传入逻辑回归模型
7.使用ConutVector转化的向量作为特征传入逻辑回归模型
四、使用其他的机器学习模型进行拟合数据进行测试
1.KNN模型
2.Random Forest Classifier(随机森林)模型
3.Decision Tree Classifier(决策树)模型
4.贝叶斯模型
5.SVM(支持向量机)模型
总结
数据链接:
1.HGD_StopWords.txt
2.ALL_Comment.txt
3.All_label.txt
链接:https://pan.baidu.com/s/1i7skC_BEvz43eT0rIniTHQ
提取码:95oi
拿到数据之后,首先要进行数据清洗,根据停用词表去除原始数据中的停用词以及各种符号,去除数据中的噪声。目的是为了降低数据之间的相似性,突出同一类数据中的共性,同时也突出不同类型数据的差异性,使得模型可以更好的学习数据之间的共性与差异。数据处理得好特征提取器才能更好的提取特征,训练的效果也就更好。
数据清洗包括:分词、去除停用词
特别说明:分词使用jieba库即可,并且分好的词之间使用空格连接;去除停用词则是根据停用词表中的内容进行筛除,停用词表中包含着要去除的“词语、数字、标点符号、其他符号”,可以根据拿到的数据集的特性对停用词表进行修改。
#将必要的库导入
import jieba
import pandas as pd
import csv
import time
路径根据自己存放位置进行设置
# 创建停用词列表
def stopwordslist():
stopwords = [line.strip() for line in open('/root/Data/HGD_StopWords.txt',encoding='UTF-8').readlines()]
return stopwords
# 对句子进行中文分词
def seg_depart(sentence):
# 对文档中的每一行进行中文分词
#print("正在分词")
sentence_depart = jieba.cut(sentence.strip())
# 引进停用词列表
stopwords = stopwordslist()
# 输出结果为outstr
outstr = ''
# 去停用词
for word in sentence_depart:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
return outstr
# 给出文档路径
filename = "/root/Data/ALL_Comment.txt"
outfilename = "/root/Data/stop_seg_word.txt"
inputs = open(filename, 'r', encoding='UTF-8')
outputs=open(outfilename, 'w', encoding='UTF-8')
# 将输出结果写入out中
count=0
for line in inputs:
line_seg = seg_depart(line)
#writer.writerows(line_seg + '\n')
outputs.writelines(line_seg + '\n')
#print("-------------------正在分词和去停用词-----------")
count=count+1
print("一共处理了",count,"条数据")
outputs.close()
inputs.close()
end_time=time.time()
print("删除停用词和分词成功!!!")
print("使用时间",end_time-start_time)
将txt格式的文件转换为csv格式,格式转换之后方便在后续实验中使用。
with open("/root/Data/stop_seg_word.txt") as f:
lines=f.readlines()
for line in lines:
print(line)
#创建方法对象
data = pd.DataFrame()
data.head
#将txt文件中的数据按行写入csv文件
with open('/root/Data/stop_seg_word.txt', encoding='utf-8') as f:
line = f.readlines()
line = [i.strip() for i in line]
print(len(line))
#建立评论这一列,将数据进行循环写入
data['评论'] = line
with open('/root/Data/All_label.txt', "r",encoding='utf-8') as f:
all_label=f.readlines()
print(all_label)
print(type(all_label))
print(len(all_label))
all_labels=[]
for element in all_label:
all_labels.extend(element.split(','))
#建立“评分”这一列,将数据进行循环写入
data['评分'] = all_labels
#查看数据
data
#将整理好的数据进行保存,路径根据自己设备指定即可
data.to_csv('/root/Data/reviews_score_update.csv')
#首先将用到的包进行导入
import pandas as pd
import numpy as np
import jieba
import re
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn import model_selection
from sklearn import preprocessing
#将数据进行读取
data=pd.read_csv('/root/Data/reviews_score_update.csv',index_col=0)
data.head()
将“评论”数据当作X,将"评分"数据当作Y。将数据集划分成训练数据与测试数据,训练数据用来训练机器学习的算法,测试数据用于检测通过训练数据训练出来的算法的效果。划分数据集时需要使用到sklearn中的model_selection模块中train_test_split()方法。需要传入的参数为“评论文本”、“文本的评分(把评分当作Y)”(这里是好评还是差评对应的数字)、test_size表示的是划分训练集与测试集时的比例,根据划分比例,将所有的数据等分为十份,测试数据占其中的一份。shuffle的作用是在划分数据集时,会将数据顺序打乱。
#现在是划分数据集
#random_state 取值,这是为了在不同环境中,保证随机数取值一致,以便验证模型的实际效果。
train_x,test_x,train_y,test_y=model_selection.train_test_split(data.评论.values.astype('U'),data.评分.values,test_size=0.1,random_state=1)
#划分完毕,查看数据形状
print(train_x.shape,test_x.shape)
#train_x 训练集数据 test_x 测试集数据 train_y训练集的标签 test_y 测试集的标签
因为数据已经进行过清洗,进行分词以及去除停用词等操作已经完成,在进行特征提取之前进行停用词的引入是因为在使用TfidfVectorizer()和 CountVectorizer()进行特征提取时,可以将停用词当作参数传递进去,如果进行过数据清洗,此步仅作简单介绍。
#定义函数,从哈工大中文停用词表里面,把停用词作为列表格式保存并返回 在这里加上停用词表是因为TfidfVectorizer和CountVectorizer的函数中
#可以根据提供用词里列表进行去停用词
def get_stopwords(stop_word_file):
with open(stop_word_file) as f:
stopwords=f.read()
stopwords_list=stopwords.split('\n')
custom_stopwords_list=[i for i in stopwords_list]
return custom_stopwords_list
#获得由停用词组成的列表
stop_words_file = '/root/Data/HGD_StopWords.txt'
stopwords = get_stopwords(stop_words_file)
'''
使用TfidfVectorizer()和 CountVectorizer()分别对数据进行特征的提取,投放到不同的模型中进行实验
'''
#开始使用TF-IDF进行特征的提取,对分词后的中文语句做向量化。
#引进TF-IDF的包
TF_Vec=TfidfVectorizer(max_df=0.8,
min_df = 3,
stop_words=frozenset(stopwords)
)
#拟合数据,将数据准转为标准形式,一般使用在训练集中
train_x_tfvec=TF_Vec.fit_transform(train_x)
#通过中心化和缩放实现标准化,一般使用在测试集中
test_x_tfvec=TF_Vec.transform(test_x)
#开始使用CountVectorizer()进行特征的提取。它依据词语出现频率转化向量。并且加入了去除停用词
CT_Vec=CountVectorizer(max_df=0.8,#在超过这一比例的文档中出现的关键词(过于平凡),去除掉。
min_df = 3,#在低于这一数量的文档中出现的关键词(过于独特),去除掉。
token_pattern=u'(?u)\\b[^\\d\\W]\\w+\\b',#使用正则表达式,去除想去除的内容
stop_words=frozenset(stopwords))#加入停用词)
#拟合数据,将数据转化为标准形式,一般使用在训练集中
train_x_ctvec=CT_Vec.fit_transform(train_x)
#通过中心化和缩放实现标准化,一般使用在测试集中
test_x_ctvec=CT_Vec.transform(test_x)
'''
使用TF_IDF提取的向量当作数据特征传入模型
'''
#构建模型之前首先将包进行导入
from sklearn import linear_model
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split, GridSearchCV
import time
start_time=time.time()
#创建模型
lr = linear_model.LogisticRegression(penalty='l2', C=1, solver='liblinear', max_iter=1000, multi_class='ovr')
#进行模型的优化,因为一些参数是不确定的,所以就让模型自己在训练中去确定自己的参数 模型的名字也由LR转变为model
model = GridSearchCV(lr, cv=3, iid=True, param_grid={
'C': np.logspace(0, 4, 30),
'penalty': ['l1', 'l2']
})
#模型拟合tf-idf拿到的数据
model.fit(train_x_tfvec,train_y)
#查看模型自己拟合的最优参数
print('最优参数:', model.best_params_)
#在训练时查看训练集的准确率
pre_train_y=model.predict(train_x_tfvec)
#在训练集上的正确率
train_accracy=accuracy_score(pre_train_y,train_y)
#训练结束查看预测 输入验证集查看预测
pre_test_y=model.predict(test_x_tfvec)
#查看在测试集上的准确率
test_accracy = accuracy_score(pre_test_y,test_y)
print('使用TF-IDF提取特征使用逻辑回归,让模型自适应参数,进行模型优化\n训练集:{0}\n测试集:{1}'.format(train_accracy,test_accracy))
end_time=time.time()
print("使用模型优化的程序运行时间为",end_time-start_time)
训练、测试结果如下:
'''
使用ConutVector转化的向量当作特征传入模型
'''
#构建模型之前首先将包进行导入
from sklearn import linear_model
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split, GridSearchCV
import time
start_time=time.time()
#创建模型
lr = linear_model.LogisticRegression(penalty='l2', C=1, solver='liblinear', max_iter=1000, multi_class='ovr')
#进行模型的优化,因为一些参数是不确定的,所以就让模型自己在训练中去确定自己的参数 模型的名字也由LR转变为model
model = GridSearchCV(lr, cv=3, iid=True, param_grid={
'C': np.logspace(0, 4, 30),
'penalty': ['l1', 'l2']
})
#模型拟合CountVectorizer拿到的数据
model.fit(train_x_ctvec,train_y)
#查看模型自己拟合的最优参数
print('最优参数:', model.best_params_)
#在训练时查看训练集的准却率
pre_train_y=model.predict(train_x_ctvec)
#在训练集上的正确率
train_accracy=accuracy_score(pre_train_y,train_y)
#训练结束查看预测 输入测试集查看预测
pre_test_y=model.predict(test_x_ctvec)
#查看在测试集上的准确率
test_accracy = accuracy_score(pre_test_y,test_y)
print('使用CountVectorizer提取特征使用逻辑回归,让模型自适应参数,进行模型优化\n训练集:{0}\n测试集:{1}'.format(train_accracy,test_accracy))
end_time=time.time()
print("使用模型优化的程序运行时间为",end_time-start_time)
训练、测试结果如下:
#使用KNN模型
import time
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
start_time=time.time()
#创建模型
Kn = KNeighborsClassifier()
#拟合从tf-idf拿到的数据
Kn.fit(train_x_tfvec,train_y)
#在训练时查看训练集的准确率
pre_train_y=Kn.predict(train_x_tfvec)
#在训练集上的正确率
train_accracy=accuracy_score(pre_train_y,train_y)
#训练结束查看预测 输入测试集查看预测
pre_test_y=Kn.predict(test_x_tfvec)
#查看在测试集上的准确率
test_accracy = accuracy_score(pre_test_y,test_y)
print('使用TfidfVectorizer提取特征使用KNN分类器的准确率\n训练集:{0}\n测试集:{1}'.format(train_accracy,test_accracy))
end_time=time.time()
print("使用KNN分类器的程序运行时间为",end_time-start_time)
### Random Forest Classifier 随机森林分类器
from sklearn.ensemble import RandomForestClassifier
import time
start_time=time.time()
#创建模型
Rfc = RandomForestClassifier(n_estimators=8)
#拟合从CounterfVectorizer拿到的数据
Rfc.fit(train_x_ctvec,train_y)
#在训练时查看训练集的准确率
pre_train_y=Rfc.predict(train_x_ctvec)
#在训练集上的正确率
train_accracy=accuracy_score(pre_train_y,train_y)
#训练结束查看预测 输入测试集查看预测
pre_test_y=Rfc.predict(test_x_ctvec)
#查看在测试集上的准确率
test_accracy = accuracy_score(pre_test_y,test_y)
print('使用CounterfVectorizer提取特征使用随机森林分类器的准确率\n训练集:{0}\n测试集:{1}'.format(train_accracy,test_accracy))
end_time=time.time()
print("使用随机森林分类器的程序运行时间为",end_time-start_time)
### Decision Tree Classifier 决策树
from sklearn import tree
import time
start_time=time.time()
#创建模型
Rf = tree.DecisionTreeClassifier()
#拟合从tf-idf拿到的数据
Rf.fit(train_x_tfvec,train_y)
#在训练时查看训练集的准确率
pre_train_y=Rf.predict(train_x_tfvec)
#在训练集上的正确率
train_accracy=accuracy_score(pre_train_y,train_y)
#训练结束查看预测 输入测试集查看预测
pre_test_y=Rf.predict(test_x_tfvec)
#查看在测试集上的准确率
test_accracy = accuracy_score(pre_test_y,test_y)
print('使用tf提取特征使用决策树分类器的准确率\n训练集:{0}\n测试集:{1}'.format(train_accracy,test_accracy))
end_time=time.time()
print("使用决策树分类器的程序运行时间为",end_time-start_time)
### 贝叶斯
from sklearn.naive_bayes import MultinomialNB
import time
start_time=time.time()
#创建模型
Bys = MultinomialNB()
#拟合数据
Bys.fit(train_x_ctvec, train_y)# 学习,拟合模型
#在训练时查看训练集的准确率
pre_train_y=Bys.predict(train_x_ctvec)
#在训练集上的正确率
train_accracy=accuracy_score(pre_train_y,train_y)
#训练结束查看预测 输入测试集查看预测
pre_test_y=Bys.predict(test_x_ctvec)
#查看在测试集上的准确率
test_accracy = accuracy_score(pre_test_y,test_y)
print('使用CounterVectorizer提取特征使用贝叶斯分类器的准确率\n训练集:{0}\n测试集:{1}'.format(train_accracy,test_accracy))
end_time=time.time()
print("使用贝叶斯分类器的程序运行时间为",end_time-start_time)
#使用SVM分类器
from sklearn.svm import SVC
import time
start_time=time.time()
#创建模型
SVM = SVC(C=1.0, kernel='rbf', gamma='auto')
#拟合数据
SVM.fit(train_x_ctvec, train_y)# 学习,拟合模型
#在训练时查看训练集的准确率
pre_train_y=SVM.predict(train_x_ctvec)
#在训练集上的正确率
train_accracy=accuracy_score(pre_train_y,train_y)
#训练结束查看预测 输入测试集查看预测
pre_test_y=SVM.predict(test_x_ctvec)
#查看在测试集上的准确率
test_accracy = accuracy_score(pre_test_y,test_y)
print('使用CounterfVectorizer提取特征使用SVM分类器的准确率\n训练集:{0}\n测试集:{1}'.format(train_accracy,test_accracy))
end_time=time.time()
print("使用SVM分类器的程序运行时间为",end_time-start_time)
机器学习流程:
1.数据清洗。拿到数据之后首先要将数据进行清洗,包括文本数据的分词,去除停用词以及标点符号的去除,数据清洗的目的是为了去除数据中对特征提取没有意义的数据,比如“的”、“了”等词,同时为了更好的区分相同类别的相似性以及不同类别之间的差异性。
2.格式转换。将数据的格式从TXT格式转换为CSV格式,使用pandas 对数据集的操作非常方便。建议在数据爬取时,就将数据存储成CSV格式。
3.特征提取。本文中使用TfidfVectorizer()和 CountVectorizer()分别进行特征提取,在提取时按照规定格式对训练数据以及测试数据进行格式处理。TfidfVectorizer()和 CountVectorizer()是两个不同的特征提取器,使用这两个特征提取器分别提取特征,目的是比较在当前数据集中两个数据提取器的性能优劣。将数据特征提取之后才能将提取的特征放入分类器中进行拟合与测试。
4.模型拟合。引入不同的机器学习模型,将已经提取的特征X(文本数据,对应于本文中的“评论”)和对应的Y(标签,对应于本文中的“评分”)传入到模型中进行拟合,模型会对传入的X和与对应的Y进行学习,拟合的过程就是模型在学习的过程。当训练数据全部学习完毕之后,使用测试数据对学好的模型进行检验,用于检验在训练数据中学到的参数是否能完美的拟合测试数据,即划分的训练数据可以对测试数据进行推测与模拟,因此都是使用训练数据建立模型,即使用划分出来的训练集数据去训练,然后使用该模型去拟合测试数据。测试模型效果时,会使用准确率、召回率、F1值等评判指标进行综合评判。