查看原文
其他

古代诗人总去的这些地方你一定要知道!

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:钱梦璇

文字编辑:孙晓玲

技术总编:张   邯

细读古诗,我们可以品味出古代诗人想要治国安邦的理想信念,可以体会到他们寄情山水、与世无争的生活态度。但大多数古诗人因为官场的腐朽和体制的压迫而空有一身才华、无法施展。

所以,他们将内心的抑郁和悲愤寄情于山水,或以四海为家,到处飘摇,抒写出人生百味。那么,大多数古诗人去过的地方有哪些呢?或者说他们经常在古诗词中提到的地点又有哪些呢?小编从中文诗歌数据库中找到了三百首唐诗,通过数据处理将这些地点通过可视化直观地展示出来。

对唐诗分词

唐诗三百首文件如下所示:

通过中文分词库—jieba对唐诗三百首进行分词,此处采用“搜索引擎模式”这种分词模式,它的好处在于可以在精确模式的基础上,对长词再次切分。

import jiebaallwords=[] with open(r'唐诗三百首.txt',encoding='utf8') as f: for line in f.readlines(): words=jieba.cut_for_search(line) words=filter(lambda word:len(word)>1,words) allwords.extend(words) print(allwords)
f.readlines()表示将唐诗三百首中的内容按行读入,通过循环将每一行的诗词内容进行切分—搜索引擎模式jieba.cut_for_search()。
由于古诗词文本十分规整,不存在乱七八糟的符号和干扰字符,所以不需要做太多处理,只需过滤掉分词后长度为1的词即可。最后得到的分词结果如下所示:


提取地名


根据以上分词结果,提取出所有词语中属于地名的词。

from collections import Counter #导入计数器with open(r"中国所有城市.txt",encoding="utf8") as f2: citynames=f2.read() citynames=citynames.split(',') finalcity=[]for unitcity in citynames: for unitword in allwords: if unitword in unitcity: finalcity.append(unitword)finalcitycount=Counter(finalcity).most_common(30)print(finalcitycount)

通过判断这些词语是否属于城市地名,从而提取出来并保存在finalcity列表中。其中用到的中国所有城市文件中,包含了中国所有的省份、城市、自治区、直辖市等所有地方。如下所示:

在所有城市读入后,通过字符串的split函数将所有城市通过“,”分隔开来。split函数用于将一个字符串分裂成多个字符串组成的列表,当不带参数时以空格进行分割,当带参数时,以该参数进行分割。
Counter计数器中的most_common()函数统计了词出现的次数,函数参数30表明打印次数排名为前30的词。最后得到的排名前30个常在唐诗中出现的地名如下所示:


在地图上可视化数据

Python中有多个绘图库,通过比较,小编选择了展示地图最为美观的pyecharts库。之前的推文中,有一系列图形的详细介绍。

首先导入绘图库,并添加数据:
from pyecharts import options as optsfrom pyecharts.charts import Geofrom pyecharts.globals import GeoTypedata=[('长安', 16), ('江南', 9), ('蓬莱', 6), ('石鼓', 5),('轮台', 5), ('太平', 4), ('连山', 4), ('九江', 4), ('庐山', 4), ('河南', 4),('洛阳', 4), ('长沙', 4), ('昭阳', 4), ('芙蓉', 4), ('凤凰', 4), ('河北', 2),('山西',2)]pieces = [ {'max': 3, 'label': '2-3', 'color': '#EEAD0E'}, {'min': 4, 'max': 5, 'label': '4-5', 'color': '#4682B4'}, {'min': 5, 'label': '5以上', 'color': '#D94E5D'},]

在前30个地名中,发现有类似“青山”这样广泛用于唐诗中,但明显不是地名的词语。由于古代地域和现在地域的差异,一些城市的名称也有所变化。通过简单处理,最后选择的地名如以上data所示。
定义地图函数,将数据导入进去,并进行可选项的设置:
tangshi_geo=( Geo(init_opts=opts.InitOpts(width="800px",height="800px")) .add_schema(maptype="china",itemstyle_opts=opts.ItemStyleOpts(color="#FFEFD5",border_color="#FF7F00")) .add("",data,type_=GeoType.EFFECT_SCATTER) .set_series_opts(label_opts=opts.LabelOpts(is_show=True,formatter='{b}:{{c}}')) .set_global_opts(title_opts=opts.TitleOpts(title="唐诗中常提到的地名",subtitle="数字显示:经纬度+个数",pos_right="center",pos_top="15%"), visualmap_opts=opts.VisualMapOpts(pos_left="8%",pos_top="75%",is_piecewise=True,pieces=pieces)))
初始化选项中,设置画布宽度和高度分别为"800px"和"800px"。在add_schma中添加图元样式配置项:图形的背景颜色和边界颜色,颜色的格式为RGB样式。将这些地点投射在地图上时,采用涟漪动态效果,故设置地图类型为GeoType.EFFECT_SCATTER。
为了将数据也展示在地图上,将标签配置项用is_show=True显示出来,并将格式设置为“{地名}:{数据}”的样式,在此需要注意的是,显示的数据有三个,前两个分别为经纬度,第三个才是地名出现的次数。
在全局配置项中,通过TitleOpts设置标题的内容和位置,通过VisualMapOpts设置自定义视觉映射配置项的位置和内容。此时的pieces对应了第一步添加数据中的pieces列表,自定义为3段,其中min和max表示每一段的最小和最大值,label表示对应的标签。
tangshi_geo.render("唐诗地图.html")

最后,通过render生成本地 HTML文件,如下所示:

根据图表,你是否能直观的感受到唐代诗人总去的地方在哪里呢?这些地方中的大多数现在都是优美的旅游景点!以后有机会一定要去当地感受感受诗人的意境!





对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

DataFrame数组常用方法(二)

ftools命令——畅游大数据时代的加速器

卫健委的“糊涂账”

Pandas中数据的排序与切片

DataFrame数组常用方法

巧用局部宏扩展函数dir

过了14天潜伏期真的没事了?

Pandas基本数据类型介绍

NumPy数组基本介绍

“个性化”sortobs命令,教你实现排序自由

携手战疫,我们在行动

恭贺新春,平安顺遂|各省疫情关注度地图

过年观影指南(二)

过年观影指南(一)

egenmore隐藏功能——进制转换

相遇insobs,如暗室逢灯

数据可视化之地理坐标系

SFI:Stata与Python的数据交互手册(一)

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存