接上前面的工作,对分词后的文本数据聚类。
面临的问题:17万多的数据转化为词向量,使用的是tf-idf方法,得到的向量维度是(174021,128021)。聚200个类花费时间为18个小时。
解决方案:
1、通过统计发现17万多文章中有90%+的词汇仅在0.1%的文章中出现过,然而这样的词汇因为过于生僻是没有意义的;因而对TfidfVectorizer函数中的min_df参数进行限定,保留出现频率大于0.1%小于90%的词汇,作为文本向量化表示的内容,得到1740211251维度大小的矩阵;
2、对矩阵进行降维,综合其它变量,将维度降到100,得到174021100的矩阵。此时降维后的文本向量可表达原文本特征的59%;
3、对文本向量进行MiniBatchKmeans聚类,Mini Batch是原始数据集中的子集,这个子集是在每次训练迭代时抽取的样本。
算法步骤为:
经多方调整,每次输入模型的数据量为20480(但是我感觉2048和20480的差别不大)
4、最后调整聚类的类别数,可通过两个指标的变化情况:
(1)SSE(绘制SSE的变化曲线,拐点即为最佳类别数;计算原则是同一簇内的点尽可能紧密);
(2)轮廓系数(越接近于1越好;计算原则是同一个簇尽可能紧密,不同簇尽可能远离同一个簇尽可能紧密,不同簇尽可能远离)。
(**但是很奇怪的是不知道我的为啥他俩是反过来的,哭唧唧)
以下是计算代码:
from sklearn.pipeline import make_pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.preprocessing import Normalizer
from sklearn.cluster import MiniBatchKMeans,KMeans
from sklearn import metrics
import matplotlib.pyplot as plt
import numpy as np
import codecs
import csv
from collections import Counter
##-------------第一步:读取数据-------------------
file=open(u'/Users/sunmengge/Desktop/scopus_content/scopus_fenci/fenci.csv','rb')
#file=open('data/jour data test 99.txt','rb')
file_cont=file.readlines()
corpus=[]
corpus1 = []
for text in file_cont:
words=text.decode().strip().split('|')
corpus.append(' '.join(words)<