Skip to content

The repository for OpenRank(OpenSODA) competition 2024

Notifications You must be signed in to change notification settings

ZDora6899/OpenRank2024

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

60 Commits
 
 
 
 
 
 

Repository files navigation

这是openrank杯2024比赛,This is AI的仓库。

我们目前主要针对数据集进行处理

这是一个简单的数据集可视化工具,使用的数据集是Seaborn自带的tips,后面可以直接更换:

数据分析与可视化(pandas、matplotlib、seaborn、plotly、bokeh)

环境要求

  • Python 3.x
  • pandas
  • seaborn
  • matplotlib
  • plotly
  • bokeh
  • Jupyter Notebook(可选,但推荐用于交互式分析)

代码示例

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from bokeh.io import output_notebook, show
from bokeh.plotting import figure
import plotly.express as px

# 在Jupyter中启用内联显示
%matplotlib inline
output_notebook()

# 1. 数据加载与初步查看(使用seaborn自带tips示例数据)
tips = sns.load_dataset("tips")
print("数据集前五行:")
display(tips.head())

print("\n数据基本信息:")
display(tips.info())

# 基本统计描述
print("\n数据描述统计:")
display(tips.describe())

# 2. 数据清洗与特征处理
categorical_cols = ['sex', 'smoker', 'day', 'time']
for col in categorical_cols:
    tips[col] = tips[col].astype('category')

# 新增特征列:tip_rate = tip/total_bill(小费率)
tips['tip_rate'] = tips['tip'] / tips['total_bill']

# 3. 使用matplotlib进行基础可视化 - 账单金额分布直方图
plt.figure(figsize=(8, 6))
plt.hist(tips['total_bill'], bins=20, color='skyblue', edgecolor='black')
plt.title('Distribution of Total Bill')
plt.xlabel('Total Bill')
plt.ylabel('Frequency')
plt.grid(True, alpha=0.3)
plt.show()

# 4. 使用seaborn进行可视化

# 4.1 箱线图:不同日期下的消费金额分布
plt.figure(figsize=(8,6))
sns.boxplot(x='day', y='total_bill', data=tips, palette='Set3')
plt.title('Total Bill Distribution Across Days')
plt.show()

# 4.2 散点图 + 回归线:小费率与账单金额的关系
plt.figure(figsize=(8,6))
sns.regplot(x='total_bill', y='tip_rate', data=tips, scatter_kws={'alpha':0.5}, line_kws={'color':'red'})
plt.title('Tip Rate vs Total Bill')
plt.show()

# 4.3 热力图:变量间相关性
corr = tips[['total_bill','tip','tip_rate','size']].corr()
plt.figure(figsize=(6,5))
sns.heatmap(corr, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('Correlation Heatmap')
plt.show()

# 5. 使用Plotly实现交互式可视化
fig = px.scatter(
    tips, 
    x='total_bill', y='tip', 
    color='smoker', 
    symbol='sex',
    size='size', 
    title='Interactive Scatter Plot (Plotly): Total Bill vs Tip',
    hover_data=['day','time']
)
fig.show()

# 6. 使用Bokeh进行交互式可视化
p = figure(
    title="Bokeh Interactive Plot: Tip Rate vs Total Bill",
    x_axis_label='Total Bill',
    y_axis_label='Tip Rate',
    plot_width=600,
    plot_height=400,
    tools="pan,wheel_zoom,box_zoom,reset,hover"
)
p.circle(
    tips['total_bill'], 
    tips['tip_rate'], 
    size=7, 
    color="navy", 
    alpha=0.5
)
show(p)


除了以上自己的尝试还可以直接使用当前比较流行的分析工具**引用网络构建与分析工具**
1.网络分析
NetworkX (Python):对学术引用网络进行建模和分析提取节点论文)、引用关系)、作者节点等igraph (Python/R):高效处理大规模图结构并进行社区检测路径长度统计模块度计算等高级分析2.大规模数据存储与处理可选Elasticsearch / Solr如果需要对大量文献数据进行全文搜索或索引以快速查找引用关系或文本特征Neo4j图数据库对引用网络进行存储和查询Cypher查询语言可方便地发现模式和关系)。
**时间序列与长期使用模式分析工具**
1时间序列分析
Prophet (Facebook开源):预测未来的引用趋势或使用模式变化趋势2.统计分析与可视化
SciPy / statsmodels (Python):进行基础统计检验回归分析和显著性分析**进一步的分析思路**
可以做以下尝试1.长期使用模式评估指标设计除了简单的年度引用次数外还可设计更丰富的评价指标a.引用半衰期数据集论文在发布后多久引用率开始下降从而量化其学术寿命”。
b.引用增长率分析引用次数随时间的增速或减速情况以识别该数据集是否在某些年份开始重新获得关注例如随着领域热点变化)。
c.研究主题演化通过提取引用论文的关键词或研究领域分类分析这些引用论文所在的领域有没有从原始应用领域扩散到其他领域2结合其他数据源与行为数据虽然原始代码仓库行为数据缺失但可考虑a.利用搜索引擎或数据集下载量信息如从DataHubZenodo等数据托管平台的API补充数据集使用的间接证据b.使用GitHub API查看其他项目中对该数据集的二次引用如README中提到的数据集)。
3对比分析将目标数据集对应论文的引用模式与其他同类数据集的引用模式进行对比寻找影响长期使用的共性特征如数据集领域数据类型社区支持力度)。


**案例构思**
构思了以下案例1.多维度指标整合除了引用次数趋势还可结合作者地理位置如果数据可得或主题领域标签对引用网络分层分析利用分组统计与可视化如Seaborn的分面图揭示不同领域对数据集的采用程度2.热点演化分析借助时间序列分析工具和Plotly的交互式可视化将引用网络按年份分层对比初期和近期引用者群体的研究方向变化用动态可视化如动画的时间步进展现该数据集在学术圈的足迹”。
3.对比分析与参考基线使用同样的工具与流程对其它已知在学术界有不同使用模式的数据集进行类似分析对比年度引用趋势和网络拓扑特征提炼出可能影响长期使用的关键因素如论文质量数据集类型后续维护水平)。

**深度分析思路**
1.定性与定量相结合的分析路径可考虑将量化的指标与定性的观察相结合a.定性观察对某些关键年份中引用量突增的节点论文和团体作者群体进行定性分析手动查看该年度引用的论文内容如摘要标题或关键词以判断增长的原因领域新热点相关工具链成熟等)。
b.定量指标对引用时间序列的结构如突变点平台期下滑期进行统计检测如Change Point Detection),进一步量化数据集影响力的生命周期特征2.多维特征整合分析获得更丰富的元数据除了引用时间引用论文标题作者等还包括论文关键词领域分类作者所属机构和地理分布),则可以进行多维度整合分析a.地理与机构分布分析利用作者的机构信息如果从Semantic Scholar或其他数据源中获取统计每年不同区域不同机构对该数据集引用的增长或下降情况可通过地理热力图Plotly或Folium库展示全球学术共同体对数据集应用的分布与演化b.领域拓扑分析从引用论文的关键词或领域标签中抽取特征如NLPCVRobotics等学科标签),统计该数据集最初在特定领域中的引用情况并观察其是否在随时间扩散到新的研究领域可利用Seaborn的facetgrid()或Altair的交互式图表分面化展示领域的演化3.文本挖掘与语义分析a.当获取引用论文的摘要或关键词后可以利用自然语言处理NLP和文本挖掘技术获得数据集使用模式的语义线索b.关键词提取与聚类利用NLTKspaCy或scikit-learn中的TF-IDFLDALatent Dirichlet Allocation主题模型对引用论文摘要和标题进行主题建模c.分析不同年份出现的主要主题通过主题的兴衰更好地理解数据集在学术研究上的功能迁移例如从初期在图像分割任务上的引用延展到后期在医学影像分析领域的使用)。
4.情感与立场分析可能无明显价值但可探索):检查论文中引用该数据集时是否对其有一定评价如性能对比数据集质量评价)。尽管学术论文普遍中性但也有可能在相关工作中对数据集的局限性或优势有简述现在对方法论框架做进一步补充说明数据抓取与预处理数据抓取是整个分析过程的基础将通过 Paperswithcode  Semantic Scholar API 获取数据集对应的学术论文及其引用信息数据预处理将帮助清洗和整合这些信息为后续的分析和建模做准备关键步骤1.API数据抓取使用requests或asyncio抓取论文数据抓取内容包括论文标题DOI引用信息关键词出版年份等2.数据清洗利用pandas处理数据缺失重复项异常值等确保数据整洁一致3.时间字段转换引用数据按时间顺序分析时需要确保年份等时间字段的格式一致现在对引用网络进行构建与分析引用网络是分析数据集使用模式的核心每篇学术论文都与其他论文通过引用关系相连通过这些引用关系可以构建一个引用网络关键步骤1.构建引用图利用NetworkX或igraph库将引用数据构建成有向图每个节点表示一篇论文边表示引用关系2.社区检测通过Louvain或Girvan-Newman等算法识别引用网络中的学术社群或研究领域分析哪些领域或学者群体推动了数据集的使用3.中心性分析通过度中心性PageRank等指标找出引用网络中的核心论文和关键作者了解数据集的学术影响力是如何通过这些核心节点扩展到其他领域的**现在对应用场景与实际意义进行展开论述**
帮助研究人员选择数据集研究人员在选择开源数据集时常常面临选择困难尤其是面对已经多年未更新的数据集时通过分析学术引用网络与使用模式研究者可以获得基于数据的选择依据从而更科学地选择适合自己研究领域的数据集补充两点具体意义1.推动开源数据集管理与评估
研究结果将为开源数据集的管理提供支持尤其是在缺乏传统更新和行为数据的情况下引用数据可以作为衡量数据集活跃度和影响力的一个有效指标这可以帮助开源平台学术机构等制定更好的数据集发布与管理策略2.影响政策与产业应用
对于工业界的应用者了解数据集在学术界的长期影响力能够帮助判断一个数据集是否具有长期使用的价值并为未来的技术开发提供数据支持关于如何量化数据集的活跃度与影响力的思考**引用数据作为关键指标**
1.引用次数数据集对应的学术论文被引用的总次数可以直接反映其在学术界的影响力引用次数越多表明数据集被更多研究者使用和认可2.引用动态分析引用数量随时间的变化趋势识别数据集的生命周期阶段发布初期使用持续使用停用/过时)。例如引用量的持续增长表明数据集在长期使用中保持活跃而引用量的下降可能预示其逐渐被新数据集取代关于开发标准化的评价体系的思考**构建多维度评价指标**
1.引用数量与增长率不仅关注总引用次数还关注引用增长率以评估数据集的持续影响力2.跨领域引用衡量数据集在多个学科领域中的引用情况反映其跨领域应用的广泛性3.核心引用网络分析引用网络中的核心节点如高引用论文),评估数据集在学术网络中的关键地位**标准化流程**
1.数据收集通过Paperswithcode和Semantic Scholar API收集数据集对应的引用数据2.指标计算根据预定义的评价指标计算每个数据集的评分3.评分体系建立一个评分体系将不同指标进行权重组合生成综合评分便于不同数据集之间的比较那么如何构建多维度评价指标一个全面的评价体系应涵盖多个维度以全面反映数据集的使用情况和影响力以下是三个关键的评价指标a.引用数量与增长率
b.跨领域引用
c.核心引用网络
引用数量与增长率
**定义与重要性**
引用数量指数据集相关论文被引用的总次数是衡量数据集学术影响力的基本指标引用增长率指在特定时间段内引用数量的增长速度反映数据集的持续影响力和未来潜力代码示例import pandas as pd
import matplotlib.pyplot as plt
# 假设 df_citations 包含 'year' 和 'citation_count' 列
df_citations = pd.DataFrame({
    'year': range(2010, 2024),
    'citation_count': [50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180]
})
# 计算总引用次数
total_citations = df_citations['citation_count'].sum()
# 计算年度增长率
df_citations['growth_rate'] = df_citations['citation_count'].pct_change() * 100
# 计算平均增长率(复合年增长率)
cagr = ((df_citations['citation_count'].iloc[-1] / df_citations['citation_count'].iloc[0]) ** (1/(df_citations.shape[0]-1)) - 1) * 100
print(f"总引用次数: {total_citations}")
print(f"平均增长率 (CAGR): {cagr:.2f}%")
# 可视化引用趋势
plt.figure(figsize=(10, 6))
plt.plot(df_citations['year'], df_citations['citation_count'], marker='o', label='引用次数')
plt.title('年度引用次数变化趋势')
plt.xlabel('年份')
plt.ylabel('引用次数')
plt.legend()
plt.grid(True)
plt.show()

如何进行跨领域引用1.定义与重要性跨领域引用指数据集相关论文在不同学科领域的引用情况反映数据集的跨学科应用广泛性重要性跨领域引用量高的数据集具有更广泛的适用性和更高的学术价值能够推动多学科的研究进展2.计算方法领域分类自动分类使用NLP技术和机器学习算法对引用论文进行自动领域分类手动标注对自动分类结果进行人工验证和修正确保分类的准确性跨领域引用量Cross-domain Citations):
![image](https://github.com/user-attachments/assets/fe1b9835-7498-493e-bcef-e150d0b410af)
代码示例如下import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
import seaborn as sns
# 假设 df_papers 包含 'title', 'abstract', 'keywords', 'field' 列
df_papers = pd.DataFrame({
    'title': ['Paper A', 'Paper B', 'Paper C', 'Paper D'],
    'abstract': ['Abstract A', 'Abstract B', 'Abstract C', 'Abstract D'],
    'keywords': ['Keyword1, Keyword2', 'Keyword3, Keyword4', 'Keyword1, Keyword3', 'Keyword2, Keyword4'],
    'field': ['Computer Vision', 'Natural Language Processing', 'Biomedical', 'Robotics']
})
# 自动领域分类(示例使用预先标注的训练数据)
# 在实际应用中,需要使用更多的训练数据和更复杂的模型
vectorizer = TfidfVectorizer(stop_words='english')
clf = MultinomialNB()
model = make_pipeline(vectorizer, clf)
# 假设已有训练数据
train_data = pd.DataFrame({
    'text': ['Image recognition in computer vision', 'Language models in NLP', 'Biomedical data analysis', 'Robotics and automation'],
    'field': ['Computer Vision', 'Natural Language Processing', 'Biomedical', 'Robotics']
})
model.fit(train_data['text'], train_data['field'])
# 预测领域
df_papers['predicted_field'] = model.predict(df_papers['abstract'])
# 统计跨领域引用量
cross_domain_citations = df_papers['predicted_field'].value_counts()
# 可视化
plt.figure(figsize=(10, 6))
sns.barplot(x=cross_domain_citations.index, y=cross_domain_citations.values, palette='viridis')
plt.title('跨领域引用分布')
plt.xlabel('学科领域')
plt.ylabel('引用次数')
plt.xticks(rotation=45)
plt.show()

下面对跨领域引用进行展开解释跨领域引用通常是指同一数据集所对应的学术论文被不同学科领域或研究方向的文献所引用的情况它体现了数据集在多个学科交叉点上的影响力和应用价值如果一个数据集能在多个领域中被广泛引用通常意味着该数据集具有较强的通用性和较高的学术价值可以推动多个学科的研究进展1.多学科交叉跨领域引用可以帮助研究者了解数据集与其他学科的衔接点挖掘新的研究方向或应用场景2.价值评估跨学科引用越多通常说明数据集更具潜在推广价值和学术影响力可引导研究人员在项目立项与经费分配时将其纳入重点考虑范围接下来给出计算跨领域引用的方法1. 领域分类
1自动化分类
利用自然语言处理NLP和机器学习算法对论文的标题摘要或关键词等文本内容进行分析将其自动划分到预定义领域如计算机视觉自然语言处理医学影像等)。
机器学习模型如朴素贝叶斯SVM随机森林等或深度学习模型如BERT等都可用于文本分类根据数据规模和准确度需求可结合向量化方法TF-IDFWord2VecBERT Embeddings等进行特征提取提升分类性能2手动标注
对自动分类结果进行抽样检查和人工验证主要用于修正模型的误判和领域边界不清的问题若有不符合预期的文本可进行人工重分类或在训练集中添加更多示例以迭代提升模型准确性2. 跨领域引用量统计
跨领域引用量可以通过对文献所属领域的分布进行统计来衡量例如,“计算机视觉领域中引用该数据集的论文数量为多少,“自然语言处理领域有多少等等若一篇论文预测为多个领域则可为其进行加权处理或记为多学科交叉”。
不同领域的引用占比除了单纯计算各领域的引用数量也可以对比各领域引用占总引用量的百分比帮助直观感受数据集在每个领域的影响程度趋势分析可选):若能获取不同时期的引用数据还可对各领域引用量在时间维度上进行分析了解数据集的跨领域扩散进程这里给出自动化分类的代码示例from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
# 将标题和摘要合并,构建文本特征(示例做法,也可单独使用摘要或标题)
train_texts = train_data['title'] + ' ' + train_data['abstract']
train_labels = train_data['field']
# 构建TF-IDF + 朴素贝叶斯的Pipeline
model_pipeline = make_pipeline(
    TfidfVectorizer(stop_words='english'),
    MultinomialNB()
)
# 训练模型
model_pipeline.fit(train_texts, train_labels)
# 对测试集(待分类论文)的文本进行预测
test_texts = test_data['title'] + ' ' + test_data['abstract']
predicted_fields = model_pipeline.predict(test_texts)
# 将预测结果合并到 test_data 中
test_data['predicted_field'] = predicted_fields
print("=== 预测结果 ===")
print(test_data[['title', 'predicted_field']])


这里给出趋势分析的代码示例import matplotlib.pyplot as plt
# 假设 test_data 中还包含一列 'year' 表示论文年份
# 为了演示,这里先随意生成一些年份
import random
years = [2020, 2021, 2022]
test_data['year'] = [random.choice(years) for _ in range(len(test_data))]
# 按年份和预测领域进行统计
year_field_counts = test_data.groupby(['year', 'predicted_field']).size().reset_index(name='count')
# 进一步可在这里选择用pivot_table来转成矩阵形式,便于可视化
pivot_df = year_field_counts.pivot_table(index='year', columns='predicted_field', values='count', fill_value=0)
# 绘制堆叠柱状图
pivot_df.plot(kind='bar', stacked=True, figsize=(8, 5))
plt.title('按年份统计跨领域引用量')
plt.xlabel('年份')
plt.ylabel('引用数')
plt.legend(title='领域')
plt.show()


给出手工标注中抽样检查与人工验证的代码片段import pandas as pd

# 假设 test_data 是待分类的论文数据集,已包含 'predicted_field' 列
# 示例数据
test_data = pd.DataFrame({
    'title': [
        'A study on image segmentation with transformers',
        'Dialogue generation using GPT-based models',
        'An analysis of CT scans in diagnosing lung diseases'
    ],
    'abstract': [
        'We investigate image segmentation performance using transformer models in computer vision...',
        'This research focuses on dialogue generation with GPT-based models in NLP context...',
        'CT scans are crucial in diagnosing lung diseases, providing new insights in medical imaging...'
    ],
    'predicted_field': [
        'Computer Vision',
        'Natural Language Processing',
        'Medical Imaging'
    ],
    'year': [2020, 2021, 2022]
})

# 抽取10%的样本进行人工审核
sample_size = int(0.1 * len(test_data))  # 根据数据量调整抽样比例
sample_data = test_data.sample(n=sample_size, random_state=42).copy()

print("=== 抽样检查样本 ===")
print(sample_data)


给出跨领域引用分析整体示例代码import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
import matplotlib.pyplot as plt
import seaborn as sns

# --------------------------
# 1. 数据准备
# --------------------------

# 原始训练数据
train_data = pd.DataFrame({
    'title': [
        'Deep learning for image recognition',
        'A novel NLP model for text generation',
        'Advanced MRI techniques in medical imaging',
        'Speech recognition with CNN and RNN',
        'Transformer-based BERT model for question answering',
        'COVID-19 detection in chest X-ray images'
    ],
    'abstract': [
        'This paper explores deep learning for image classification in computer vision...',
        'We propose a new approach for text generation using advanced NLP techniques...',
        'MRI scans in medical imaging have shown potential for early disease detection...',
        'Exploring CNN and RNN architectures for automatic speech recognition tasks...',
        'This paper introduces a Transformer-based method for QA in NLP tasks...',
        'Using deep CNN for detecting COVID-19 in chest X-ray images in the medical domain...'
    ],
    'field': [
        'Computer Vision', 
        'Natural Language Processing', 
        'Medical Imaging', 
        'Speech Processing', 
        'Natural Language Processing', 
        'Medical Imaging'
    ]
})

# 待分类的测试数据
test_data = pd.DataFrame({
    'title': [
        'A study on image segmentation with transformers',
        'Dialogue generation using GPT-based models',
        'An analysis of CT scans in diagnosing lung diseases'
    ],
    'abstract': [
        'We investigate image segmentation performance using transformer models in computer vision...',
        'This research focuses on dialogue generation with GPT-based models in NLP context...',
        'CT scans are crucial in diagnosing lung diseases, providing new insights in medical imaging...'
    ],
    'year': [2020, 2021, 2022]
})

# --------------------------
# 2. 自动化分类
# --------------------------

# 合并标题和摘要作为文本特征
train_texts = train_data['title'] + ' ' + train_data['abstract']
train_labels = train_data['field']

test_texts = test_data['title'] + ' ' + test_data['abstract']

# 构建TF-IDF + 朴素贝叶斯的Pipeline
model_pipeline = make_pipeline(
    TfidfVectorizer(stop_words='english'),
    MultinomialNB()
)

# 训练模型
model_pipeline.fit(train_texts, train_labels)

# 对测试集进行预测
predicted_fields = model_pipeline.predict(test_texts)
test_data['predicted_field'] = predicted_fields

print("=== 自动分类预测结果 ===")
print(test_data[['title', 'predicted_field']])

# --------------------------
# 3. 手动标注
# --------------------------

# 抽取10%的样本进行人工审核
sample_size = int(0.1 * len(test_data))  # 根据数据量调整抽样比例
sample_data = test_data.sample(n=sample_size, random_state=42).copy()

print("\n=== 抽样检查样本 ===")
print(sample_data)

# 模拟人工修正(实际应用中应由人工完成)
# 例如,将第一个样本的预测领域修正为 'Computer Vision'
if not sample_data.empty:
    sample_index = sample_data.index[0]
    test_data.loc[sample_index, 'predicted_field'] = 'Computer Vision'

print("\n=== 修正后的样本 ===")
print(test_data.loc[sample_index])

# 将修正后的样本添加到训练集中
# 这里只添加标题、摘要和修正后的领域标签
corrected_sample = test_data.loc[sample_index].copy()
corrected_sample = corrected_sample.rename({'predicted_field': 'field'})
updated_train_data = pd.concat([train_data, corrected_sample[['title', 'abstract', 'field']]], ignore_index=True)

# --------------------------
# 4. 重新训练分类模型
# --------------------------

# 构建新的文本特征
updated_train_texts = updated_train_data['title'] + ' ' + updated_train_data['abstract']
updated_train_labels = updated_train_data['field']

# 重新构建Pipeline并训练
updated_model_pipeline = make_pipeline(
    TfidfVectorizer(stop_words='english'),
    MultinomialNB()
)

updated_model_pipeline.fit(updated_train_texts, updated_train_labels)

# 对测试集进行重新预测
updated_predicted_fields = updated_model_pipeline.predict(test_texts)
test_data['predicted_field'] = updated_predicted_fields

print("\n=== 重新训练后的预测结果 ===")
print(test_data[['title', 'predicted_field']])

# --------------------------
# 5. 跨领域引用量统计
# --------------------------

# 统计各领域的引用数量
field_counts = test_data['predicted_field'].value_counts()

print("\n=== 各领域引用数量 ===")
print(field_counts)

# 计算各领域引用占比
total_citations = field_counts.sum()
field_percentages = (field_counts / total_citations) * 100

print("\n=== 各领域引用占比 (%) ===")
print(field_percentages)

# 绘制柱状图
sns.set(style="whitegrid")
plt.figure(figsize=(10, 6))
sns.barplot(x=field_counts.index, y=field_counts.values, palette='viridis')
plt.title('跨领域引用分布')
plt.xlabel('学科领域')
plt.ylabel('引用数量')
plt.xticks(rotation=45)
plt.show()

# 绘制饼图
plt.figure(figsize=(8, 8))
plt.pie(field_counts.values, labels=field_counts.index, autopct='%1.1f%%', startangle=140, colors=sns.color_palette('viridis', len(field_counts)))
plt.title('各领域引用占比')
plt.axis('equal')  # 保证饼图为圆形
plt.show()

# --------------------------
# 6. (可选)趋势分析
# --------------------------

# 假设 test_data 中包含 'year' 列
# 这里展示如何进行时间趋势分析

# 按年份和预测领域进行统计
year_field_counts = test_data.groupby(['year', 'predicted_field']).size().reset_index(name='count')

print("\n=== 按年份和领域的引用统计 ===")
print(year_field_counts)

# 使用pivot_table转换为矩阵形式,便于绘图
pivot_df = year_field_counts.pivot_table(index='year', columns='predicted_field', values='count', fill_value=0)

# 绘制堆叠柱状图
pivot_df.plot(kind='bar', stacked=True, figsize=(12, 7), colormap='viridis')
plt.title('按年份统计跨领域引用量')
plt.xlabel('年份')
plt.ylabel('引用数')
plt.legend(title='学科领域')
plt.xticks(rotation=0)
plt.show()

# 绘制折线图(每个领域一条线)
plt.figure(figsize=(12, 7))
for field in pivot_df.columns:
    plt.plot(pivot_df.index, pivot_df[field], marker='o', label=field)
plt.title('各领域引用量的时间趋势')
plt.xlabel('年份')
plt.ylabel('引用数')
plt.legend(title='学科领域')
plt.grid(True)
plt.show()

给出上述代码的总结1.数据准备
构建带领域标签的 train_data 用于模型训练构建不带领域标签或需要预测的test_data 用于模型预测2.模型训练
使用 TF-IDF 将文本向量化使用 朴素贝叶斯或其他分类器进行领域分类训练调用 model_pipeline.predict() 对新论文进行领域预测3.手动校验与修正可选对预测结果进行抽样检查如有误判则修正修正结果可纳入新的训练集中迭代提升模型性能4.跨领域引用统计
依据 predicted_field 统计各领域文献数进而计算占比若需要多标签处理或加权统计则需改写计数逻辑5.趋势分析可选结合时间信息如发表年份引用年份),按年度和领域统计文献分布通过折线图或堆叠柱状图呈现领域引用随时间的变化该流程能够帮助在处理大规模文献数据需要自动化识别不同领域文献的场景下快速上手并为后续的跨领域引用分析学术趋势洞察奠定基础根据项目规模与精度需求你可替换所用的模型或特征提取方法 BERTGPT ),并对手动标注与持续迭代策略进行深入设计以实现更高的分类准确率与更精细的跨领域分析构建带领域标签的 train_data
建议1.数据多样性与代表性多来源数据确保训练数据来自多个学术数据库如PubMedIEEE XploreACM Digital Library等),涵盖不同领域和出版物类型以提高模型的泛化能力平衡各领域数据避免某些领域的数据过多而其他领域数据稀少导致模型对频繁领域过拟合可采用过采样如SMOTE或欠采样技术平衡数据2.丰富的元数据扩展特征除了标题和摘要还可以包括关键词作者信息发表年份期刊名称等元数据作为辅助特征提高分类模型的表现领域细分根据需要将大领域进一步细分为更具体的子领域如将计算机视觉细分为图像识别”、“目标检测),以实现更精细的分类3.高质量标签准确标注确保训练数据的领域标签准确无误可以通过专家审核或使用高可信度的数据源如期刊分类来获取标签一致性检查制定明确的标签标准和分类指南确保标签的一致性减少主观偏差4.数据清洗与预处理去重与纠错移除重复的论文记录修正拼写错误和格式问题确保数据的一致性和准确性处理缺失值对缺失的关键信息如标题摘要进行填补或删除避免影响模型训练构建不带领域标签的 test_data
1.确保数据一致性与训练数据格式一致确保测试数据的格式和结构与训练数据一致包括字段名称文本编码等以避免预处理和模型预测过程中的兼容性问题2.数据多样性涵盖多领域测试数据应涵盖多个领域以全面评估模型的分类性能包含不同文本长度确保测试数据包含不同长度的摘要和标题以测试模型在处理长文本和短文本时的表现3.元数据补充时间信息如果进行趋势分析确保测试数据包含发表年份或引用年份等时间信息引用关系如有可能获取引用关系即哪些论文引用了哪些其他论文),以便进行更深入的网络分析4.数据量充足大规模数据尽量获取足够数量的测试样本以确保统计分析的可靠性和可视化结果的代表性

About

The repository for OpenRank(OpenSODA) competition 2024

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%