学术数据挖掘实战:从 CNKI 文本到关键词趋势分析全流程揭秘

#新星杯·14天创作挑战营·第11期#

如果从数据库导出了一些文献数据,例如:
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 vs YR 2025),需统一转换为四位年份🔢
  • 关键词大小写 / 空格:用strip()去除前后空格,统一转换为小写(或大写)
  • 缺失值处理:若某记录缺少IS字段,可根据上下文填充默认值(如'01'代表 1 月)

2. 阈值设定的艺术

  • 低频阈值(如 25)并非固定值!需根据数据总量调整:
    • 数据量小→降低阈值(如 10)
    • 数据量大→提高阈值(如 50)
  • 词云图阈值可高于趋势图,进一步聚焦核心关键词⚠️

3. 工具搭配的优势

  • Python:擅长文本处理、数据清洗,有丰富的第三方库(如csvpandas
  • MATLAB:数学建模、可视化能力强大,适合统计分析与图表绘制
  • 进阶方案:用 Python 完成全部流程(如用matplotlib绘图),或用 R 语言替代 MATLAB,灵活选择~

五、总结与拓展:从数据到洞察的跃迁 🚀

通过这套流程,我们实现了从 “原始文本数据” 到 “趋势洞察” 的完整闭环:

  1. 数据提取:Python 解析文本,生成结构化数据
  2. 统计分析:MATLAB 计算频次、拟合趋势
  3. 可视化:趋势图 + 词云图,直观展示热点与趋势

未来还可以尝试:

  • 加入月份维度:分析关键词的季度 / 月度波动
  • 关联分析:探索关键词之间的共现关系(如 “人工智能” 与 “机器学习” 的相关性)
  • 动态可视化:用 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)');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值