赞
踩
分别对训练集测试集进行预处理
训练集data数据与测试集test数据都为新闻类数据压缩包获取而来
训练集数据概览
测试集数据概览
['汽车', '娱乐', '军事', '运动']
运用sklearn的TfidfVectorizer模块制作tfidf矩阵,指定矩阵数值类型,将出现频率小于2的值忽略(初步降维),通过正则表达式过滤非中文数据,标准化后制作tfidf矩阵,提取词向量对应每一列列名为b
结果如下图所示
将列名添加给矩阵,制作数据框形式查看数据tfidf矩阵的结果
结果如下图所示
主要思想是利用sklearn中metrics计算nmi值,代码实现如下所示,将tdidf矩阵中每一列对应的词都与总文档数200(y)计算,得出所有词(917)的nmi值
查看nmi结果
利用字典对nmi进行排序,选择nmi值在前500的词(二次降维,利用nmi降维的实现)
从结果可以看出由917个词降维成500个词,结果如下,此时的结果为元组
提取前500词所在对应列的tfidf值,通过循环实现
先定义空列表提取元组的0列即词
提取出的结果如下所示
利用循环嵌套,遍历刚刚提取出来的l词列表,与原tfidf中词向量对应的每一列列名b对比,将对应结果为相等的词对应列的tfidf值追加到新列表中,转换数据类别,得到全新的tfidf矩阵
查看预处理结果
与训练集思路一致,没有进行nmi降维,不做展示,详情看源码
结果显示
将得到的xx作为训练集‘x’参数与y(总文档分类列重编码后的结果)作为‘y’参数进行模型训练
2.训练集模型训练
遇到的问题在nmi降维上,实际上选取nmi总体前500的词并不能完全代表数据中的每个文档,因为并不明确每个文档前几的词是否有重复,最应该选择的nmi降维方式应该是对应每个文档nmi为前5或者前10的词进行降维,但是本次小组讨论中并没有讨论出合适的方法,找到合适的文献去进行该工作。
文本挖掘与数据挖掘不同点在于文本挖掘需要清楚了解如何通过tfidf矩阵将字符型词转换为数值型方便后续运算。
在最终模型测试中可以看见朴素贝叶斯分类器在测试集与训练集都非常高,随机森林分类器简直为训练集量身定制,准确率吻合1.0,而神经网络有关的两个分类器准确率需要通过调参去找到使分类结果准确率更高的参数,如果按默认参数使用该两个神经网络分类器,在训练集中效果不足。
import pandas as pd
import jieba, time
import numpy as np
#tfidf
from sklearn.feature_extraction.text import TfidfVectorizer
#计算nmi
from sklearn import metrics
#svc支持向量机
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
#朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
#随机森林
from sklearn.ensemble import RandomForestClassifier
#逻辑斯蒂
from sklearn.linear_model import LogisticRegression
#knn分类器
from sklearn.neighbors import KNeighborsClassifier
#AdaBoost分类
from sklearn.ensemble import AdaBoostClassifier
train_df = pd.read_csv('D:/文本挖掘/作业四/data.csv', sep=',', header=None,encoding='utf-8')
train_df.columns = ['分类', '文章']
#生成停用词表
stopword_list = [k.strip() for k in open('D:/文本挖掘/新闻类/stopwords.txt', encoding='utf-8') if k.strip() != '']
#生成分词表
cutWords_list = []
for i in range(0,len(train_df)):
#分词
outstr = ''
seg_list = jieba.cut(train_df['文章'][i].strip())
for word in seg_list :#读取每一行分词
if word not in stopword_list:
if word != '\t': #不加空格进去
outstr += word + " "
cutWords_list.append(outstr)#将该行分词写入列表形式的总分词列表
#遍历带字符的列
for fea in ['分类']:
labels = train_df[fea].unique().tolist() #unique去重复元素,tolist转成列表
train_df[fea] = train_df[fea].apply(lambda x:labels.index(x))
y = train_df['分类']
#生成矩阵的数值类型
#如果某个词的document frequence小于5,则这个词不会被当作关键词
#通过正则表达式来确定非中文字符数据被过滤掉
#标准化
tfidfVectorizer = TfidfVectorizer(
dtype = float,
min_df = 2,
token_pattern=u'[\u4e00-\u9fa5]+',
norm = 'l2' )
#训练和测试的词频向量格式保持一致
X_Vector=tfidfVectorizer.fit_transform(cutWords_list) # 将文章转化为tfidf矩阵
b = tfidfVectorizer.get_feature_names()#获得tfidf矩阵对应特征
#将列名添加给矩阵
df = pd.DataFrame(X_Vector.toarray(),columns=b)
#计算nmi
nmi ={}
for i in range(X_Vector.shape[1]):
x = X_Vector.toarray()[:,i]
result_NMI = metrics.normalized_mutual_info_score(x,y)
nmi[b[i]] = result_NMI
#给nmi值进行排序
nmi=sorted(nmi.items(),key=lambda x:x[1],reverse=True)
print(len(nmi))
#获取nmi前500
ls=nmi[:500]
#查看是否降维成功
print(len(ls))
#查看排序后的前500个词的nmi
ls
#定义一个空列表为l
l = []
#遍历通过nmi降维得到的nmi词袋列表ls,将得到的500个词追加到l中,便于后边循环
for i in range(len(ls)):
l.append(ls[i][0])
#查看l
l
#定义新列表
hh = []
#将降维得到的500个词和原来917个词对比,将原tfidf矩阵中对应词列追加到新列表hh中
for j in l:
for z in b:
if j == z:
hh.append(df[z].tolist())
#基于nmi降维得到的全新tfidf矩阵hh转换为数组形式方便后续分类器模型运用
xx = np.array(hh).reshape(200,500)
#至此预处理完成
print(xx.shape)
print(xx)
#训练集预处理
test_df = pd.read_csv('D:/文本挖掘/作业四/test.csv', sep=',', header=None,encoding='utf-8')
test_df.columns = ['分类', '文章']
#生成停用词表
stopword_list = [k.strip() for k in open('D:/文本挖掘/新闻类/stopwords.txt', encoding='utf-8') if k.strip() != '']
#生成分词表
test_cutWords_list = []
for i in range(0,len(test_df)):
#分词
outstr = ''
seg_list = jieba.cut(test_df['文章'][i].strip())
for word in seg_list :#读取每一行分词
if word not in stopword_list:
if word != '\t': #不加空格进去
outstr += word + " "
test_cutWords_list.append(outstr)#将该行分词写入列表形式的总分词列表
#遍历带字符的列
for fea in ['分类']:
labels = test_df[fea].unique().tolist() #unique去重复元素,tolist转成列表
test_df[fea] = test_df[fea].apply(lambda x:labels.index(x))
y_text = test_df['分类']
#生成矩阵的数值类型
#如果某个词的document frequence小于5,则这个词不会被当作关键词
#通过正则表达式来确定非中文字符数据被过滤掉
#标准化
test_tfidfVectorizer = TfidfVectorizer(
dtype = float,
min_df = 2,
token_pattern=u'[\u4e00-\u9fa5]+',
norm = 'l2' )
#训练和测试的词频向量格式保持一致
test_X_Vector=text_tfidfVectorizer.fit_transform(test_cutWords_list) # 将文章转化为tfidf矩阵
b = test_tfidfVectorizer.get_feature_names()#获得tfidf矩阵对应特征
#将列名添加给矩阵
df = pd.DataFrame(test_X_Vector.toarray(),columns=b)
xx_test = np.array(test_X_Vector.toarray()).reshape(44,107)
#至此预处理完成
print(xx_test.shape)
print(xx_test)
#训练集测试模型
clf = SVC() #选择SVC模型
clf.fit(xx,y)
#4.计算svc分类器的准确率
print("训练集:",clf.score(xx,y))
#逻辑斯蒂文本分类实现
logitmodel=LogisticRegression()#定义回归模型
logitmodel.fit(xx,y)#训练模型
#4.计算逻辑斯蒂文本分类器的准确率
print("训练集:",logitmodel.score(xx,y))
#朴素贝叶斯的实现
beiyesi = GaussianNB()#定义回归模型
beiyesi.fit(xx,y)#训练模型
print("训练集:",beiyesi.score(xx,y))
#随机森林分类实现
rfc = RandomForestClassifier()#定义回归模型
rfc.fit(xx,y)#训练模型
print("训练集:",rfc.score(xx,y))
#knn分类器
classifier = KNeighborsClassifier() # 定义模型
classifier.fit(xx,y)#训练模型
print("训练集:",classifier.score(xx,y))
# AdaBoost的实现
AB = AdaBoostClassifier()#定义模型
AB.fit(xx,y)#训练模型
print("训练集:",AB.score(xx,y))
#测试集模型测试
#逻辑斯蒂文本分类实现
logitmodel=LogisticRegression()#定义模型
logitmodel.fit(xx_test,y_test)#训练模型
#4.计算逻辑斯蒂文本分类器的准确率
print("测试集:",logitmodel.score(xx_test,y_test))
#朴素贝叶斯的实现
beiyesi = GaussianNB()#定义模型
beiyesi.fit(xx_test,y_test)#训练模型
print("测试集:",beiyesi.score(xx_test,y_test))
#随机森林分类实现
rfc = RandomForestClassifier()#定义模型
rfc.fit(xx_test,y_test)#训练模型
print("测试集:",rfc.score(xx_test,y_test
clf = SVC() #选择SVC模型
clf.fit(xx_test,y_test)
#4.计算svc分类器的准确率
print("测试集:",clf.score(xx_test,y_test))
#knn分类器
classifier = KNeighborsClassifier() # 定义模型
classifier.fit(xx_test,y_test)#训练模型
print("测试集:",classifier.score(xx_test,y_test))
# AdaBoost的实现
AB = AdaBoostClassifier()#定义模型
AB.fit(xx_test,y_test)#训练模型
print("测试集:",AB.score(xx_test,y_test))
#4.计算svc分类器的准确率
print("训练集:",clf.score(xx,y))
#4.计算逻辑斯蒂文本分类器的准确率
print("训练集:",logitmodel.score(xx,y))
#4.计算高斯朴素贝叶斯分类器的准确率
print("训练集:",beiyesi.score(xx,y))
#4.计算随机森林分类器的准确率
print("训练集:",rfc.score(xx,y))
#4.计算knn分类器的准确率
print("训练集:",classifier.score(xx,y))
#4.计算AdaBoost分类器准确率
print("训练集:",AB.score(xx,y))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。