第1关
#1.读取“新闻训练数据集.xlsx”,其中第1列为情感分类(积极、中性、消极),
# 2-5列依次为标题、来源、爬取时间、网址
#2.对标题进行分词处理,每一条标题分词后是元素为词的列表,则
# 所有标题分词后的数据为一个嵌套列表trainX_txt。
# 同时对情感分类进行标签值化处理:积极-0,中性-1,消极-2,用一个列表Y来表示。
#3.读取“新闻测试数据.xlsx”,该数据集与训练集相比,没有情感分类字段,为待预测
# 同步骤2,对测试集中的标题进行分词,分词后的结果为testX_txt
def return_values():
import jieba#引入结巴分词
import pandas as pd
jieba.setLogLevel(jieba.logging.INFO)
#1.新闻标题训练数据集操作
rawdata=pd.read_excel('新闻训练数据集.xlsx')
Y=[]
trainX_txt=[]
for i in range(len(rawdata)):
#1.1.对标题进行分词处理
text=rawdata.iloc[i,1]
word_list=list(jieba.cut(text,cut_all=False))
trainX_txt.append(word_list)
#1.2.对情感分类进行标签值化处理
if rawdata.iloc[i,0]=='积极':
Y.append(0)
elif rawdata.iloc[i,0]=='中性':
Y.append(1)
else:
Y.append(2)
#2.新闻标题测试数据集操作
rawdata_test=pd.read_excel('新闻测试数据.xlsx')
testX_txt=[]
for i in range(len(rawdata_test)):
#2.1.对标题进行分词处理
text=rawdata_test.iloc[i,0]
word_list=list(jieba.cut(text,cut_all=False))
testX_txt.append(word_list)
return (trainX_txt,Y,testX_txt)
第2关
#读取停用词文件“stop_words.txt”,该文件为单列无表头的文件
#对上一关获得的分词后的训练集trainX_txt和测试集testX_txt,
#去掉停用词和数值,同时对每条标题(词列表),变成字符串(词之间用空格分开),
# 最后返回结果,同时也返回上一关的Y值(r[1])
# def return_values():
# import step10_1
# r=step10_1.return_values()
# return (trainX_txt,r[1],testX_txt)
def rm_stop_words(word_list):
stop_word=open('stop_words.txt', 'r').read().splitlines()
for i in range(len(word_list))[::-1]:
if word_list[i] in stop_word:
word_list.pop(i)
elif word_list[i].isdigit():#去数值
word_list.pop(i)
return word_list
def return_values():
import step10_1
r=step10_1.return_values()
trainX_txt=[]#整合后的训练数据
testX_txt=[]#整合后的测试数据
for i in range(len(r[0])):
t=rm_stop_words(r[0][i])
text=' '.join(t)
trainX_txt.append(text)
for i in range(len(r[2])):
t=rm_stop_words(r[2][i])
text=' '.join(t)
testX_txt.append(text)
return (trainX_txt,r[1],testX_txt)
第3关
#1.基于上一关的结果trainX_txt,Y,testX_txt,利用机器学习包的内置函数,
# 计算逆向词频,并构造特征集,对训练数据集按80%训练、20%测试随机划分,
# 构建支持向量机模型,返回模型准确率rv和预测准确率rs。
#2.最后,利用训练好的模型,对testX_txt进行预测,返回测试集的情感分类标签值。
def return_values():
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import pandas as pd
import step10_2
r=step10_2.return_values()
X, Y, testX_txt = r # 确保 X, Y, testX_txt 被正确赋值
count_vect = CountVectorizer() #对CountVectorizer创建对象count_vect
x_train_counts = count_vect.fit_transform(X) #用来对数据进行处理,表示成n-gram的形式
tfidf_transformer = TfidfTransformer()#对TfidfTransformer创建对象tfidf_transformer
X = tfidf_transformer.fit_transform(x_train_counts)
x_train, x_test, y_train, y_test = train_test_split (X, Y, random_state = 0)
from sklearn.svm import LinearSVC
clf_svm = LinearSVC()
clf_svm.fit(x_train, y_train)
rv=clf_svm.score(x_train, y_train)
rs=clf_svm.score(x_test,y_test)
test_y=[]#测试数据的情感分类预测
for i in range(len(testX_txt)):
text1=testX_txt[i]
pre=clf_svm.predict(count_vect.transform([text1]))
test_y.append(pre[0])
return (rv,rs,test_y)