文本挖掘从小白到精通(十八)---文本层次聚类

2020 年 8 月 21 日 AINLP

着眼于 特别推荐|【文本挖掘系列教程】:


与有监督学习相比,无监督学习的样本没有任何标记。无监督学习的算法需要自动找到这些没有标记的数据里面的数据结构和特征,其中,聚类算法格外令人瞩目 ~ 笔者之前在本系列的 第八篇 第十篇 第十一篇 中都谈到过文本聚类。今天,笔者介绍一种不同于以往的聚类方法---层次聚类,既 不需要事先规定文本聚类的数量, 也能 反映文本数据集中潜藏的结构 。绝对奥利给!
关于层次聚类的算法原理笔者不多介绍,网上的资料一大堆。在这里,笔者着眼于实战和应用。
假设有如下34条诗句摆在你面前,在专业知识不具备的情况下,如何利用层次聚类算法对其进行类别划分,且聚类/分类的结果具有层次感:
sentences = ['积雨空林烟火迟,蒸藜炊黍饷东菑。漠漠水田飞白鹭,阴阴夏木啭黄鹂。山中习静观朝槿,松下清斋折露葵。野老与人争席罢,海鸥何事更相疑。',           '北国风光,千里冰封,万里雪飘。望长城内外,惟余莽莽;大河上下,顿失滔滔。山舞银蛇,原驰蜡象,欲与天公试比高。须晴日,看红装素裹,分外妖娆。江山如此多娇,引无数英雄竞折腰。惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。一代天骄,成吉思汗,只识弯弓射大雕。俱往矣,数风流人物,还看今朝。',           '故人具鸡黍,邀我至田家。绿树村边合,青山郭外斜。开轩面场圃,把酒话桑麻。待到重阳日,还来就菊花。',           '篱畔秋酣一觉清,和云伴月不分明。登仙非慕庄生蝶,忆旧还寻陶令盟。睡去依依随雁断,惊回故故恼蛩鸣。醒时幽怨同谁诉,衰草寒烟无限情。',           '八月湖水平,涵虚混太清。气蒸云梦泽,波撼岳阳城。欲济无舟楫,端居耻圣明。坐观垂钓者,徒有羡鱼情。',           '秋丛绕舍似陶家,遍绕篱边日渐斜。不是花中偏爱菊,此花开尽更无花。',          '东望望春春可怜,更逢晴日柳含烟。宫中下见南山尽,城上平临北斗悬。细草偏承回辇处,轻花微落奉觞前。宸游对此欢无极,鸟哢声声入管弦。',          '山下兰芽短浸溪,松间沙路净无泥。萧萧暮雨子规啼。谁道人生无再少?门前流水尚能西!休将白发唱黄鸡。',          '君到姑苏见,人家尽枕河。古宫闲地少,水港小桥多。夜市卖菱藕,春船载绮罗。遥知未眠月,乡思在渔歌。',           '匈奴犹未灭,魏绛复从戎。怅别三河道,言追六郡雄。雁山横代北,狐塞接云中。勿使燕然上,惟留汉将功。',           '闲来无事不从容,睡觉东窗日已红。万物静观皆自得,四时佳兴与人同。道通天地有形外,思入风云变态中。富贵不淫贫贱乐,男儿到此是豪雄。',            '云一緺,玉一梭,淡淡衫儿薄薄罗。轻颦双黛螺。秋风多,雨相和,帘外芭蕉三两窠。夜长人奈何!',           '晨起动征铎,客行悲故乡。鸡声茅店月,人迹板桥霜。槲叶落山路,枳花明驿墙。因思杜陵梦,凫雁满回塘',            '秋风扫尽闲花草,黄花不逐秋光老。试与插钗头,钗头占断秋。簪花人有意,共祝年年醉。不用泛瑶觞,花先着酒香。',            '阑珊心绪,醉倚绿琴相伴住。一枕新愁,残夜花香月满楼。繁笙脆管,吹得锦屏春梦远。只有垂杨,不放秋千影过墙。',            '夜战桑乾北,秦兵半不归。朝来有乡信,犹自寄寒衣。',           '关东有义士,兴兵讨群凶。初期会盟津,乃心在咸阳。军合力不齐,踌躇而雁行。势利使人争,嗣还自相戕。淮南弟称号,刻玺于北方。铠甲生虮虱,万姓以死亡。白骨露于野,千里无鸡鸣。生民百遗一,念之断人肠。',            '横看成岭侧成峰,远近高低各不同。不识庐山真面目,只缘身在此山中。',            '孤村落日残霞,轻烟老树寒鸦,一点飞鸿影下。青山绿水,白草红叶黄花。',            '岱宗夫如何?齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生曾云,决眦入归鸟。会当凌绝顶,一览众山小。',            '送送多穷路,遑遑独问津。悲凉千里道,凄断百年身。心事同漂泊,生涯共苦辛。无论',            '十年驱驰海色寒,孤臣于此望宸銮。繁霜尽是心头血,洒向千峰秋叶丹。',            '功盖三分国,名成八阵图。江流石不转,遗恨失吞吴。',            '飞来山上千寻塔,闻说鸡鸣见日升。不畏浮云遮望眼,自缘身在最高层。',            '学向勤中得,萤窗万卷书。三冬今足用,谁笑腹空虚。',            '杨柳东风树,青青夹御河。近来攀折苦,应为别离多。',            '沅水通波接武冈,送君不觉有离伤。青山一道同云雨,明月何曾是两乡。',            '为忆长安烂熳开,我今移尔满庭栽。红兰莫笑青青色,曾向龙山泛酒来。',           '烽火照西京,心中自不平。牙璋辞凤阙,铁骑绕龙城。雪暗凋旗画,风多杂鼓声。宁为百夫长,胜作一书生。',           '大雪压青松,青松挺且直。要知松高洁,待到雪化时。',           '荷叶生时春恨生,荷叶枯时秋恨成。深知身在情长在,怅望江头江水声。',           '红酥手,黄縢酒,满城春色宫墙柳。东风恶,欢情薄。一怀愁绪,几年离索。错、错、错。春如旧,人空瘦,泪痕红浥鲛绡透。桃花落,闲池阁。山盟虽在,锦书难托。莫、莫、莫!',           '平生不会相思,才会相思,便害相思。身似浮云,心如飞絮,气若游丝。空一缕余香在此,盼千金游子何之。证候来时,正是何时?灯半昏时,月半明时。',           '都道是金玉良姻,俺只念木石前盟。空对着,山中高士晶莹雪;终不忘,世外仙姝寂寞林。叹人间,美中不足今方信:纵然是齐眉举案,到底意难平。'          ]

解题正式开始!

 载入必备的python库

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt
from sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.metrics.pairwise import cosine_similarityfrom sklearn.cluster import AgglomerativeClusteringfrom scipy.cluster.hierarchy import dendrogram
利用sklearn中的TF-IDF文本特征提取器提取文本特征,X现在将是数据的TF-IDF表示,X的行代表上面34句诗词,列代表有多少个特征(字)。
vec = TfidfVectorizer()X = vec.fit_transform(sentences)
计算上述34句诗歌的成对的余弦相似度,也就是计算出一个相似度矩阵,计算速度将取决于数据量,会花点时间:
sims = cosine_similarity(X)

对相似度矩阵中每个cell的值保留5位小数,确保精度不损失太多:

similarity = np.round(sims, decimals = 5)

使用层次聚类算法是最为关键点一步,这里不设置聚类数 --- n_clusters的取值为None,注意要设置distance_threshold,一般设置为0,后面绘图时会用到,因为是文本的相似度计算,所以affinity取"cosine",linkage的取值为 "average",它的表现中规中矩:

cluster = AgglomerativeClustering(                                  n_clusters = None,                                  distance_threshold= 0,                                  affinity = "cosine",                                  linkage = "average"                                                    )  cluster.fit(similarity)
如此这般,聚类算是完成了,接下来要绘制聚类结果了。
在绘制树状图前,我们先将之前的原始数据,也就是34句诗歌,建立一个index-poem的Dataframe,方便根据索引查找诗句:
df = pd.DataFrame({'sentence':sentences,'index':list(range(len(sentences)))})

接下来,绘制绘制树状图的函数:
def plot_dendrogram(model, **kwargs):
# 建立邻接矩阵(linkage matrix),然后绘制树状图(dendrogram)
# 创建每个节点下的样本数 counts = np.zeros(model.children_.shape[0]) n_samples = len(model.labels_) for i, merge in enumerate(model.children_): current_count = 0 for child_idx in merge: if child_idx < n_samples: current_count += 1 # leaf node else: current_count += counts[child_idx - n_samples] counts[i] = current_count
linkage_matrix = np.column_stack([model.children_, model.distances_, counts]).astype(float)
# 绘制对应的树状图 dendrogram(linkage_matrix, **kwargs)
最后,绘制经由层次聚类算法得出的层次聚类结果:
#绘制树状图的前14层plot_dendrogram(cluster,                 truncate_mode='level',                p=14,                 leaf_font_size=15,                #labels = df['sentence'].tolist()
)
plt.xlabel("节点中的点的数量(如果没有括号,则为语句对应的索引)",size = 25)plt.show()

从上述可视化结果可知,该算法从上至少,是由总到分的层次结构,最小的聚类的成员数量为2;该聚类算法较好的捕捉了诗句之间潜藏的内在联系,比如:
  • 9(匈奴犹未灭,魏绛复从戎。怅别三河道,言追六郡雄。雁山横代北,狐塞接云中。勿使燕然上,惟留汉将功。)和15(夜战桑乾北,秦兵半不归。朝来有乡信,犹自寄寒衣。)都是说塞外征战的诗句,金戈铁马,壮怀激烈,大展男儿保家卫国的凌云壮志;

  • 19(岱宗夫如何?齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生曾云,决眦入归鸟。会当凌绝顶,一览众山小。)和23(飞来山上千寻塔,闻说鸡鸣见日升。不畏浮云遮望眼,自缘身在最高层。)都是讲登山的哲理感悟,紫禁之巅,俯仰万物,慧极自生。

  • 21(十年驱驰海色寒,孤臣于此望宸銮。繁霜尽是心头血,洒向千峰秋叶丹。)和30(荷叶生时春恨生,荷叶枯时秋恨成。深知身在情长在,怅望江头江水声。)都是说愁绪,前者是(戚继光)在外征战却被人排挤之愁,后者是(李商隐)思念爱人之愁,怅然若失,郁郁寡欢。

  • 1(北国风光,千里冰封,万里雪飘。望长城内外,惟余莽莽;大河上下,顿失滔滔。山舞银蛇,原驰蜡象,...)和28(烽火照西京,心中自不平。牙璋辞凤阙,铁骑绕龙城。雪暗凋旗画,风多杂鼓声。宁为百夫长,胜作一书生。)都是讲读书人抱有大志,渴望建功立业,风云再起,谁主沉浮!

...

此外,该层次聚类算法也揭示出上述诗句聚类中的某些潜在结构,笔者试举一例:

上面有提到9和15是讲边塞征战,此乃保家卫国的正义之战,从结果上来看,16(关东有义士,兴兵讨群凶。初期会盟津,乃心在咸阳。军合力不齐,踌躇而雁行。势利使人争,...)与二者有一定联系,都是讲战争,但它讲的战争使老百姓民不聊生的社会惨状;三者结合,再往外扩,“遇到”22(功盖三分国,名成八阵图。江流石不转,遗恨失吞吴。),此句是吊古怀今的战争,和上面的又不太一样。

综上,上述4个诗句,3个层次,构成了“战争”这一主题,但下面子类的主题不太一样,即分别反映建功立业兵连祸结吊古怀今



欢迎加入AINLP技术交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注NLP技术交流



推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
2

相关内容

层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树。在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点。
【干货书】Python数据科学入门,464页pdf
专知会员服务
72+阅读 · 2020年9月20日
【干货书】Python数据科学分析,413页pdf
专知会员服务
90+阅读 · 2020年8月22日
【干货书】Python 编程,480页pdf
专知会员服务
237+阅读 · 2020年8月14日
【干货书】Python语音计算导论,408页pdf
专知会员服务
101+阅读 · 2020年7月12日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
NLP基础任务:文本分类近年发展汇总,68页超详细解析
专知会员服务
73+阅读 · 2019年10月19日
基于知识图谱的文本挖掘 - 超越文本挖掘
专知
38+阅读 · 2019年8月18日
一起来看看词性标注
AINLP
8+阅读 · 2019年4月9日
专栏 | NLP概述和文本自动分类算法详解
机器之心
12+阅读 · 2018年7月24日
【干货】--基于Python的文本情感分类
R语言中文社区
5+阅读 · 2018年1月5日
自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)
机器学习算法与Python学习
5+阅读 · 2017年12月22日
从点到线:逻辑回归到条件随机场
夕小瑶的卖萌屋
15+阅读 · 2017年7月22日
【宁波站】网络爬虫与文本挖掘
数萃大数据
5+阅读 · 2017年7月19日
A Modern Introduction to Online Learning
Arxiv
20+阅读 · 2019年12月31日
Arxiv
5+阅读 · 2019年11月22日
Dynamic Transfer Learning for Named Entity Recognition
Arxiv
3+阅读 · 2018年12月13日
Arxiv
6+阅读 · 2018年8月27日
Angular-Based Word Meta-Embedding Learning
Arxiv
3+阅读 · 2018年8月13日
VIP会员
相关VIP内容
【干货书】Python数据科学入门,464页pdf
专知会员服务
72+阅读 · 2020年9月20日
【干货书】Python数据科学分析,413页pdf
专知会员服务
90+阅读 · 2020年8月22日
【干货书】Python 编程,480页pdf
专知会员服务
237+阅读 · 2020年8月14日
【干货书】Python语音计算导论,408页pdf
专知会员服务
101+阅读 · 2020年7月12日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
NLP基础任务:文本分类近年发展汇总,68页超详细解析
专知会员服务
73+阅读 · 2019年10月19日
相关资讯
基于知识图谱的文本挖掘 - 超越文本挖掘
专知
38+阅读 · 2019年8月18日
一起来看看词性标注
AINLP
8+阅读 · 2019年4月9日
专栏 | NLP概述和文本自动分类算法详解
机器之心
12+阅读 · 2018年7月24日
【干货】--基于Python的文本情感分类
R语言中文社区
5+阅读 · 2018年1月5日
自然语言处理(4)之中文文本挖掘流程详解(小白入门必读)
机器学习算法与Python学习
5+阅读 · 2017年12月22日
从点到线:逻辑回归到条件随机场
夕小瑶的卖萌屋
15+阅读 · 2017年7月22日
【宁波站】网络爬虫与文本挖掘
数萃大数据
5+阅读 · 2017年7月19日
相关论文
A Modern Introduction to Online Learning
Arxiv
20+阅读 · 2019年12月31日
Arxiv
5+阅读 · 2019年11月22日
Dynamic Transfer Learning for Named Entity Recognition
Arxiv
3+阅读 · 2018年12月13日
Arxiv
6+阅读 · 2018年8月27日
Angular-Based Word Meta-Embedding Learning
Arxiv
3+阅读 · 2018年8月13日
Top
微信扫码咨询专知VIP会员