Python层次聚类

作者: JerryHouse 分类: python, 数据分析 发布时间: 2015-01-29 11:35 ė 6没有评论

Python中的机器学习包scikit-learn中提供了包括:kmeans, 谱向聚类, 层次聚类等在内的聚类算法。本文给出了一个对词向量进行层次聚类的例子。
词向量是由word2vec从某美食网站的点评中训练得到,输入是分好词语的点评,输出是词语机器相应的向量表达,该向量包含了词语的topic信息。其中”地瓜干”和“味道”对应的词向量如下:

烤地瓜干 0.023900 -0.074154 -0.053311 0.050898 0.032620 0.063152 -0.079102 0.054041 -0.101911 0.020732 0.048214 -0.016593 0.013762 -0.014438 -0.051414 -0.074174 -0.085810 -0.153488 0.105758 -0.043557 0.083636 0.026229 0.020589 -0.026654 -0.045915 0.063763 -0.013517 -0.017294 -0.012439 0.047025 -0.087127 -0.017978 -0.017018 -0.053626 -0.169687 -0.034236 0.014664 0.080652 -0.029869 0.050214 -0.023713 -0.026406 -0.044686 -0.030102 0.075677 -0.033015 0.012958 -0.064553 0.010051 0.095926 -0.008956 0.023472 0.037246 -0.065795 -0.053187 -0.108478 -0.004179 -0.049561 -0.137982 0.013325 0.055596 0.097895 0.031104 0.114254 0.004196 -0.007302 -0.042147 -0.087675 0.102078 0.017627 0.050067 -0.025007 0.056838 -0.105257 0.005928 -0.106661 0.023686 -0.019047 -0.073131 0.032436 0.017822 0.017861 0.009253 -0.020935 0.035539 0.003766 -0.163344 -0.047807 -0.065776 0.095915 0.003413 0.002848 -0.153713 0.087088 0.045115 -0.043085 -0.011435 0.009995 -0.079044 -0.106176
味道 0.061314 -0.071877 0.418790 0.338448 -0.215006 0.372335 -0.258696 0.047149 -0.117234 -0.176145 0.117426 0.156657 0.329278 -0.013200 0.066156 -0.417722 -0.215757 0.263669 -0.047234 -0.246740 -0.118109 -0.145290 -0.333562 -0.084131 -0.118488 0.242246 0.470586 0.001410 0.365399 -0.262350 0.024926 0.167383 0.007875 0.086488 -0.358154 0.175465 0.211072 0.326755 -0.193666 0.014001 -0.026221 -0.041085 -0.179887 0.093815 0.317274 0.094765 -0.177265 0.271517 -0.425649 0.074087 -0.076167 0.285998 -0.197784 0.027265 -0.074254 0.387827 -0.217748 0.264666 -0.994056 -0.299657 -0.027445 -0.379010 -0.247097 0.366343 0.203482 -0.221738 -0.127007 -0.132907 -0.264935 0.020610 -0.082322 -0.250386 0.133331 -0.059177 0.220608 0.233710 -0.220914 0.152688 0.777170 -0.027022 -0.107491 -0.221157 0.098636 -0.036595 -0.043946 0.273627 0.353052 -0.371321 -0.247508 0.076888 -0.082806 0.239997 -0.461058 0.075419 -0.296484 -0.075943 -0.379841 0.014045 0.200210 0.065614

因为词向量中包含了词语潜在的topic信息,因此我们希望通过聚类算法将相同topic信息的词语聚在一个cluster中,再以此为基础从评论中抽取出摘要信息。使用Python进行聚类的代码如下:

import numpy as np
import pandas as pd
from sklearn.cluster import AgglomerativeClustering
from sklearn.metrics import pairwise_distances

#从文件中读取词向量
path = 'data_path'
dat = pd.read_csv(path, sep=' ', header=None)

#n_clusters=50表示最终的聚类有50个
#affinity="euclidean"表示向量之间的距离是欧式距离
#linkage="ward" 表示聚类的算法的目标是最小化每个cluster内部向量距离的均方误差,此外还可以选"average"和"maximum"
model = AgglomerativeClustering(n_clusters=50, affinity="euclidean", linkage="ward")
model.fit(dat.iloc[:,1:101])
df = pd.DataFrame({'word':dat.iloc[:,0], 'cluster' : model.labels_})

#将聚类的结果写到文件中
cluster_list = list()
for key, val in df.groupby(['cluster']):
    cluster_list.append(' '.join(val.word.values))
cluster_list = pd.Series(cluster_list)
cluster_list.to_csv('result_path')

从聚类的结果中选取出一些有意思的cluster:

朋友   个人   同事   老公   生日   同学   妈妈   孩子   蜜   老婆   儿子   小伙伴   男朋友   爸爸   小孩   宝宝   小朋友   家人   好友   女儿   友       老人   女朋友   姐妹   全家   姐   一行   大人   家里人   领导   亲戚   男友   父母   小孩子   人才   奶奶   女友   婆婆   宝贝   弟弟   哥们   媳妇       友人   妞   同伴   伙伴   室友   长辈   对象   全家人   姥姥   表妹   家长   老友   公公   死党   舅舅   长假   母亲   姐夫   外公   表姐   老小   姨       老朋友   老爹   小宝宝   姨妈   表弟   姑姑   老总   师兄   大年   哥们儿   侄女   小妞   基友   闺女   嫂子   侄子   老哥   外甥   密友   姥爷   公婆       大宝   舅妈   老弟   师姐   远道   外甥女   丈母娘   班长   囡囡   姑妈   老头子   姊妹   老同事   学长   导师   少爷   岳父   师妹   姨夫   舅   哈尼       上司   盛情   妻子   的哥   小姑   妹夫   伴娘   姑父   师弟   战友   岳母   阿奴   相公   女伴   农历   爹爹   佳节   爹地   老伴   小孩儿   婶婶       爱人   闻香   弟妹   老丈人   小姨   二老   班主任   嫂嫂   弟兄   孙女   队友   小宝贝   堂妹   大姑   奖学金   老公公   堂弟   蓝盆友   亲属   亲家       结婚证   大舅   阴历   宝儿   侄儿   姨父   干爹   堂姐   小姨子   丈人   伴郎   麻麻来   人中   小姑子   阳历   表嫂   穿堂   弟媳   哥儿们   师哥   伯    母   伯父   老父亲   小舅子   父母亲   小舅   干儿子   秋秋   外孙   请帖   表姐夫   闻风   姑夫   亲眷   辅导员   金婚   远房亲戚   师母   干女儿   月>    老   家眷   娘家人   姨婆   喜帖   外孙女   小叔子   舅母   宝妈   麻友   寿辰   恩师   组员   姬友   老伴儿   刘先森   银婚   表舅   女朋   表妹夫   顶    头上司   小基友   大舅子   冰友   教友   宋宋   乔帮主   堂兄
牛蛙   鱼头   干锅   鲶鱼   香辣   毛血旺   鲈鱼   蛙   椒盐   口水鸡   泡椒   豆豉   金牌   黑鱼   水煮鱼   鱼翅   鹅   鸡爪   钵钵鸡

数据中的每一行代表一个cluster,可以看出第一个cluster是和吃饭的人相关,第二个cluster就是菜名。到此,初步的聚类处理就完成了,需要注意的是在聚类中并不是所有的cluster都有意义,这部分cluster可以当做噪音过滤掉。

本文出自 dcharm,转载时请注明出处及相应链接。

本文永久链接: http://www.dcharm.com/?p=241

发表评论

Ɣ回顶部