使用gensim内LDA与LSA训练文本,将其中的docment_topc矩阵信息作为原始矩阵进行分类。
我自己选的数据是知网的几千篇摘要,都是计算机大类别下的文档,类别比较模糊,只做了个分词处理。以俩空格‘ '作为分隔符保存。最终分类准确率肯定没有那些类别明显的高(sogo)
import os
import re
from gensim import models,corpora
stop_=[]
for x in open('stopwords.txt').readlines():
x=x.encode('utf-8').decode('utf-8-sig').strip('\n')
stop_.append(x)
documents=[]
labels=[]
class_dir=os.listdir('/home/com/kqx/DATA/')
#读取语料库
ii=0
for i in class_dir:
currentpath='/home/com/kqx/DATA/'+i
print(currentpath)
file=open(currentpath)
for f in file.readlines():
labels.append(ii)
f=f.encode('utf-8').decode('utf-8-sig').strip('\n')//有时候文本会多出来个诡异的/ufeff, 处理后会去除这个鬼东西
f=f.split(' ')
tmp_=[]
for x in f:
if x not in stop_:
tmp_.append(x)
documents.append(tmp_)
file.close()
ii+=1
训练个TFIDF作为稠密矩阵存储
dictionary=corpora.Dictionary(documents)
corpus=[dictionary.doc2bow(doc) for doc in documents]#generate the corpus
tf_idf=models.TfidfModel(corpus)#the constructor
corpus_tfidf=tf_idf[corpus]
#训练LSA,并进行分类
lsi=models.LsiModel(corpus_tfidf,id2word=dictionary,num_topics=50)
#建立LSA对应的文档主题矩阵
d_l=[]
labelss=labels
for x in range(len(documents)):
tmp=[]
a1=dictionary.doc2bow(documents[x])
for xx in lsi[a1]:
#print(xx)
tmp.append(xx[1])
if len(tmp)!=lsi.num_topics:
del labelss[x]
continue
d_l.append(tmp)
#利用SVM进行分类
from sklearn.svm import SVC
from sklearn.cross_validation import train_test_split
X_train, X_test, Y_train, Y_test =train_test_split(d_l,labelss,test_size=0.3)
sv=SVC(C=1, kernel='linear')
print('训练')
sv.fit(X_train,Y_train)
sv.score(X_test, Y_test)
基于LSA的SVM分类准确率是 85%
下面试LDA的。
#训练模型
LDA=models.LdaModel(corpus_tfidf,id2word=dictionary,num_topics=150)
#LDA 利用inference 建立模型
import numpy as np
d_l=[]
de=[]
labelss=labels
for x in range(len(documents)):
tmp=[]
a1=dictionary.doc2bow(documents[x])
for xx in list(LDA.inference([a1])[0][0]):
tmp.append(xx)
if len(tmp)!=LDA.num_topics:
print (x)
de.append(x)
continue
d_l.append(tmp)
for x in de:
print('del',x)
del labelss[x]
由于是使用LDA.inference做的矩阵模型,数据未做归一化,同样利用LSA总的SVM分类器,分类结果仅有65%+的样子
利用LDA[],建立文档主题矩阵,建立个文档主题矩阵。
#LDA 归一化的矩阵
import numpy as np
d_l=[]
de=[]
for x in range(len(documents)):
tmp=np.zeros(LDA.num_topics)
a1=dictionary.doc2bow(documents[x])
for xx in list(LDA[a1]):
tmp[xx[0]]=xx[1]
d_l.append(tmp)
for x in de:
print('dede')
del labelss[x]
这个效果也不行。仅有63%+的样子。用gensim.lda效果不咋地。
用源码的LDA效果能在80%+。
等再改改,看看这么提高。占个位置。