CiteSpace关键词聚类时间轴实战:从数据预处理到可视化优化

1次阅读
没有评论

共计 2439 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

前言

在文献计量研究中,关键词聚类时间轴分析是揭示领域知识演化的利器。但原始数据中的噪声和 CiteSpace 默认参数的限制,常常导致可视化结果杂乱无章。本文将手把手带你用 Python 打造一条从原始数据到清晰时间轴的技术流水线。

CiteSpace 关键词聚类时间轴实战:从数据预处理到可视化优化

一、原始数据痛点拆解

1.1 Web of Science/CSSCI 导出数据的常见缺陷

从数据库导出的原始数据往往存在三大顽疾:

  • 字段缺失 :部分记录的DE(作者关键词) 或ID(数据库关键词)字段为空
  • 时间切片不均:早期文献收录不全导致时间分布呈现 ” 头轻脚重 ”
  • 格式混乱:期刊缩写形式不统一(如 ”J. Appl. Phys.” 与 ”Journal of Applied Physics” 混用)

1.2 CiteSpace 原生分析的局限性

即使数据相对完整,直接使用 CiteSpace 仍会遇到:

  • 聚类过度碎片化:默认的 LLR 算法易受高频词干扰
  • 时间轴断裂 :参数Time Slicing 设置不当会导致时段连接不连续
  • 节点重叠严重:重要节点被遮挡影响模式识别

二、技术解决方案全流程

2.1 数据清洗 Pipeline

2.1.1 构建基础数据框架

import pandas as pd
from collections import Counter

# 读取 WOS 导出文件
df = pd.read_csv('savedrecs.txt', sep='\t', encoding='utf-8')

# 关键字段检查
required_fields = ['PY', 'DE', 'ID', 'SO']
assert all(field in df.columns for field in required_fields), "缺失关键字段"

2.1.2 智能补全策略

# 关键词字段合并与清洗
df['keywords'] = df['DE'].fillna('') +';'+ df['ID'].fillna('')
df['keywords'] = df['keywords'].str.replace(r'\s+', ' ', regex=True)

# 年份补全(用同期刊的中位数年份)journals_median_year = df.groupby('SO')['PY'].median()
df['PY'] = df.apply(lambda x: x['PY'] if not pd.isna(x['PY']) \
                   else journals_median_year.get(x['SO'], df['PY'].median()), axis=1)

2.2 聚类优化方案

2.2.1 基于 TF-IDF 的特征加权

from sklearn.feature_extraction.text import TfidfVectorizer

# 构建关键词共现矩阵
tfidf = TfidfVectorizer(tokenizer=lambda x: [w.strip().lower() for w in x.split(';') if w])
keyword_matrix = tfidf.fit_transform(df['keywords'])

2.2.2 最佳聚类数确定

from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans

# 轮廓系数法寻找最优 k
silhouettes = []
for k in range(2, 10):
    clusterer = KMeans(n_clusters=k, random_state=42)
    preds = clusterer.fit_predict(keyword_matrix)
    silhouettes.append(silhouette_score(keyword_matrix, preds))

optimal_k = silhouettes.index(max(silhouettes)) + 2  # 结果从 k = 2 开始

2.3 时间轴可视化技巧

2.3.1 Matplotlib 动态布局

import matplotlib.pyplot as plt
plt.style.use('seaborn-poster')  # 预设样式模板

fig, ax = plt.subplots(figsize=(15, 8))
for year in sorted(df['PY'].unique()):
    year_data = df[df['PY'] == year]
    # 此处添加节点绘制代码...

2.3.2 视觉映射策略

  • 节点大小:按关键词出现频率的 log 值缩放
  • 颜色映射 :使用viridis 渐变色系区分不同聚类
  • 连线透明度:随时间跨度增加而降低(alpha=0.8→0.3)

三、避坑实践指南

3.1 期刊缩写标准化

推荐使用 CrossRef 的官方缩写 API 进行统一处理:

import requests
def standardize_journal(title):
    response = requests.get(f"https://api.crossref.org/journals?query={title}")
    return response.json()['message']['items'][0]['short-title'] if response.ok else title

3.2 时间跨度阈值

建议遵循 ”3-5-8″ 原则:

  1. 时间跨度 <30 年:设置 3 年一个切片
  2. 30-50 年:5 年一个切片
  3. 50 年:8 年一个切片

3.3 其他关键参数

  • Modularity Q 值:保持在 0.4-0.7 区间最佳
  • Node Size:基础值建议 50-100
  • Font Size:关键词标签 8 -12pt

四、动手实验

我们准备了测试数据集供验证(点击下载):
WOS_sample.zip
CSSCI_sample.zip

解压后运行以下命令验证环境:

python check_environment.py

结语

通过这套方法,我在分析纳米材料领域演进时,将聚类质量指标 Silhouette Score 从 0.32 提升到了 0.51。最关键的是掌握了数据清洗→算法优化→可视化的完整思维框架,这对后续其他文献计量分析工作也大有裨益。

正文完
 0
评论(没有评论)