在写关于教育数字化的东西,希望能嵌入一些数据分析,而非纯纯的语言性表述,在查阅了这方面的各种文献后,以下这篇让我觉得在方法上有一定借鉴意义:
[1]钟羽, 王觅, 郭心懿. 基础教育信息化研究热点与趋势分析——基于知识图谱的视角[J]. 现代教育科学, 2021(6):6.
文章研究流程大致遵循文献检索、词频统计、 相异矩阵生成、 聚类分析,最后通过多维尺度描绘知识图谱。
现在人在行业外,手头的工具自然有限,好在anaconda还是装了,用jupyter notebook还可以进行一些简单的动作。
素材在“宝山教育”公众号以“教育数字化”为关键词检索历史信息,将相关的21篇内容保存到txt中,作为本次分析的素材。(由于没搞定微信的批量下载,一篇篇点开时大致过了下内容,将相关性不大的,比如只是年度工作总结中提了一下这词的文章就略去,最后剩下21篇手动复制)。
流程1、数据读取
2、词频分析
3、共现矩阵及相异矩阵构建
4、层次聚类分析
准备工作中文文本分析,分词是最基础的,“jieba”是其中比较常用的一个库。
一般缺少的库都会直接使用“pip install xxx”的方式下载,但在jieba的pip安装时发生了time out 报错。在https://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个经常使用的第三方下载网站也没找到,于是检索了一下,使用国内镜像进行尝试并成功:
pip3 install jieba -i https://pypi.tuna.tsinghua.edu.cn/simple/
而制作图云的wordcloud可以直接使用“pip install wordcloud”下载。
此外,本次还涉及的库有:
# load data import os # word segmentation and word cloud import jieba import numpy as np import PIL.Image as Image from wordcloud import WordCloud # build count matrix by the code of Alan Lau import numpy as np import time from pprint import pprint as p # Hierarchical clustering import matplotlib.pyplot as plt import pandas as pd import scipy.cluster.hierarchy as sch开工 1、数据读取
import os
file_dir = 'E:/.../news' #你的文件路径
datanames = os.listdir(file_dir)
text = ''
for dataname in datanames:
f = open(file_dir + '/' + dataname) #, encoding = "utf-8"
#输出读取到的数据
text = text + 'n' + f.read()
#关闭文件
f.close()
将各篇报道的内容以"n"连接到同一个字符串中。
2、词频分析import jieba
#加载停用词表
stopwords = [line.strip() for line in open("E:/.../stopwords.txt",encoding="utf-8").readlines()]
stopwords.extend(['推进','建设','提升',"发展",'教育',"实现",'进行','通过','实践','优质','过程','借助','教学','学习','打造','构建','提供'])
#合并同义词
def join_synonym(wordA, wordB, diction):
'''把wordA的词频统计并入wordB,并返回词频统计词典'''
if wordA in diction:
if wordB in diction:
diction[wordB] = diction[wordA] + diction[wordB]
else:
diction[wordB] = diction[wordA]
diction.pop(wordA)
return diction
words = jieba.lcut(text)
counts = {}
for word in words:
#不在停用词表中
if word not in stopwords:
#不统计字数为一的词
if len(word) == 1:
continue
else:
counts[word] = counts.get(word,0) + 1
counts= join_synonym("上海市", "上海", counts) #词语去重
counts= join_synonym("宝山区", "宝山", counts)
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True) # 从高到低排序
# 观察词频统计结果
for i in range(100):
word, count = items[i]
print ("{:<10}{:>7}".format(word, count))
根据词频统计结果,适当调整停词词表和同义词合并内容,剔除无效信息,使列表前部更具分析价值。
import numpy as np
import PIL.Image as Image
from wordcloud import WordCloud
# join words for wordcloud
word_space = []
for item in items:
if item[1]>1:
word_space.extend([item[0] for i in range(item[1])])
word_space = ' '.join(word_space)
# 读取形状图片文件,生成数组
pic = np.array(Image.open("E:/.../cloud.png"))
word = WordCloud(
font_path='STXINGKA.TTF', # 设置字体,本机的字体
mask=pic, # 设置背景图片
background_color='white', # 设置背景颜色
max_font_size=180, # 字体最大值
max_words=100, # 设置最多字数
collocations=False, # 出现图片上词语重复,可尝试将collocations设为FALSE
# stopwords={'xx'}, # 可设置停用词
).generate(word_space)
image = word.to_image()
image.show() #显示图片
image.save('E:/.../cloud.jpg')
最终效果类似于
3、共现矩阵及相异矩阵构建将两关键词出现在同一篇文章中视为两者之间的一种联系。相异矩阵,可以直观反映两两关键词之间的关联程度。
百度“高频关键词相异系数矩阵”后,首先根据
【Python】构建关键词共现矩阵完整版
获取构建共现矩阵的方式,使用时注意输入输出地址以及get_set_key()列表直接从上一部分的counts转化。(这里要注意构建共现矩阵代码输入是经过格式整理的表格,即将单篇内所有词以"/"拼接,每行一篇文章组成的字符串,形成的表格)
随后,直接从输出矩阵中通过“1-x/21”求得相异矩阵(上一步构建共现矩阵时对角线直接设为21)。满足A_{i,j}越小,i,j共同出现次数越多,认为其关系越紧密。
4、层次聚类分析import matplotlib.pyplot as plt
import pandas as pd
import scipy.cluster.hierarchy as sch
plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'}) # 设置中文字体的支持
plt.rcParams['axes.unicode_minus'] = False # 使坐标轴刻度表签正常显示正负号,解决保存图像是负号'-'显示为方块的问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 图中文字体设置为黑体
plt.rcParams['axes.unicode_minus'] = False # 负值显示
df = pd.read_csv('E:/.../1.csv', encoding='GBK', engine='python', index_col = 0)#解决中文乱码
plt.figure(figsize=(10,10),dpi=100)
# 进行层次聚类: 计算距离的方法使用 average 法 只取前29项,否则元素太密看不清
Z = sch.linkage(df.iloc[:29,:29], method='average')#ward')
# 将层级聚类结果以树状图表示出来并保存
# 需要手动添加标签。
P = sch.dendrogram(Z, labels=df.index[:29],orientation='right')
plt.savefig('E:/.../层次聚类.png')
结果类似于



