如果从数据库导出了一些文献数据,例如:
RT Journal Article SR 1 A1 吴晓林 AD 南开大学周恩来政府管理学院;南开大学中国政府发展联合研究中心; T1 从本位主义到体系研究:十八大以来城乡社区治理的研究走向 JF 江苏社会科学 YR 2020 IS 04 vo OP 79-88 K1 社区治理;社区治理体系;社区结构;复合治理 AB 党的十八大以来,城乡社区治理在党和国家战略中的重要地位更加突出,社区治理体系建设被提上议程。学界对社区治理的研究,聚焦于复合治理、治理创新、三社联动、治理转型四大主题,体现为四个特点:第一,社区治理话语全面取代社区建设话语;第二,从"国家-社会"关系视角转向"结构-过程"视角;第三,从"社区行政化"的问题分析更多转向"多主体互动"的机制研究;第四,更加关注社区治理转型的条件分析。社区治理体系化,是社区治理的全面、系统的改革,包括理念价值、主体结构、微观行动等各领域的联动和集成,涉及体制机制、法律法规的制度安排。但是,社区治理体系的研究仍未得到应有的重视,与体系相关的研究零散、不聚焦,本位主义突出。应当破除"本位主义",重视系统改革的实践研究;找准"时空坐标",推进供需平衡的研究;聚焦"职责体系",做好权责统一的研究。 SN 1003-8671 CN 32-1312/C LA 中文; DS CNKI LK https://link.cnki.net/doi/10.13858/j.cnki.cn32-1312/c.20200720.022 DO 10.13858/j.cnki.cn32-1312/c.20200720.022
应该如何对其进行定位提取来进行后续的分析呢?
因此!
在学术研究与行业洞察中,关键词分析如同打开知识宝库的钥匙 —— 它能帮我们快速捕捉领域热点、追踪技术趋势,甚至预判学科发展走向。今天,我们就来聊聊如何用 Python 和 MATLAB 联手,从 CNKI(中国知网)导出的数据中挖掘价值,绘制出直观的关键词趋势图与词云图。
一、数据预处理:从杂乱文本到结构化数据 🧹
1. 数据来源与格式解析
我们的原始数据是 CNKI 导出的文本文件(如CNKI-20250511135741552.txt
),这类文件通常以行分隔记录,每条记录包含年份、文献编号、关键词等信息。观察发现,每条记录以RT
开头(可能是 “Record” 的缩写),后续字段以YR
(年份)、IS
(期号 / 编号)、K1
(关键词)标识,关键词之间用分号;
分隔。
2. Python 代码实现数据提取
我们先用 Python 编写数据提取函数extract_entries
,核心逻辑如下:
- 按记录拆分:遇到以
RT
开头的行,就开启一条新记录📄 - 字段解析:逐一解析每行,提取
YR
(年份)、IS
(月份 / 期号)、K1
(关键词) - 关键词拆分:将
K1
字段按分号拆分成单个关键词,并去除空值 - 数据清洗:仅保留同时包含年份、编号、关键词的完整记录✅
# 关键代码片段:提取并清洗数据
for entry in entries:
yr = is_num = k1 = None
for field in entry:
if field.startswith('YR '):
yr = field[3:].strip()
# 类似解析IS和K1字段
if yr and is_num and k1:
keywords = [k.strip() for k in k1.split(';') if k.strip()]
# 构建结构化数据
这段代码就像一位细心的图书管理员📚,把杂乱的笔记整理成整齐的卡片,为后续分析奠定基础~
二、MATLAB 数据分析:从频次统计到趋势建模 📊
1. 读取数据与初步统计
用 MATLAB 的readtable
函数读取 CSV 文件后,我们需要回答两个核心问题:
- 每个关键词每年出现多少次?
- 哪些关键词是 “高频玩家”?
通过unique
函数提取唯一关键词和年份,构建一个关键词×年份
的频次矩阵freqMatrix
。例如,矩阵中第i
行第j
列的值,代表第i
个关键词在第j
年出现的次数。这一步就像给关键词做 “年度考勤表”,一目了然👀
2. 筛选高频关键词:剔除 “小透明”🔍
并非所有关键词都值得关注。我们设定一个阈值(如总频次≥25),过滤掉低频词。这一步就像选秀节目中的 “晋级赛”,只有表现优异的关键词才能进入下一轮~✨
totalFreq = sum(freqMatrix, 2); % 计算每个关键词的总频次
validIdx = totalFreq >= 25; % 筛选“晋级”关键词
keywords = keywords(validIdx); % 更新关键词列表
3. 趋势拟合:用线性回归捕捉变化轨迹📈
高频关键词的趋势如何?是逐年上升的 “潜力股”,还是逐渐退热的 “旧热点”?我们用线性回归为每个关键词拟合趋势线:
polyfit(x, y, 1)
函数计算斜率(slopes
)和截距(intercepts
)- 斜率为正→上升趋势,斜率为负→下降趋势,斜率接近零→平稳趋势
这里需要注意:如果某关键词在某些年份频次为零,会自动跳过这些年份(通过y > 0
筛选),避免无效数据干扰分析~
三、可视化呈现:让数据 “开口说话” 🎨
1. 趋势图:纵览关键词的年度变迁
用 MATLAB 绘制趋势图时,我们用虚线表示拟合的趋势线,不同颜色区分不同关键词(lines
函数自动生成配色方案)。例如
figure;
hold on;
for i = 1:length(keywords)
trend = slopes(i) * years + intercepts(i);
plot(years, trend, '--', 'Color', colors(i, :), 'LineWidth', 1);
end
xlabel('Year'); ylabel('Frequency');
title('关键词年度趋势分析(总频次≥25)');
legend(keywords, 'Location', 'northwest');figure;
hold on;
for i = 1:length(keywords)
trend = slopes(i) * years + intercepts(i);
plot(years, trend, '--', 'Color', colors(i, :), 'LineWidth', 1);
end
xlabel('Year'); ylabel('Frequency');
title('关键词年度趋势分析(总频次≥25)');
legend(keywords, 'Location', 'northwest');
2. 词云图:一眼看清领域 “C 位” 关键词
词云图以关键词大小反映频次高低,随机配色让图表更生动~我们用wordcloud
函数生成词云,特别注意:
- 字体设置:指定
'FontName', '宋体'
,避免中文乱码 - 阈值调整:标题中提到 “总频次≥50”(可根据数据特点灵活调整)
- 形状选择:默认矩形,也可尝试圆形、心形等趣味形状❤️
% 生成随机配色(每个关键词独一无二的颜色)
colorMap = rand(numKeywords, 3);
wordcloud(keywords, totalFreq, 'Color', colorMap, 'FontName', '宋体');
title('跨领域需求关键词词云图(总频次≥50)');
四、实战技巧与注意事项 📌
1. 数据预处理的 “坑” 与对策
- 字段格式不一致:可能遇到
YR
后接两位或四位年份(如YR 25
vsYR 2025
),需统一转换为四位年份🔢 - 关键词大小写 / 空格:用
strip()
去除前后空格,统一转换为小写(或大写) - 缺失值处理:若某记录缺少
IS
字段,可根据上下文填充默认值(如'01'
代表 1 月)
2. 阈值设定的艺术
- 低频阈值(如 25)并非固定值!需根据数据总量调整:
- 数据量小→降低阈值(如 10)
- 数据量大→提高阈值(如 50)
- 词云图阈值可高于趋势图,进一步聚焦核心关键词⚠️
3. 工具搭配的优势
- Python:擅长文本处理、数据清洗,有丰富的第三方库(如
csv
、pandas
) - MATLAB:数学建模、可视化能力强大,适合统计分析与图表绘制
- 进阶方案:用 Python 完成全部流程(如用
matplotlib
绘图),或用 R 语言替代 MATLAB,灵活选择~
五、总结与拓展:从数据到洞察的跃迁 🚀
通过这套流程,我们实现了从 “原始文本数据” 到 “趋势洞察” 的完整闭环:
- 数据提取:Python 解析文本,生成结构化数据
- 统计分析:MATLAB 计算频次、拟合趋势
- 可视化:趋势图 + 词云图,直观展示热点与趋势
未来还可以尝试:
- 加入月份维度:分析关键词的季度 / 月度波动
- 关联分析:探索关键词之间的共现关系(如 “人工智能” 与 “机器学习” 的相关性)
- 动态可视化:用 HTML5 或 Python 的
plotly
制作交互式图表,支持缩放、悬停查看详情
数据挖掘的魅力就在于 —— 看似杂乱无章的文本,经过清洗、分析与可视化,终将揭示隐藏的规律与洞见🌟。希望今天的分享能为你的学术研究或行业分析带来启发,快去试试吧~💪
互动话题:你在做关键词分析时遇到过哪些有趣的发现?欢迎在评论区分享你的故事~👇
完整代码(省流版)
python篇
import csv
def extract_entries(file_path):
entries = []
current_entry = []
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line.startswith('RT '):
if current_entry:
entries.append(current_entry)
current_entry = [line]
else:
if line:
current_entry.append(line)
if current_entry:
entries.append(current_entry)
data = []
for entry in entries:
yr = is_num = k1 = None
for field in entry:
if field.startswith('YR '):
yr = field[3:].strip()
elif field.startswith('IS '):
is_num = field[3:].strip()
elif field.startswith('K1 '):
k1 = field[3:].strip()
if yr and is_num and k1:
keywords = [k.strip() for k in k1.split(';') if k.strip()]
for kw in keywords:
data.append([kw, yr, is_num])
return data
def save_to_csv(data, output_file):
with open(output_file, 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
writer.writerow(['关键词', '年份', '月份'])
writer.writerows(data)
# 使用示例
input_file = 'CNKI-20250511135741552.txt' # 你的文本文件路径
output_file = 'output.csv' # 输出CSV文件路径
data = extract_entries(input_file)
save_to_csv(data, output_file)
matlab篇
%% 1. 读取CSV文件
data = readtable('output.csv', 'ReadVariableNames', true);
%% 2. 按年份统计每个关键词的频次
keywords = unique(data.Keyword);
years = unique(data.Year);
years = sort(years);
% 初始化频次矩阵
freqMatrix = zeros(length(keywords), length(years));
% 填充频次矩阵
for i = 1:length(keywords)
keyword = keywords{i};
for j = 1:length(years)
year = years(j);
freq = sum(strcmp(data.Keyword, keyword) & (data.Year == year));
freqMatrix(i, j) = freq;
end
end
%% 3. 删除总频次小于25的关键词(新增部分)
totalFreq = sum(freqMatrix, 2); % 计算每个关键词的总频次
validIdx = totalFreq >= 25; % 筛选总频次≥25的关键词索引
% 更新关键词列表和频次矩阵
keywords = keywords(validIdx);
freqMatrix = freqMatrix(validIdx, :);
totalFreq = sum(freqMatrix, 2);
%% 4. 拟合趋势线(线性回归)
slopes = zeros(length(keywords), 1);
intercepts = zeros(length(keywords), 1);
for i = 1:length(keywords)
y = freqMatrix(i, :);
validYearIdx = y > 0; % 去除全零年份(可选)
x = years(validYearIdx);
y_valid = y(validYearIdx);
if length(x) < 2
slopes(i) = 0;
intercepts(i) = mean(y_valid);
else
p = polyfit(x, y_valid, 1);
slopes(i) = p(1);
intercepts(i) = p(2);
end
end
%% 5. 绘制趋势图
figure;
hold on;
colors = lines(length(keywords)); % 不同颜色区分关键词
for i = 1:length(keywords)
% 原始数据点
% plot(years, freqMatrix(i, :), 'o-', 'Color', colors(i, :), 'LineWidth', 1.5, 'DisplayName', keywords{i});
% 趋势线
trend = slopes(i) * years + intercepts(i);
plot(years, trend, '--', 'Color', colors(i, :), 'LineWidth', 1);
end
xlabel('Year');
ylabel('Frequency');
title('关键词年度趋势分析(总频次≥25)');
% legend(keywords, 'Location', 'northwest');
grid on;
hold off;
% 生成随机颜色矩阵(RGB格式,每个关键词随机颜色)
numKeywords = length(keywords);
colorMap = rand(numKeywords, 3); % 生成随机颜色(范围0~1)
% 绘制词云图
figure;
wordcloud(keywords, totalFreq, ...
'Color', colorMap, ... % 自定义颜色
'FontName', '宋体', ... % 字体设置
'Shape', 'rectangle' ... % 词云形状
);
title('跨领域需求关键词词云图(总频次≥50)');