-
2018-07-25 10:48:41
使用scikit-learn进行KMeans文本聚类
K-Means算法:中文名字叫做K-均值算法,算法的目的是将n个向量分别归属到K个中心点里面去。算法首先会随机选择K个中心向量,然后通过迭代计算以及重新选择K个中心向量,使得n个向量各自被分配到距离最近的K中心点,并且所有向量距离各自中心点的和最小。
步骤一:在输入数据集里面随机选择k个向量作为初始中心点。
步骤二:将每个向量分配到离各自最近的中心点,从而将数据集分成了K个类。
步骤三:计算得到上步得到聚类中每一聚类观测值的中心,作为新的均值点。
步骤四:重复步骤三,直至结果收敛,这里的收敛是指所有点到各自中心点的距离的和收敛。K-Means算法的原理比较简单,但是值得注意的是,有两个地方是需要算法使用者去自己选择的:第一个就是K的值,简而言之就是数据集应该被分成多少个类,在K-Means算法里面是要求先给出K值的; 第二个就是距离函数,即如何计算向量和向量或者向量和中心点之间的距离,这里也有很多选择,最常见的自然是欧式距离,也可以用余弦相似度来作为距离函数,还有其他的一些方法等等。以上两个需要注意的选择必然会对聚类结果产生影响,尤其是K值的选择,这里就需要算法使用者根据自身需要来做出仔细衡量。
scikit-learn
scikit-learn 是一个基于Python的Machine Learning模块,里面给出了很多Machine Learning相关的算法实现,其中就包括K-Means算法。
在做K-Means聚类之前,我们首先需要对将文本转化成向量的形式,转换文本的第一步,自然是分词,这里可以直接使用jieba分词,分完词过后再将词转换成向量,或者说转换成Bag-of-words模型,这里可以采用TF-IDF算法,TF-IDF就是从两个方面对文本中的词进行加权:
- 词在当前文本中出现的次数。
- 总文本数包含词的数目。
前者越高越好,后者越低越好,比如说「你」,「我」这些词,在一个文本中出现的次数很多,总文本包含这些词的数目也会很多,那么这些词自然无法作为当前文本的代表性内容,如果一个文本中某个词大量出现,但是在总文本中出现的次数又不多,那么这个词对于文本来说很有可能是很重要的。
在scikit-learn里面,同样也实现了TF-IDF算法,我们可以直接调用。
#!/usr/bin/env python # -*- coding: utf-8 -*- import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans from sklearn.externals import joblib def jieba_tokenize(text): return jieba.lcut(text) tfidf_vectorizer = TfidfVectorizer(tokenizer=jieba_tokenize,lowercase=False) ''' tokenizer: 指定分词函数 lowercase: 在分词之前将所有的文本转换成小写,因为涉及到中文文本处理, 所以最好是False ''' text_list = ["今天天气真好啊啊啊啊", "小明上了清华大学", "我今天拿到了Google的Offer", "清华大学在自然语言处理方面真厉害"] #需要进行聚类的文本集 tfidf_matrix = tfidf_vectorizer.fit_transform(text_list) num_clusters = 3 km_cluster = KMeans(n_clusters=num_clusters, max_iter=300, n_init=40, init='k-means++',n_jobs=-1) ''' n_clusters: 指定K的值 max_iter: 对于单次初始值计算的最大迭代次数 n_init: 重新选择初始值的次数 init: 制定初始值选择的算法 n_jobs: 进程个数,为-1的时候是指默认跑满CPU 注意,这个对于单个初始值的计算始终只会使用单进程计算, 并行计算只是针对与不同初始值的计算。比如n_init=10,n_jobs=40, 服务器上面有20个CPU可以开40个进程,最终只会开10个进程 ''' #返回各自文本的所被分配到的类索引 result = km_cluster.fit_predict(tfidf_matrix) print ("Predicting result: ", result) ''' 每一次fit都是对数据进行拟合操作, 所以我们可以直接选择将拟合结果持久化, 然后预测的时候直接加载,进而节省时间。 ''' joblib.dump(tfidf_vectorizer, 'tfidf_fit_result.pkl') joblib.dump(km_cluster, 'km_cluster_fit_result.pkl') #程序下一次则可以直接load tfidf_vectorizer = joblib.load('tfidf_fit_result.pkl') km_cluster = joblib.load('km_cluster_fit_result.pkl')
更多相关内容 -
[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像源码
2016-01-20 05:07:01[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像 http://blog.csdn.net/eastmount/article/details/50545937 包括输入文档txt,共1000行数据,每行都是分词完的文本。 本文主要讲述以下几点: 1.通过... -
Kmeans文本聚类java实现
2015-02-17 10:20:03java实现的文本聚类使用了kmeans算法 -
Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像
2022-05-06 11:57:00[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像 http://blog.csdn.net/eastmount/article/details/50545937 包括输入文档txt,共1000行数据,每行都是分词完的文本。 本文主要讲述以下几点: 1.通过... -
【项目实战】Python基于KMeans算法进行文本聚类项目实战
2022-02-14 23:20:14资料说明:包括数据+代码+文档+代码讲解。 1.项目背景 2.数据获取 3.数据预处理 4.探索性数据分析 5.特征工程 6.构建聚类模型 7.结论与展望 -
tf-idf kmeans文本聚类
2021-11-09 19:23:44文本聚类 数据集 THUnews中文新闻文本分类 方法 jieba分词后,使用tf-idf提取特征,提取时使用停用词表删除停用词,最后使用kmeans进行聚类。 优化 优化停用词表,增加max_feature特征,使用minibatchkmeans增加聚类...文本聚类
数据集 THUnews中文新闻文本分类
方法 jieba分词后,使用tf-idf提取特征,提取时使用停用词表删除停用词,最后使用kmeans进行聚类。
优化 优化停用词表,增加max_feature特征,使用minibatchkmeans增加聚类速度
评价标准 外在(已知标签) 兰德基数RI ,调整兰德基数 ARI
内在 轮廓系数from sklearn.feature_extraction.text import TfidfVectorizer import paddlenlp from sklearn.cluster import KMeans import jieba
读取数据,数据集为THUnews新闻文本分类数据,使用jieba分词
with open('data/data12701/Train.txt','r',encoding='utf-8') as f: content=f.readlines() data=[] label=[] for i in content: t=i.split('\t') t[2]=(" ").join( [w for w in jieba.cut(t[2])] ) data.append(t[2]) label.append(t[1]) print(label[:5]) print(len(label))
Building prefix dict from the default dictionary ... Dumping model to file cache /tmp/jieba.cache Loading model cost 0.851 seconds. Prefix dict has been built successfully. ['财经', '财经', '财经', '财经', '财经'] 752476
划分数据集,由于数据过多,测试集增加划分,并乱序
from sklearn.model_selection import train_test_split train_data,test_data,train_label,test_label=train_test_split(data,label,test_size=0.9,shuffle=True) print(len(train_data)) print(train_label[:5])
75247 ['科技', '股票', '时尚', '体育', '社会']
读取停用词表,在tf-idf提取特征时,选择能表示文本主题的词语作为特征
with open('data/cn_stop.txt','r',encoding='utf-8') as f: stopwords=f.readlines()
tf_idf=TfidfVectorizer(max_features=20000,stop_words=stopwords) tf=tf_idf.fit_transform(data) print(tf.shape)
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/feature_extraction/text.py:391: UserWarning: Your stop_words may be inconsistent with your preprocessing. Tokenizing the stop words generated tokens ['exp', 'lex', 'sub', 'sup', '①①', '①②', '①③', '①④', '①⑤', '①⑥', '①⑦', '①⑧', '①⑨', '①a', '①b', '①c', '①d', '①e', '①f', '①g', '①h', '①i', '①o', '②①', '②②', '②③', '②④', '②⑤', '②⑥', '②⑦', '②⑧', '②⑩', '②a', '②b', '②c', '②d', '②e', '②f', '②g', '②h', '②i', '②j', '③①', '③⑩', '③a', '③b', '③c', '③d', '③e', '③f', '③g', '③h', '④a', '④b', '④c', '④d', '④e', '⑤a', '⑤b', '⑤d', '⑤e', '⑤f', '一一', '一下', '一个', '一些', '一何', '一切', '一则', '一则通过', '一天', '一定', '一方面', '一旦', '一时', '一来', '一样', '一次', '一片', '一番', '一直', '一致', '一般', '一起', '一转眼', '一边', '一面', '万一', '三天两头', '三番两次', '三番五次', '上下', '上升', '上去', '上来', '上述', '上面', '下列', '下去', '下来', '下面', '不一', '不下', '不久', '不了', '不亦乐乎', '不仅', '不仅仅', '不仅仅是', '不会', '不但', '不光', '不免', '不再', '不力', '不单', '不变', '不只', '不可', '不可开交', '不可抗拒', '不同', '不外', '不外乎', '不够', '不大', '不如', '不妨', '不定', '不对', '不少', '不尽', '不尽然', '不巧', '不已', '不常', '不得', '不得不', '不得了', '不得已', '不必', '不怎么', '不怕', '不惟', '不成', '不拘', '不择手段', '不敢', '不料', '不断', '不日', '不时', '不是', '不曾', '不止', '不止一次', '不比', '不消', '不满', '不然', '不然的话', '不特', '不独', '不由得', '不知不觉', '不管', '不管怎样', '不经意', '不胜', '不能', '不能不', '不至于', '不若', '不要', '不论', '不起', '不足', '不过', '不迭', '不问', '不限', '与其', '与其说', '与否', '与此同时', '专门', '且不说', '且说', '两者', '严格', '严重', '个人', '个别', '中小', '中间', '丰富', '串行', '临到', '为主', '为了', '为什么', '为什麽', '为何', '为止', '为此', '为着', '主张', '主要', '举凡', '举行', '乃至', '乃至于', '之一', '之前', '之后', '之後', '之所以', '之类', '乌乎', '乘势', '乘机', '乘胜', '乘虚', '乘隙', '也好', '也就是说', '也是', '也罢', '了解', '争取', '二来', '二话不说', '二话没说', '于是', '于是乎', '云云', '云尔', '互相', '交口', '产生', '亲口', '亲手', '亲眼', '亲自', '亲身', '人人', '人们', '人家', '人民', '什么', '什么样', '什麽', '仅仅', '今后', '今天', '今年', '今後', '介于', '仍旧', '仍然', '从不', '从严', '从中', '从事', '从今以后', '从优', '从古到今', '从古至今', '从头', '从宽', '从小', '从新', '从无到有', '从早到晚', '从未', '从来', '从此', '从此以后', '从而', '从轻', '从速', '从重', '他人', '他们', '他是', '他的', '代替', '以上', '以下', '以为', '以便', '以免', '以前', '以及', '以后', '以外', '以後', '以故', '以期', '以来', '以至', '以至于', '以致', '任何', '任凭', '任务', '企图', '伙同', '伟大', '传说', '传闻', '似乎', '似的', '但凡', '但愿', '但是', '何乐而不为', '何以', '何况', '何处', '何妨', '何尝', '何必', '何时', '何止', '何苦', '何须', '余外', '作为', '你们', '你是', '你的', '使得', '使用', '例如', '依据', '依照', '依靠', '便于', '促进', '保持', '保管', '保险', '俺们', '倍加', '倍感', '倒不如', '倒不如说', '倒是', '倘使', '倘或', '倘然', '倘若', '借以', '借此', '假使', '假如', '假若', '偏偏', '做到', '偶尔', '偶而', '傥然', '允许', '充其极', '充其量', '充分', '先不先', '先后', '先後', '先生', '光是', '全体', '全力', '全年', '全然', '全身心', '全部', '全都', '全面', '八成', '公然', '共同', '共总', '关于', '其一', '其中', '其二', '其他', '其余', '其后', '其它', '其实', '其次', '具体', '具体地说', '具体来说', '具体说来', '具有', '兼之', '再其次', '再则', '再有', '再次', '再者', '再者说', '再说', '决不', '决定', '决非', '况且', '准备', '凑巧', '凝神', '几乎', '几度', '几时', '几番', '几经', '凡是', '凭借', '出于', '出去', '出来', '出现', '分别', '分头', '分期', '分期分批', '切不可', '切切', '切勿', '切莫', '则甚', '刚好', '刚巧', '刚才', '别人', '别处', '别是', '别的', '别管', '别说', '到了儿', '到处', '到头', '到头来', '到底', '到目前为止', '前后', '前此', '前者', '前进', '前面', '加上', '加之', '加以', '加入', '加强', '动不动', '动辄', '勃然', '匆匆', '十分', '千万', '千万千万', '单单', '单纯', '即令', '即使', '即便', '即刻', '即如', '即将', '即或', '即是说', '即若', '却不', '原来', '又及', '及其', '及时', '及至', '双方', '反之', '反之亦然', '反之则', '反倒', '反倒是', '反应', '反手', '反映', '反而', '反过来', '反过来说', '取得', '取道', '受到', '变成', '古来', '另一个', '另一方面', '另外', '另悉', '另方面', '另行', '只当', '只怕', '只是', '只有', '只消', '只要', '只限', '叫做', '召开', '叮咚', '叮当', '可以', '可好', '可是', '可能', '可见', '各个', '各人', '各位', '各地', '各式', '各种', '各级', '各自', '合理', '同一', '同时', '同样', '后来', '后者', '后面', '向使', '向着', '否则', '吧哒', '呆呆地', '呜呼', '周围', '呵呵', '呼哧', '呼啦', '咱们', '哈哈', '哎呀', '哎哟', '哗啦', '哪个', '哪些', '哪儿', '哪天', '哪年', '哪怕', '哪样', '哪边', '哪里', '哼唷', '唯有', '啊呀', '啊哈', '啊哟', '啪达', '啷当', '喔唷', '嗡嗡', '嘎嘎', '嘎登', '嘿嘿', '因为', '因了', '因此', '因着', '因而', '固然', '在下', '在于', '坚决', '坚持', '基于', '基本', '基本上', '处在', '处处', '处理', '复杂', '多么', '多亏', '多多', '多多少少', '多多益善', '多少', '多年前', '多年来', '多数', '多次', '够瞧的', '大不了', '大举', '大事', '大体', '大体上', '大凡', '大力', '大多', '大多数', '大大', '大家', '大张旗鼓', '大批', '大抵', '大概', '大略', '大约', '大致', '大都', '大量', '大面儿上', '失去', '奋勇', '她们', '她是', '她的', '好在', '好的', '好象', '如上', '如上所述', '如下', '如今', '如何', '如其', '如前所述', '如同', '如常', '如是', '如期', '如果', '如次', '如此', '如此等等', '如若', '始而', '姑且', '存在', '存心', '孰料', '孰知', '宁可', '宁愿', '宁肯', '它们', '它们的', '它是', '它的', '安全', '完全', '完成', '实现', '实际', '宣布', '容易', '密切', '对于', '对应', '对待', '对方', '对比', '将才', '将要', '将近', '少数', '尔后', '尔尔', '尔等', '尚且', '尤其', '就地', '就是', '就是了', '就是说', '就此', '就算', '就要', '尽可能', '尽如人意', '尽心尽力', '尽心竭力', '尽快', '尽早', '尽然', '尽管', '尽管如此', '尽量', '局外', '居然', '届时', '属于', '屡屡', '屡次', '屡次三番', '岂但', '岂止', '岂非', '川流不息', '左右', '巨大', '巩固', '差一点', '差不多', '已矣', '已经', '巴巴', '帮助', '常常', '常言说', '常言说得好', '常言道', '平素', '年复一年', '并不', '并不是', '并且', '并排', '并无', '并没', '并没有', '并肩', '并非', '广大', '广泛', '应当', '应用', '应该', '庶乎', '庶几', '开外', '开始', '开展', '引起', '弹指之间', '强烈', '强调', '归根到底', '归根结底', '归齐', '当下', '当中', '当儿', '当前', '当即', '当口儿', '当地', '当场', '当头', '当庭', '当时', '当然', '当真', '当着', '形成', '彻夜', '彻底', '彼时', '彼此', '往往', '待到', '很多', '很少', '後来', '後面', '得了', '得出', '得到', '得天独厚', '得起', '心里', '必定', '必将', '必然', '必要', '必须', '快要', '忽地', '忽然', '怎么', '怎么办', '怎么样', '怎奈', '怎样', '怎麽', '急匆匆', '怪不得', '总之', '总是', '总的来看', '总的来说', '总的说来', '总结', '总而言之', '恍然', '恐怕', '恰似', '恰好', '恰如', '恰巧', '恰恰', '恰恰相反', '恰逢', '您们', '您是', '惟其', '惯常', '意思', '愤然', '愿意', '慢说', '成为', '成年', '成年累月', '成心', '我们', '我是', '我的', '或则', '或多或少', '或是', '或曰', '或者', '或许', '战斗', '截然', '截至', '所以', '所在', '所幸', '所有', '所谓', '才能', '扑通', '打从', '打开天窗说亮话', '扩大', '抑或', '抽冷子', '拦腰', '按时', '按期', '按照', '按理', '按说', '挨个', '挨家挨户', '挨次', '挨着', '挨门挨户', '挨门逐户', '换句话说', '换言之', '据实', '据悉', '据我所知', '据此', '据称', '据说', '掌握', '接下来', '接着', '接著', '接连不断', '放量', '故意', '故此', '故而', '敞开儿', '敢于', '敢情', '整个', '断然', '方便', '方才', '方能', '方面', '旁人', '无宁', '无法', '无论', '既往', '既是', '既然', '日复一日', '日渐', '日益', '日臻', '日见', '时候', '昂然', '明显', '明确', '是不是', '是以', '是否', '是的', '显然', '显著', '普通', '普遍', '暗中', '暗地里', '暗自', '更为', '更加', '更进一步', '曾经', '替代', '最后', '最大', '最好', '最後', '最近', '最高', '有些', '有关', '有利', '有力', '有及', '有所', '有效', '有时', '有点', '有的', '有的是', '有着', '有著', '朝着', '本人', '本地', '本着', '本身', '权时', '来不及', '来得及', '来看', '来着', '来自', '来讲', '来说', '极为', '极了', '极其', '极力', '极大', '极度', '极端', '构成', '果然', '果真', '某个', '某些', '某某', '根据', '根本', '格外', '次第', '欢迎', '正值', '正在', '正如', '正巧', '正常', '正是', '此中', '此后', '此地', '此处', '此外', '此时', '此次', '此间', '毋宁', '每个', '每天', '每年', '每当', '每时每刻', '每每', '每逢', '比及', '比如', '比如说', '比方', '比照', '比起', '比较', '毕竟', '毫不', '毫无', '毫无例外', '毫无保留地', '沙沙', '没奈何', '没有', '沿着', '注意', '深入', '清楚', '满足', '漫说', '然则', '然后', '然後', '然而', '照着', '牢牢', '特别是', '特殊', '特点', '犹且', '犹自', '独自', '猛然', '猛然间', '率尔', '率然', '现代', '现在', '理应', '理当', '理该', '瑟瑟', '甚且', '甚么', '甚或', '甚而', '甚至', '甚至于', '用来', '由于', '由是', '由此', '由此可见', '略为', '略加', '略微', '白白', '的确', '的话', '皆可', '目前', '直到', '直接', '相似', '相信', '相反', '相同', '相对', '相对而言', '相应', '相当', '相等', '省得', '看上去', '看出', '看到', '看来', '看样子', '看看', '看见', '看起来', '真是', '真正', '眨眼', '着呢', '矣乎', '矣哉', '知道', '确定', '碰巧', '社会主义', '积极', '移动', '究竟', '穷年累月', '突出', '突然', '立刻', '立即', '立地', '立时', '立马', '竟然', '竟而', '第二', '等到', '等等', '策略地', '简直', '简而言之', '简言之', '类如', '精光', '紧接着', '累年', '累次', '纯粹', '纵令', '纵使', '纵然', '练习', '组成', '经常', '经过', '结合', '结果', '绝不', '绝对', '绝非', '绝顶', '继之', '继后', '继续', '继而', '维持', '综上所述', '缕缕', '罢了', '老大', '老是', '老老实实', '考虑', '而且', '而况', '而又', '而后', '而外', '而已', '而是', '而言', '而论', '联系', '联袂', '背地里', '背靠背', '能否', '能够', '自个儿', '自从', '自各儿', '自后', '自家', '自己', '自打', '自身', '至于', '至今', '至若', '般的', '良好', '若夫', '若是', '若果', '若非', '范围', '莫不', '莫不然', '莫如', '莫若', '莫非', '获得', '藉以', '虽则', '虽然', '虽说', '行为', '行动', '表明', '表示', '要不', '要不是', '要不然', '要么', '要是', '要求', '规定', '觉得', '譬喻', '譬如', '认为', '认真', '认识', '许多', '论说', '设使', '设或', '设若', '诚如', '诚然', '话说', '该当', '说明', '说来', '说说', '请勿', '诸位', '诸如', '谁人', '谁料', '谁知', '豁然', '贼死', '赖以', '赶快', '赶早不赶晚', '起先', '起初', '起头', '起来', '起见', '起首', '趁便', '趁势', '趁早', '趁机', '趁热', '趁着', '越是', '路经', '转动', '转变', '转贴', '轰然', '较为', '较之', '较比', '达到', '达旦', '迅速', '过于', '过去', '过来', '运用', '近几年来', '近年来', '近来', '还是', '还有', '还要', '这一来', '这个', '这么', '这么些', '这么样', '这么点儿', '这些', '这会儿', '这儿', '这就是说', '这时', '这样', '这次', '这点', '这种', '这般', '这边', '这里', '这麽', '进入', '进去', '进来', '进步', '进而', '进行', '连同', '连声', '连日', '连日来', '连袂', '连连', '迟早', '迫于', '适应', '适当', '适用', '逐步', '逐渐', '通常', '通过', '造成', '遇到', '遭到', '遵循', '遵照', '避免', '那个', '那么', '那么些', '那么样', '那些', '那会儿', '那儿', '那时', '那末', '那样', '那般', '那边', '那里', '那麽', '部分', '鄙人', '采取', '里面', '重大', '重新', '重要', '鉴于', '针对', '长期以来', '长此下去', '长线', '长话短说', '问题', '间或', '防止', '附近', '陈年', '限制', '陡然', '除了', '除却', '除去', '除外', '除开', '除此', '除此之外', '除此以外', '除此而外', '除非', '随后', '随时', '随着', '随著', '隔夜', '隔日', '难得', '难怪', '难说', '难道', '难道说', '集中', '需要', '非但', '非常', '非徒', '非得', '非特', '非独', '顶多', '顷刻', '顷刻之间', '顷刻间', '顺着', '顿时', '风雨无阻', '首先', '马上', '高低', '高兴', '默然', '默默地', '12', 'li', 'ng昉', 'zxfitl'] not in stop_words. 'stop_words.' % sorted(inconsistent)) (752476, 20000)
test=tf_idf.transform(test_data)
为了增加聚类速度,使用minibatchkmeans,由于sklearn用于实验,如果向工业应用,进一步提高速度,可使用elkan K-Means,两边之和大于第三边减少计算距离运算。
from sklearn.cluster import MiniBatchKMeans k=MiniBatchKMeans( init='k-means++', batch_size=10, n_clusters=10) result=k.fit(test) pre=result.labels_
print(len(pre)) print(len(test_label))
677229 677229
聚类效果评价标准 :纯度,RI兰德基数,ARI调整兰德基数
from sklearn.metrics import adjusted_rand_score,rand_score ari_score=adjusted_rand_score(test_label,pre) ri_score=rand_score(test_label,pre) print(ari_score) print(ri_score)
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/metrics/cluster/_supervised.py:389: RuntimeWarning: overflow encountered in long_scalars return 2. * (tp * tn - fn * fp) / ((tp + fn) * (fn + tn) + /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/metrics/cluster/_supervised.py:390: RuntimeWarning: overflow encountered in long_scalars (tp + fp) * (fp + tn)) -1.8037125749433274 0.4364017709049443
无监督聚类评价标准 silhouete_score 轮廓系数,由于计算过慢,没有增加
-
kmeans聚类算法_Kmeans_聚类分析_无监督学习_聚类算法
2021-09-10 17:05:16kmeans聚类分析,无监督学习实现Matlab代码 -
python3 基于Kmeans 文本聚类
2019-01-03 22:13:10聚类(K值,聚类中心,本节涉及的Kmeans方法中心暂时是随机生成,后面会有更新) 第一部分内容,本人暂不祥说,核心的内容,大概如下把 for line in file.readlines(): words = jieba.cut(line) for word in ...聚类常规方法,分一下几步:
- 文本处理,切词、去停用词,文档向量
- 聚类(K值,聚类中心,本节涉及的Kmeans方法中心暂时是随机生成,后面会有更新)
第一部分内容,本人暂不祥说,核心的内容,大概如下把
for line in file.readlines(): words = jieba.cut(line) for word in words: # print(word) if word not in stopword: output.write(word + " ")
接下来是将上述处理过的文档,进行向量化,此处,我选择的是doc2vec,即是document to vector,文档到向量,这个内容涉及内容也比较多,原理也可以不用了解的那么深,会用就可以了,也没有什么关系,
# doc2vec #训练并保存模型 def open_file(): corpus = [] token_path = "res_title_news.txt" try: with open(token_path, 'r', encoding="utf-8") as t: for line in t.readlines(): corpus.append(line.strip()) import gensim sentences = gensim.models.doc2vec.TaggedLineDocument(token_path) model = gensim.models.Doc2Vec(sentences, dm=1, size=200, window=10) model.train(sentences, total_examples=model.corpus_count, epochs=100) model.save('res_title_news_w2c.txt') out = open('res_title_news_vector.txt', 'w') for idx, docvec in enumerate(model.docvecs): for value in docvec: out.write(str(value) + ' ') out.write('\n') except Exception as e: print(e) open_file()
上面包含模型的训练与保存,会把当中文档向量的部分,放入到res_title_news_vector.txt中,打开这个文本文件之后,你会看到每一篇文档被训练成了200维度的向量。
那么模型训练好之后,接下来的是就是使用模型训练的向量,来完成Kmeans聚类,那么这个聚类是怎么做的尼?
import gensim from gensim.models.doc2vec import Doc2Vec, LabeledSentence def test_km(): model = gensim.models.Doc2Vec.load("res_title_news_vector.txt")#加载模型 from sklearn.cluster import KMeans for k in range(5,20): clf = KMeans(n_clusters=k, n_init=20, init='k-means++', n_jobs=4)#n_init选择质心的次数,返回最好的结果 s = clf.fit(model.docvecs) # 20个中心点位置 # print(clf.cluster_centers_) # 每个样本所属的簇, print(clf.labels_) i = 1 while i <= len(clf.labels_): # print(i, clf.labels_[i - 1]) i = i + 1 # 每个点,到簇类中心的距离之和,用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数 print(clf.inertia_) test_km()
这里我进行了多次K值的设定,想重上述的结果中,找到最好的结果。
结果表明当K=12时,效果较好。这个值是根据clf.inertia_(即簇内平方和SSE,每一个样本点到簇中心的距离之和)来确定,即手肘法(此部分,来自实验室成员所写:手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。当然,这也是该方法被称为手肘法的原因。)
[ 3 8 13 13 11 6 13 0 0 5 3 1 5 13 6 0 0 12 4 15 12 6 1 9 7 8 8 6 7 12 4 11 11 4 3 15 0 0 5 3 5 4 12 1 4 12 11 10 12 13 12 4 15 4 4 8 11 0 0 5 3 6 11 11 4 4 13 11 13 0 4 10 4 2 2 3 3 13 4 4 2 15 12 12 15 9 13 8 3 0 12 6 3 2 0 15 11 2 12 15 2 8 15 15 15 13 4 10 4 3 3 2 14 12 13 12 4 13 5 5 4 14 3 1 12 4 1 4 2 3 11 13 2 4 12 6 6 1 1 2 6 11 12 13 13 2 15 11 9 11 11 15 5 1 15 15 12 15 12 13 15 11 15 11 11 3 15 11 12 15 11 15 5 15 15 15 15 15 15 11 15 15 5 15 15 15 15 1 15 14 14 14 14 14 14 14 14 14 14 14 14 14 14 13 14 0 14 6 14 14 6 8 7 6 6 0 14 7 8 6 7 0 14 4 6 7 0 7 7 6 8 6 3 3 0 2 2 8 8 3 3 6 0 6 0]
得到上述聚类结果后,依然看不出到底聚类效果怎么样,是否把同一主题的文本聚成一类,那么为了方便分析聚类结果,我们将文本所属簇与文本内容,一起展示出来,一探究竟,看看具体属于哪一类?
我们将此拼接成一个【K, text】形式,K即是文本所属的簇,text即是文本;
我们借用以下方法,此处是我测试的一个文本量很小的例子:输出结果是从小到大进行排序的,根据K值进行排序;
import numpy as np x=np.array([1,0,0,2,2,0]) file = open('cute.txt','r', encoding='utf-8') data = file.readlines()#同样是一个列表 # print(data[3]) index = x.argsort()#根据指针对x排序,[1,2,5,0,3,4] print(index) for i in range(len(index)): print(x[index[i]], data[index[i]])
前面的整数是聚类的结果,后面是对应的文本,这样便于获取当前聚类的主题。
当我们获取到每一个簇中的文本,我们可以根据NLP技术,分析每一个簇的主题,或者是根据TFIDF方法,获取每个簇的关键词,根据关键词,进行主题的呈现。
下一章,我将继续写初始化质心的内容,如何设定Kmeans的初始化质心,以提升聚类效果和聚类性能!
-
Kmeans文本聚类
2021-05-21 07:00:591、数据准备:文本按行存储,分词以空格分割;2、embedding:使用word2vec计算每个词组的embedding;./word2vec -train src.txt -output dst.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -...1、数据准备:
文本按行存储,分词以空格分割;
2、embedding:
使用word2vec计算每个词组的embedding;
./word2vec -train src.txt -output dst.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 2 -binary 0
./word2vec -train src.txt -output dst.vec -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 2 -binary 1
3、IDF计算:
TF-IDF = 词频(TF) x 逆向文档频率(IDF)
4、样本归一:
计算文章标题向量所有元素之和;
文章标题向量每个元素除以向量和;
结果写入新建文章标题向量;
5、构建样本:
计算每个单词(汉字)归一值与相似度TOP(n)的乘积,生成n个元素的向量;
将每个单词(汉字)的向量元素逐一相加求和,生成该文章标题对应的向量;
6、训练模型:
def do_texts_kmeans(data):
'''训练Kmeans模型'''
kmeans = KMeans(n_clusters=zyb_cluster, max_iter=zyb_maxiter)
kmeans.fit(data)
return kmeans
7、保存模型:
def do_kmeans_model(kmeans):
'''保存Kmeans模型'''
pickle.dump(kmeans, open(file, "wb"))
8、模型预测:
def do_texts_predict(data):
'''预测Kmeans模型'''
kmeans = pickle.load(open(file, "rb"))
return [kmeans.predict([line]) for line in data]
9、主体流程:
构建分词矩阵 -> 计算单词词频 -> 构建分词字典 -> 构建文档向量 -> 生成TFIDF结果 -> 生成归一化结果 -> 构建训练数据 -> 生成Kmeans模型 -> 输出Kmeans模型
-
Kmeans聚类 样本+可视化源码
2022-04-19 11:18:21通过Kmeans的方法对故障类型进行一个简单的聚类,由于不确定数据可以划分的组数,利用Calinski-Harabasz指数判断数据的最佳分类组数,并对最终的结果进行简单的可视化 -
kmeans 文本聚类方法简介
2018-02-09 18:36:34k-均值算法是一个很常见的算法,它的基本思想是:通过迭代寻找k个聚类的一个划分方案,使得用这K个聚类的均值来代表相应各个样本时所得的总体误差最小。 算法步骤: 1.生成索引文件 将分类的文本以句子id 句子... -
sklearn之kmeans文本聚类主题输出
2018-12-31 14:49:34from sklearn import feature_extraction from sklearn.feature_extraction.text import TfidfTransformer from sklearn.feature_extraction.text import ...from sklearn.cluster import KMeans corpu... -
Spark-KMeans文本聚类
2016-01-07 11:30:28文本聚类可以用于生成一篇简明扼要的摘要文档;对搜索引擎返回的结果进行聚类,使用户迅速定位到所需要的信息;对用户感兴趣的文档(如用户浏览器 cache 中的网页)聚类,从而发现用户的兴趣模式并用于 信息过滤 和... -
[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像
2016-01-20 04:55:06本文主要讲述以下几点: 1.通过scikit-learn计算文本内容的tfidf并构造N*M...调用scikit-learn中的K-means进行文本聚类; 3.使用PAC进行降维处理,每行文本表示成两维数据; 4.最后调用Matplotlib显示聚类效果图。 -
K-Means文本聚类python实现
2018-12-17 17:32:26对文本进行聚类,文本预处理-->构造特征向量-->聚类,压缩包内含有实验用语料亲测可用, 谢谢支持。 -
使用Spark+Hanlp进行简单的文本处理(中)-Kmeans文本聚类
2019-11-07 14:44:09文本聚类 1. TFIDF TFIDF全程叫做term frequency–inverse document frequency,即文本频率与逆文档频率指数, TFIDF就是为了表征一个token的重要程度,如果这个token出现的频数很高,出现的频数这个因素就叫做TF,... -
使用kmeans进行文本聚类
2021-03-23 11:36:05直接上代码 # -*- coding: utf-8 -*- import jieba from sklearn.feature_extraction.text import CountVectorizer ...from sklearn.cluster import KMeans from sklearn.decomposition import PCA,KernelPCA import -
【机器学习】KMeans算法聚类分析可视化
2022-03-30 16:31:02利用K-means算法实现聚类分析可视化 -
机器学习算法Python实现:kmeans文本聚类
2018-08-26 19:02:23# -*- coding:utf-8 -* #本代码是在jupyter notebook上实现,...#本脚本主要实现了基于python通过kmeans做的文本聚类的项目目的 #导入相关包 import numpy as np import pandas as pd import re import os import c... -
文本聚类(二)—— KMeans 聚类
2020-10-13 15:07:22目录二、KMeans 聚类2.1 加载数据集2.2 数据清洗2.3 文本向量化2.4 文本聚类2.5 关键词展示2.6 判定最佳聚类数参考文档 这第一篇内容中,我们介绍了 LDA 主题模型,这一篇,我们将介绍经典的 KMeans 聚类算法在文本... -
Kmeans 文本聚类
2013-11-25 22:26:53https://github.com/shenguojun/hadoop/blob/master/WebKmeans/src/edu/sysu/shen/hadoop/Kmeans.java Canopy算法 http://blog.csdn.net/july_2/article/details/8905502 -
文本聚类分析算法_读书笔记(8)kmeans聚类算法及应用
2020-11-20 18:11:401、问题导入假如有这样一种情况,在一天你想去某个城市旅游,这个城市里你想去的有70个地方,现在你只有每一个地方的地址,这个地址列表很长,有70个位置。事先肯定要做好攻略,...而本文所提供的k-means聚类分析方... -
-
文本聚类kmeans
2021-02-20 16:56:12最近做一些文本挖掘的项目,其中用到了文本聚类相关算法,比如kmeans. 就kmeans算法做一些简单记录. Kmeans是一种非常常见的聚类算法, 算法的核心思想非常简单. 1.给定K个类别,选取K个中心点 2.对于任意其他数据,... -
【python数据挖掘课程】二十四.KMeans文本聚类分析互动百科语料
2018-07-06 10:19:58本文主要讲述文本聚类相关知识,包括中文分词、数据清洗、特征提取、TF-IDF、KMeans聚类等步骤。 本篇文章为基础性文章,希望对你有所帮助,提供些思路,也是自己教学的内容。如果文章中存在错误或不足之处,还请... -
python 文本聚类分析案例——从若干文本中聚类出一些主题词团
2021-01-20 02:57:30python 文本聚类分析案例说明摘要1、结巴分词2、去除停用词3、生成tfidf矩阵4、K-means聚类5、获取主题词 / 主题词团 说明 实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。 实验思路:将数据进行预处理...