本文主要是学习参考杨秀璋老师的博客,笔记总结。
原文链接
文章目录
- 书山有路勤为径,学海无涯苦作舟(行行代码要手敲)
- 零、吃水不忘挖井人
- 一、数据预处理(分词-清洗-特征提取-权重)
- 二、中文分词
- 2.1 中文分词技术
- 2.2 Jieba中文分词用法
- (1)安装
- (2)基础用法
- (3)中文分词案例
- 三、数据清洗
- 3.1数据清洗概述
- 3.2 中文语料的停用词过滤
- (1)停用词过滤
- (2)去除标点符号
- 四、特征提取及向量空间模型
- 4.1.特征规约
- (1) 特征提取
- (2) 特征选择
- 4.2向量空间模型
- 4.3 余弦相似度
- 1)对所有的语料库进行分词处理
- 2)列出所有文本词,构建向量矩阵
- 3)计算每个文本的词频
- 4)计算余弦相似度
- 五、特征项的权重计算
- 5.1常见的权重计算方法
- (1)布尔权重
- (2) 绝对词频
- (3)倒文档IDF
- 5.2.TF-IDF
- 5.1 通过Sklearn实现TF-IDF
- 5.1.1 实现绝对词频
- 5.1.2 再词频的基础上转为TF-IDF
- 六、文本聚类
书山有路勤为径,学海无涯苦作舟(行行代码要手敲)
零、吃水不忘挖井人
原文链接
一、数据预处理(分词-清洗-特征提取-权重)
数据的预处理直接影响后续模型分析的好坏,数据预处理是在对数据进行一些初步的处理:
- 缺失值缺失
- 噪声处理
- 中文分析
数据预处理的基本步骤,中文分词,词性标注,数据清洗,特征分词(向量空间模型存储),权重计算(TF-IDF)等:
1.中文分词
在得到语料之后,首先需要做的就是对中文语料进行分词。
需要通过一定的分词技术把句子分割成空格连接的词序列。
2.数据清洗及停用词过滤
在中文分词技术得到分完词的语料后,可能会存在脏数据和停用词等现象。
为了得到更好的数据分析结果,需要对这些数据集进行数据清洗和停用词过滤等操作
3.词性标注
词性标注是指为分词结果中的每个单词或词组标注一个正确的词性,即确定每个词是名词、动词、形容词或其他词性的过程。
通过词性标注可以确定词在上下文中的作用,通常词性标注是自然语言处理和数据预处理的基础步骤,Python也提供了相关库进行词性标注。
4.特征提取
特征提取是指将原始特征转换为一组具有明显物理意义或者统计意义的核心特征,所提取的这组特征可以尽可能地表示这个原始语料,提取的特征通常会存储至向量空间模型中特征。
特征提取的越好,模型的精度就会越高
向量空间模型是用向量来表征一个文本,它将中文文本转化为数值特征。本文章主要介绍了老师的特征提取、向量空间模型和余弦相似性的基本知识。
5.权重计算及TFIDF
特征提取完后,可能不同的词汇之间的重要的程度不同。所以在建立向量空间模型过程中,权重的表示尤为重要,常用方法包括布尔权重、词频权重、TF-IDF权重、熵权重方法等。本章讲述了常用的权重计算方法,并详细讲解了TF-IDF的计算方法和实例。
现在假设存在表1所示的数据集,并存储至本地test.txt文件中,整章内容都将围绕该数据集进行讲解,数据集共分为9行数据,包括3个主题,即:贵州旅游、大数据和爱情。接下来依次对数据预处理的各个步骤进行分析讲解。
二、中文分词
当获取语料数据后,需要将借助中文分词技术将语料中的句子按照空格分隔来连接的一段段词序列。
2.1 中文分词技术
中文分词(Chinese Word Segmentation)指将汉字序列切分成一个个单独的词或词串序列,它能够在没有词边界的中文字符串中建立分隔标志,通常采用空格分隔。
只有经过中文分词后的语料才能转换为数学向量的形式。
中文分词方法有很多,常见的包括:
- 基于字符串匹配的分词方法
- 基于统计的分词方法
- 基于语义的分词方法
经典的字符串的匹配方法:
基于字符串匹配的分词方法又称为基于字典的分词方法。
它按照一定策略将待分析的中文字符串与机器词典中的词条进行匹配。
若在词典中找到某个字符串,则匹配成功,并识别出对应的词语。
该方法的匹配原则包括:
- 最大匹配法(MM)
- 逆向最大匹配法(RMM)
- 逐词遍历法
- 最佳匹配法(OM)
- 并行分词法等。
正向最大匹配法的步骤如下,假设自动分词词典中的最长词条所含汉字的个数为n。
① 从被处理文本中选取当前中文字符串中的前n个中文汉字作为匹配字段,查找分词词典,若词典中存在这样一个n字词,则匹配成功,匹配字段作为一个词被切分出来。
② 若分词词典中找不到这样的一个n字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的中文字符作为新的匹配字段,继续进行匹配。
③ 循环步骤进行匹配,直到匹配成功为止。
例如,现在存在一个句子“北京理工大学生前来应聘”,使用正向最大匹配方法进行中文分词的过程如下所示。
分词算法:正向最大匹配法
输入字符:北京理工大学生前来应聘
分词词典:北京、北京理工、理工、大学、大学生、生前、前来、应聘
最大长度:6
匹配过程:
(1)选取最大长度为6的字段匹配,即“北京理工大学”匹配词典“北京理工大学”在词典中没有匹配字段,则去除一个汉字,剩余“北京理工大”继续匹配,该词也没有匹配字段,继续去除一个汉字,即“北京理工”,分词词典中存在该词,则匹配成功。结果:匹配“北京理工”
(2)接着选取长度为6的字符串进行匹配,即“大学生前来应” “大学生前来应”在词典中没有匹配字段,继续从后去除汉字,“大学生” 三个汉字在词典中匹配成功。结果:匹配“大学生”
(3)剩余字符串“前来应聘”继续匹配“前来应聘”在词典中没有匹配字段,继续从后去除汉字,直到“前来”。结果:匹配“前来”
(4)最后的字符串“应聘”进行匹配。结果:匹配“应聘”
分词结果:北京理工 \ 大学生 \ 前来 \ 应聘
常见的分词工具包括:
- Stanford汉语分词工具
- 哈工大语言云(LTP -cloud)
- 中国科学院汉语词法分析系统(ICTCLAS)
- IKAnalyzer分词
- 盘古分词
- 庖丁解牛分词
2.2 Jieba中文分词用法
(1)安装
pip install jieba
(2)基础用法
- jieba.cut(text,cut_all=True)
第一个参数是需要分词的字符串,第二个参数表示是否为全模式。
返回结果是一个可迭代的生成器(generator),可使用for循环来获取分词后的每个词语,推荐读者转换为list列表再使用。 - jieba.cut_for_search(text)
搜索引擎模式分词,参数为分词的字符串,该方法适合用于搜索引擎构造倒排索引的分词,粒度比较细。
import jiebatext = '小陈正在学习数据分析技术,希望能够好好学习,天天向上'# 全模式data = jieba.cut(text, cut_all=True)
print(type(data))
print(u'[全模式]:', "/".join(data))# 精确模式data = jieba.cut(text, cut_all=False)
print(u'[精确模式]', '/'.join(data))# 默认是精确模式
data = jieba.cut(text)
print(u"[默认模式]:", '/'.join(data))# 搜索引擎模式
data = jieba.cut_for_search(text)
print(u'[搜索引擎模式]:', '/'.join(data))# 返回列表seg_list = jieba.lcut(text, cut_all=False)
print("[返回列表]: {0}".format(seg_list))
[全模式]: 小/陈/正在/学习/数据/数据分析/分析/技术/,/希望/能够/好好/好好学/好好学习/好学/学习/,/天天/天天向上/向上
[精确模式] 小/陈/正在/学习/数据分析/技术/,/希望/能够/好好学习/,/天天向上
[默认模式]: 小/陈/正在/学习/数据分析/技术/,/希望/能够/好好学习/,/天天向上
[搜索引擎模式]: 小/陈/正在/学习/数据/分析/数据分析/技术/,/希望/能够/好好/好学/学习/好好学/好好学习/,/天天/向上/天天向上
[返回列表]: [‘小’, ‘陈’, ‘正在’, ‘学习’, ‘数据分析’, ‘技术’, ‘,’, ‘希望’, ‘能够’, ‘好好学习’, ‘,’, ‘天天向上’]
全模式
该模式将语料中所有可以组合成词的词语都构建出来,其优点是速度非常快,缺点是不能解决歧义问题,并且分词结果不太准确。
精确模式
该模式利用其算法将句子最精确地分隔开,适合文本分析,通常采用这种模式进行中文分词。
搜索引擎模式
该模式是在精确模式基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
(3)中文分词案例
案例:
import os
import codecs
import jieba
import jieba.analysesource = open('test.txt', 'r')line = source.readline().rstrip('\n')
print(line)content = []while line != '':seglist = jieba.cut(line, cut_all=False)output = " ".join(list(seglist))print(output)content.append(output)line = source.readline().rstrip('\n')
else:source.close()
输出结果:
三、数据清洗
在分词后,有些词汇和符号,并没有实际意义,反而影响到模型的精确度。可以将这些词去掉,降低模型的复杂度,所以需要利用Jieba分词工具进行停用词和标点符号的清洗。
3.1数据清洗概述
脏数据通常是指数据质量不高、不一致或不准确的数据,以及人为造成的错误数据等。常见的脏数据分为四类:
-
残缺数据
该类数据是指信息存在缺失的数据,通常需要补齐数据集再写入数据库或文件中。比如统计9月份30天的销售数据,但期间某几天数据出现丢失,此时需要对数据进行补全操作。 -
重复数据
数据集中可能存在重复数据,此时需要将重复数据导出让客户确认并修正数据,从而保证数据的准确性。在清洗转换阶段,对于重复数据项尽量不要轻易做出删除决策,尤其不能将重要的或有业务意义的数据过滤掉,校验和重复确认的工作是必不可少的。 -
错误数据
该类脏数据常常出现在网站数据库中,是指由于业务系统不够健全,在接收输入后没有进行判断或错误操作直接写入后台数据库造成的,比如字符串数据后紧跟一个回车符、不正确的日期格式等。这类错误可以通过去业务系统数据库用SQL语句进行挑选,再交给业务部门修正。 -
停用词
分词后的语料并不是所有的词都与文档内容相关,往往存在一些表意能力很差的辅助性词语,比如中文词组“我们”、“的”、“可以”等,英文词汇“a”、“the”等。这类词在自然语言处理或数据挖掘中被称为停用词(Stop Words),它们是需要进行过滤的。通常借用停用词表或停用词字典进行过滤。
3.2 中文语料的停用词过滤
(1)停用词过滤
案例:
#coding=utf-8
#By:Eastmount CSDN
import os
import codecs
import jieba
import jieba.analyse#停用词表
stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与','和', '也', '被', '吗', '于', '中', '最'])source = open("test.txt", 'r')
line = source.readline().rstrip('\n')
content = [] #完整文本while line!="":seglist = jieba.cut(line,cut_all=False) #精确模式final = [] #存储去除停用词内容for seg in seglist: if seg not in stopwords: final.append(seg)output = ' '.join(list(final)) #空格拼接print(output)content.append(output) #最终结果line = source.readline().rstrip('\n')
else:source.close()
(2)去除标点符号
去除符号就是在停用词的词典中也好包含符号标点,将这些一起过滤
过滤后将所有的词都存在本地:
# coding=utf-8
#By:Eastmount CSDN
import os
import codecs
import jieba
import jieba.analyse#停用词表
stopwords = {}.fromkeys(['的', '或', '等', '是', '有', '之', '与','和', '也', '被', '吗', '于', '中', '最','“', '”', '。', ',', '?', '、', ';'])source = open("test.txt", 'r')
result = codecs.open("result.txt", 'w', 'utf-8')
line = source.readline().rstrip('\n')
content = [] #完整文本while line!="":seglist = jieba.cut(line,cut_all=False) #精确模式final = [] #存储去除停用词内容for seg in seglist: if seg not in stopwords: final.append(seg)output = ' '.join(list(final)) #空格拼接print(output)content.append(output)result.write(output + '\r\n')line = source.readline().rstrip('\n')
else:source.close()result.close()
结果:
四、特征提取及向量空间模型
4.1.特征规约
网络爬取、中文分词、数据清洗后的语料数据通常称为初始特征集
初始特征集通常都是由高维数据组成,但是并不是所有的特征都重要。初步经过清洗过后的高维数据中可能包含不相关的信息。这些信息对分析结果没有实际意义,但是这些信息却会降低算法和模型的性能。甚至高维数据会造成维数灾难,影响数据分析的结果。
特征规约:减少数据的冗余维度(弱相关维度)或提取更有价值的特征能够有效地加快计算速度,提高效率,也能够确保实验结果的准确性。选择与数据分析应用相关的特征,以获取最佳性能,并且降低的工作量。
特征规约包含两个任务:
- (1)特征选择
- (2)特征提取
它们都是从原始特征中找出最有效的特征,并且这些特征能尽可能地表征原始数据集。
(1) 特征提取
特征提取:将原始特征转换为一组具有明显物理意义或者统计意义的核心特征,所提取的这组特征可以尽可能地表示这个原始语料。
特征提取分为线性特征提取和非线性特征提取
线性特征提取常见的方法包括:
- PCA主成分分析方法。该方法寻找表示数据分布的最优子空间,将原始数据降维并提取不相关的部分,常用于降维,参考前面聚类那篇文章。
- LDA线性判别分析方法。该方法寻找可分性判据最大的子空间。
- ICA独立成分分析方法。该方法将原始数据降维并提取出相互独立的属性,寻找一个线性变换。
非线性特征提取常见方法包括Kernel PCA、Kernel FDA等。
(2) 特征选择
特征选择是从特征集合中挑选一组最具统计意义的特征,从而实现降维。
通常包括产生过程、评价函数、停止准则、验证过程四个部分。
传统方法包括信息增益(Information Gain,简称IG)法、随机产生序列选择算法、遗传算法( Genetic Algorithms,简称GA )等。
4.2向量空间模型
向量空间模型是值用向量的形式来表达一个文档,其将 语料中的文本时数据转化为数值,进而进行分析。
采用向量空间模型来表示一篇文档,它将一个文档或者一篇语料转化为一些列的关键词或者特征向量
- 特征项
特征项是值文档所表达的内容由它所包含的基本语言单位组成(字,词,词组,或者短语),在文本的表示模型中,基本的语言单位就称为文本的特征项。如下表示的是一个文本中的N个特征项:
- 特征权重(Trem Weight)
特征权重是指为文档中的某个特征项ti(1≤ i ≤n)赋予权重wi,以表示该特征项对于文档内容的重要程度,权重越高的特征项越能反应其在文档中的重要性。
文本Doc中存在n个特征项,即:{t1, t2, t3, … , tn-1, tn},它是一个n维坐标,接着需要计算出各特征项ti在文本中的权重wi,为对应特征的坐标值。按特征权重文本表示如下,其中,WDoc称为文本Doc的特征向量。
- 文档表示
得到了特征项和特征权重后,需要表示一篇文档,则利用下面这个公式。其中,文档Doc共包含n个特征词和n个权重。ti是一系列相互之间不同的特征词,i=1,2,…,n。wi(d)是特征词ti在文档d中的权重,它通常可以被表达为ti在d中呈现的频率。
4.3 余弦相似度
向量空间模型计算得到两篇文章的向量后,则可以计算两篇文章的相似程度,两篇文章间的相似度通过两个向量的余弦夹角Cos来描述。文本D1和D2的相似度计算公式如下:
分子表示两个向量的点乘积,分母表示两个向量的模的乘积,得到的值就是两篇文章的相似度
下图是向量空间模型图,它展示了文档Term1、Term2、…、TermN之间的余弦相似度计算方法。
两篇文档越相似,则其夹角θ越小,Cos值越接近于1,当两篇文档完全相似时,此时的夹角为0°,Cos值为1。
相似度计算
1)对所有的语料库进行分词处理
2)列出所有文本词,构建向量矩阵
3)计算每个文本的词频
4)计算余弦相似度
五、特征项的权重计算
权重计算是指通过特征权重来衡量特征项在文档表示中的重要程度,给特征词赋予一定的权重来衡量统计文本特征词。
常用的权重计算方法包括:布尔权重、绝对词频、倒文档词频、TF-IDF、TFC、熵权重等。
5.1常见的权重计算方法
(1)布尔权重
布尔权重是思想:设定的权重是0或者1。
- 如果在文本中出现了该特征词,不论该特征词汇出现了几次,该特征词的赋值为1;
- 如果该特征词没有在文本中出现,则分量为0。
公式如下所示,其中wij表示特征词ti在文本Dj中的权重。
假设特征向量为:
{今天天气很好,小明想去爬山,小红想去旅游}
那么句子“小明想去爬山”的权重的结果为:
{0,0,0,1,1,1,0,0,0}
布尔权重0-1值的问题:
无法体现特征词在文本中的重要程度,因为无论出现了几次,那么都是1,有些中心词的文章的中心词你,会频繁的出现,但是都只会被记成1,没有办法表示该词的重要性。
改进的方法就是词频的方法。
(2) 绝对词频
词频方法又称为绝对词频(Term Frequency,简称TF),
先计算特征词在文档中出现的频率,通过词频来表征文本。
通常使用tfij表示,即特征词ti在训练文本Dj中出现的频率。
假设句子为“北京理工大学的大学生和清华大学的大学生前来应聘”,而对应的特征词为:{北京理工,大学生,前来,应聘,清华大学,也,我,喜欢,写,代码,的,和},对应词频向量为:
{1,2,1,1,1,0,0,0,0,0,2,1}
前面所采用的向量空间模型计算文本余弦相似性的例子也使用的是词频,这是权重计算方法中最简单、有效的方法之一。
绝对词频的问题:
虽然通过词频可以表示出某些频繁词汇的重要性
但是由于语言的特性,为了语言的通顺的词,也会在不同文档中频繁的出现,但是这些词汇虽然频繁出现,但是实际上并没有那么重要
(3)倒文档IDF
词频方法无法体现低频特征项的区分能力,往往存在某些特征项频率很高,却在文本中起到很低影响程度的现象,如“我们”、“但是”、“的”等词语;同时,有的特征项虽然出现的频率很低,但表达着整个文本的核心思想,起着至关重要的作用。
倒文档频率(Inverse Document Frequency,简称IDF)用于计算词与文献相关权重的经典方法。
其中,参数|D|表示语料的文本总数,表示文本所包含特征词ti的数量。
在倒文档频率方法中,权重是随着特征词的文档数量的变化呈反向变化。如某些常用词“我们”、“但是”、“的”等,在所有文档中出现频率很高,但它的IDF值却非常低。甚至如果它每篇文档都出现,则log1的计算结果为0,从而降低了这些常用词的作用;相反,如果某篇介绍“Python”的词,仅仅在该篇文档中出现,它的作用就非常高。
同样还有很多权重计算方法,包括TF-IDF、熵权重、TF-IWF、基于错误驱动的特征权重算法等
5.2.TF-IDF
TF-IDF(Term Frequency-Invers Document Frequency)是近年来用于数据分析和信息处理经典的权重计算技术。
该技术根据特征词在文本中出现的次数和在整个语料中出现的文档频率来计算该特征词在整个语料中的重要程度,其优点是能过滤掉一些常见却无关紧要的词语,尽可能多的保留影响程度高的特征词。
其中,TF(Term Frequency)表示某个关键词在整篇文章中出现的频率或次数。IDF(Invers Document Frequency)表示倒文本频率,又称为逆文档频率,它是文档频率的倒数,主要用于降低所有文档中一些常见却对文档影响不大的词语的作用。TF-IDF的完整公式如下:
式中tfidfi,j表示词频tfi,j和倒文本词频idfi的乘积,TF-IDF中权重与特征项在文档中出现的频率成正比,与在整个语料中出现该特征项的文档数成反比。tfidfi,j值越大则该特征词对这个文本的重要程度越高。
TF词频的计算公式如下:
其中,ni,j为特征词ti在训练文本Dj中出现的次数,是文本Dj中所有特征词的个数,计算的结果即为某个特征词的词频。
TF-IDF公式推导如下所示:
TF-IDF技术的核心思想是如果某个特征词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来做权重计算。TF-IDF算法简单快速,结果也符合实际情况,其缺点是单纯以词频衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多,并且该算法无法体现词的位置信息。
5.1 通过Sklearn实现TF-IDF
Scikit-Learn中的两个类CountVectorizer和TfidfTransformer,可以实现计算词频和TF-IDF值。
5.1.1 实现绝对词频
- CountVectorizer
该类是将文本词转换为词频矩阵的形式。
CountVectorizer将生成一个矩阵a[M][N],共M个文本语料,N个单词,比如a[i][j]表示单词j在i类文本下的词频。
调用fit_transform()函数计算各个词语出现的次数,get_feature_names()函数获取词库中的所有文本关键词。
案例(构建文本模型的时候,数据必须是已经清洗了):
from sklearn.feature_extraction.text import CountVectorizer
#-----------------------存储读取的预料,一行的语料为一个文档-----corpus = []
for line in open('result', 'r', encoding='utf8').readline():corpus.append(line.rstrip())#------------------------文本转化为绝对词频模型---------------
vectorizer = CountVectorizer() # 实例化X = vectorizer.fit_transform(corpus)print(X)
#获取词袋中所有文本关键词
word = vectorizer.get_feature_names()
for n in range(len(word)): print(word[n],end=" ")
print('')#查看词频结果
print(X.toarray())
输出结果是:得到的是每个再矩阵中位置,以及出现的频次
X.toarray()是转为数组
5.1.2 再词频的基础上转为TF-IDF
通过TfidfTransformer类实现统计vectorizer变量中每个词语的TF-IDF值
案例:
#coding:utf-8
#By:Eastmount CSDN
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer#存储读取语料
corpus = []
for line in open('result.txt', 'r', encoding="utf-8").readlines(): corpus.append(line.strip())
# ----------------------------计算TF词频-------------------------
vectorizer = CountVectorizer() #将文本中的词语转换为词频矩阵
X = vectorizer.fit_transform(corpus) #计算个词语出现的次数 # ----------------------------计算TF-IDF值----------------------
transformer = TfidfTransformer()
print(transformer)
tfidf = transformer.fit_transform(X) #将词频矩阵X统计成TF-IDF值
#查看数据结构
print(tfidf.toarray()) #tfidf[i][j]表示i类文本中的tf-idf权重
输出:
TF-IDF值采用矩阵数组的形式存储,每一行数据代表一个文本语料,每一行的每一列都代表其中一个特征对应的权重
TF-IDF矩阵是进行聚类分析、LDA主题分布等等的基础。
六、文本聚类
使用TF-IDF值实现文本聚类的主要步骤:
- 第一步,对中文分词和数据清洗后的语料进行词频矩阵生成操作。主要调用CountVectorizer类计算词频矩阵,生成的矩阵为X。
- 第二步,调用TfidfTransformer类计算词频矩阵X的TF-IDF值,得到Weight权重矩阵。
重点:
- 第三步,调用Sklearn机器学习包的KMeans类执行聚类操作,设置的类簇数n_clusters为3,对应语料贵州、数据分析和爱情的三个主题。然后调用fit()函数训练,并将预测的类标赋值给y_pred数组。
- 第四步,调用Sklearn库PCA()函数进行降维操作。由于TF-IDF是多维数组,是9行文本所有特征对应的权重,而在绘图之前需要将这些特征降低为二维,对应X和Y轴。
- 第五步,调用Matplotlib函数进行可视化操作,绘制聚类图形,并设置图形参数、标题、坐标轴内容等。
案例:
# coding:utf-8
#By:Eastmount CSDN
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer #第一步 生成词频矩阵
corpus = []
for line in open('result.txt', 'r', encoding="utf-8").readlines(): corpus.append(line.strip())
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus) #第二步 计算TF-IDF值
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weight = tfidf.toarray()#第三步 KMeans聚类
from sklearn.cluster import KMeans
clf = KMeans(n_clusters=3)
s = clf.fit(weight)
y_pred = clf.fit_predict(weight)
print(clf)
print(clf.cluster_centers_) #类簇中心
print(clf.inertia_) #距离:用来评估簇的个数是否合适 越小说明簇分的越好
print(y_pred) #预测类标#第四步 降维处理
from sklearn.decomposition import PCA
pca = PCA(n_components=2) #降低成两维绘图
newData = pca.fit_transform(weight)
print(newData)
x = [n[0] for n in newData]
y = [n[1] for n in newData] #第五步 可视化
import numpy as np
import matplotlib.pyplot as plt
plt.scatter(x, y, c=y_pred, s=100, marker='s')
plt.title("Kmeans")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
clf.fit_predict()获取聚类的类别结果
聚类输出:
将TFIDF的多维度矩阵降维度至两维,让x,y分别取得其中一个维度
降维输出:
用降维度的xy作为xy轴的坐标,将预测的列表作为颜色映射,可视化输出:
完结撒花!!!