着眼于 特别推荐|【文本挖掘系列教程】:
sentences = ['积雨空林烟火迟,蒸藜炊黍饷东菑。漠漠水田飞白鹭,阴阴夏木啭黄鹂。山中习静观朝槿,松下清斋折露葵。野老与人争席罢,海鸥何事更相疑。',
'北国风光,千里冰封,万里雪飘。望长城内外,惟余莽莽;大河上下,顿失滔滔。山舞银蛇,原驰蜡象,欲与天公试比高。须晴日,看红装素裹,分外妖娆。江山如此多娇,引无数英雄竞折腰。惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。一代天骄,成吉思汗,只识弯弓射大雕。俱往矣,数风流人物,还看今朝。',
'故人具鸡黍,邀我至田家。绿树村边合,青山郭外斜。开轩面场圃,把酒话桑麻。待到重阳日,还来就菊花。',
'篱畔秋酣一觉清,和云伴月不分明。登仙非慕庄生蝶,忆旧还寻陶令盟。睡去依依随雁断,惊回故故恼蛩鸣。醒时幽怨同谁诉,衰草寒烟无限情。',
'八月湖水平,涵虚混太清。气蒸云梦泽,波撼岳阳城。欲济无舟楫,端居耻圣明。坐观垂钓者,徒有羡鱼情。',
'秋丛绕舍似陶家,遍绕篱边日渐斜。不是花中偏爱菊,此花开尽更无花。',
'东望望春春可怜,更逢晴日柳含烟。宫中下见南山尽,城上平临北斗悬。细草偏承回辇处,轻花微落奉觞前。宸游对此欢无极,鸟哢声声入管弦。',
'山下兰芽短浸溪,松间沙路净无泥。萧萧暮雨子规啼。谁道人生无再少?门前流水尚能西!休将白发唱黄鸡。',
'君到姑苏见,人家尽枕河。古宫闲地少,水港小桥多。夜市卖菱藕,春船载绮罗。遥知未眠月,乡思在渔歌。',
'匈奴犹未灭,魏绛复从戎。怅别三河道,言追六郡雄。雁山横代北,狐塞接云中。勿使燕然上,惟留汉将功。',
'闲来无事不从容,睡觉东窗日已红。万物静观皆自得,四时佳兴与人同。道通天地有形外,思入风云变态中。富贵不淫贫贱乐,男儿到此是豪雄。',
'云一緺,玉一梭,淡淡衫儿薄薄罗。轻颦双黛螺。秋风多,雨相和,帘外芭蕉三两窠。夜长人奈何!',
'晨起动征铎,客行悲故乡。鸡声茅店月,人迹板桥霜。槲叶落山路,枳花明驿墙。因思杜陵梦,凫雁满回塘',
'秋风扫尽闲花草,黄花不逐秋光老。试与插钗头,钗头占断秋。簪花人有意,共祝年年醉。不用泛瑶觞,花先着酒香。',
'阑珊心绪,醉倚绿琴相伴住。一枕新愁,残夜花香月满楼。繁笙脆管,吹得锦屏春梦远。只有垂杨,不放秋千影过墙。',
'夜战桑乾北,秦兵半不归。朝来有乡信,犹自寄寒衣。',
'关东有义士,兴兵讨群凶。初期会盟津,乃心在咸阳。军合力不齐,踌躇而雁行。势利使人争,嗣还自相戕。淮南弟称号,刻玺于北方。铠甲生虮虱,万姓以死亡。白骨露于野,千里无鸡鸣。生民百遗一,念之断人肠。',
'横看成岭侧成峰,远近高低各不同。不识庐山真面目,只缘身在此山中。',
'孤村落日残霞,轻烟老树寒鸦,一点飞鸿影下。青山绿水,白草红叶黄花。',
'岱宗夫如何?齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生曾云,决眦入归鸟。会当凌绝顶,一览众山小。',
'送送多穷路,遑遑独问津。悲凉千里道,凄断百年身。心事同漂泊,生涯共苦辛。无论',
'十年驱驰海色寒,孤臣于此望宸銮。繁霜尽是心头血,洒向千峰秋叶丹。',
'功盖三分国,名成八阵图。江流石不转,遗恨失吞吴。',
'飞来山上千寻塔,闻说鸡鸣见日升。不畏浮云遮望眼,自缘身在最高层。',
'学向勤中得,萤窗万卷书。三冬今足用,谁笑腹空虚。',
'杨柳东风树,青青夹御河。近来攀折苦,应为别离多。',
'沅水通波接武冈,送君不觉有离伤。青山一道同云雨,明月何曾是两乡。',
'为忆长安烂熳开,我今移尔满庭栽。红兰莫笑青青色,曾向龙山泛酒来。',
'烽火照西京,心中自不平。牙璋辞凤阙,铁骑绕龙城。雪暗凋旗画,风多杂鼓声。宁为百夫长,胜作一书生。',
'大雪压青松,青松挺且直。要知松高洁,待到雪化时。',
'荷叶生时春恨生,荷叶枯时秋恨成。深知身在情长在,怅望江头江水声。',
'红酥手,黄縢酒,满城春色宫墙柳。东风恶,欢情薄。一怀愁绪,几年离索。错、错、错。春如旧,人空瘦,泪痕红浥鲛绡透。桃花落,闲池阁。山盟虽在,锦书难托。莫、莫、莫!',
'平生不会相思,才会相思,便害相思。身似浮云,心如飞絮,气若游丝。空一缕余香在此,盼千金游子何之。证候来时,正是何时?灯半昏时,月半明时。',
'都道是金玉良姻,俺只念木石前盟。空对着,山中高士晶莹雪;终不忘,世外仙姝寂寞林。叹人间,美中不足今方信:纵然是齐眉举案,到底意难平。'
]
解题正式开始!
载入必备的python库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram
vec = TfidfVectorizer()
X = vec.fit_transform(sentences)
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)
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()
9(匈奴犹未灭,魏绛复从戎。怅别三河道,言追六郡雄。雁山横代北,狐塞接云中。勿使燕然上,惟留汉将功。)和15(夜战桑乾北,秦兵半不归。朝来有乡信,犹自寄寒衣。)都是说塞外征战的诗句,金戈铁马,壮怀激烈,大展男儿保家卫国的凌云壮志;
19(岱宗夫如何?齐鲁青未了。造化钟神秀,阴阳割昏晓。荡胸生曾云,决眦入归鸟。会当凌绝顶,一览众山小。)和23(飞来山上千寻塔,闻说鸡鸣见日升。不畏浮云遮望眼,自缘身在最高层。)都是讲登山的哲理感悟,紫禁之巅,俯仰万物,慧极自生。
21(十年驱驰海色寒,孤臣于此望宸銮。繁霜尽是心头血,洒向千峰秋叶丹。)和30(荷叶生时春恨生,荷叶枯时秋恨成。深知身在情长在,怅望江头江水声。)都是说愁绪,前者是(戚继光)在外征战却被人排挤之愁,后者是(李商隐)思念爱人之愁,怅然若失,郁郁寡欢。
1(北国风光,千里冰封,万里雪飘。望长城内外,惟余莽莽;大河上下,顿失滔滔。山舞银蛇,原驰蜡象,...)和28(烽火照西京,心中自不平。牙璋辞凤阙,铁骑绕龙城。雪暗凋旗画,风多杂鼓声。宁为百夫长,胜作一书生。)都是讲读书人抱有大志,渴望建功立业,风云再起,谁主沉浮!
此外,该层次聚类算法也揭示出上述诗句聚类中的某些潜在结构,笔者试举一例:
上面有提到9和15是讲边塞征战,此乃保家卫国的正义之战,从结果上来看,16(关东有义士,兴兵讨群凶。初期会盟津,乃心在咸阳。军合力不齐,踌躇而雁行。势利使人争,...)与二者有一定联系,都是讲战争,但它讲的战争使老百姓民不聊生的社会惨状;三者结合,再往外扩,“遇到”22(功盖三分国,名成八阵图。江流石不转,遗恨失吞吴。),此句是吊古怀今的战争,和上面的又不太一样。
综上,上述4个诗句,3个层次,构成了“战争”这一主题,但下面子类的主题不太一样,即分别反映建功立业、兵连祸结和吊古怀今。
推荐阅读
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏