【2024泰迪杯】C 题:竞赛论文的辅助自动评阅 问题分析及Python 代码实现_2024泰迪杯题目分析-程序员宅基地

技术标签: 2024泰迪杯C题  python  辅助自动评阅  数学建模入门到精通  竞赛论文  2024泰迪杯  AI  自动评阅  

更新时间;2024-4-6

【2024泰迪杯】C 题:竞赛论文的辅助自动评阅 Python 代码实现

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛 C 题:竞赛论文的辅助自动评阅
在这里插入图片描述

相关链接

  1. 【2024泰迪杯】A 题:生产线的故障自动识别与人员配置 Python代码实现

  2. 【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索Python代码实现

  3. 【2024泰迪杯】B 题:基于多模态特征融合的图像文本检索Python代码baseline

  4. 【2024泰迪杯】C 题:竞赛论文的辅助自动评阅 问题分析及Python 代码实现

1 题目

一、问题背景

近年来我国各领域各层次学科竞赛百花齐放,层出不穷,学生参与度也越来越高。随着参赛队伍的增加,评阅论文的工作量急剧增加,这对评阅论文的人力要求也越来越大。因此引入机器辅助评阅成为竞赛主办方的现实需求。

在学术界,建立基于 AI 的学术论文自动评审模型已得到了许多研究者的关注。论文的自动评阅涉及多种传统的自然语言处理技术如文本分类、信息抽取、论辩挖掘等。近年来,随着深度学习和自然语言处理技术的不断发展,特别是以 GPT 为代表的大语言模型的出现,进一步促进了论文自动评阅技术的发展,使得利用 AI 进行文本的自动评阅变得越来越可行,逐步从实验室走向学校和更多组织机构,成为当前的技术热点。但是在特定领域实现论文自动评阅仍然存在很多挑战,需要利用预训练的大语言模型适配具体的应用场景来解决问题。

二、解决问题

1、构造论文质量特征

每个指标的分数范围为 0-10 分。

(1) 论文的完整性评价

对照赛题,比对竞赛论文中相关问题的章节或段落,对论文的完整性进行评价。评估竞赛论文是否能完整解答赛题,并给出评价论文完整性的技术手段和评分标准。

(2) 论文有无实质性工作

对照赛题评阅要点,查找竞赛论文中相关问题的章节或段落,考察论文是否就赛题问题做出了相关的研究。需给出相关的技术方法和评价标准。

(3) 摘要质量

摘要与内容的一致性评价。评价摘要是否如实反映正文的中心思想,即衡量内容摘要与正文的相关性、一致性。需给出摘要质量评价指标及其依据。

(4) 写作水平评价

评价文字流畅性、写作规范(图、表、摘要)性和论文逻辑性。在传统论文评分(essay scoring)技术基础上,从文本通顺、立意分析、篇章结构、论证挖掘等维度进行探索,挖掘文本蕴含的论点论据、论证关系、结构信息,结合论证挖掘角度评估论文一致性、逻辑性,综合给出论文写作水平的评分。

2、竞赛论文辅助评分

根据上面构造的各项评分指标建立论文的整体评分模型,根据提供的论文集,按照十分制给出每篇论文的综合评分,将结果保存到 result.xlsx 文件中。综合评分结果要求满足如下限制条件:

8-10 分的不超过 3%;

6-7 分的不少于 10%,6-10 分不超过 15%;

4-5 分不少于 20%,4-10 分不超过 35%;

其他的为 0-3 分。

一般而言,在综合评分中论文的完整性和写作水平的分数占比之和不超过 40%。

注 1 若使用预训练的大语言模型完成赛题任务,需要给出实现过程,如提问时使用的提示词及如何进一步利用提问结果。

注 2 自 2022 年底 ChatGPT 发布以来,大语言模型的能力突飞猛进,可考虑将大语言模型技术应用于本次竞赛。一方面可考虑使用 ChatGPT、讯飞星火、文心一言、智谱清言等国内外大模型接口,基于大语言模型设计算法和构建合适的提示词等,辅助完成本赛题的任务。另一方面也可考虑微调训练开源大语言模型,例如 ChatGLM、Qwen、Baichuan 等系列开源大语言模型,设计训练任务,让知识赋能大语言模型以更好地解决问题。

三、附件说明

附件 1 为竞赛论文集,附件 2 为赛题和参考评阅标准,附件 3 为 result.xlsx 的结果模板。

1 result.xlsx 样例

论文编号 完整性 实质性 摘要 写作水平 综合评分
C001 …… …… …… …… ……

2 问题分析

2.1 问题一

论文的完整性评价。

  • 使用文本分析技术,如 PdfMiner是一个功能强大的PDF处理工具,可以根据实际需要进一步对提取的文本内容进行分析,识别论文结构中与赛题相关的章节或段落,比如问题陈述、模型建立、模型求解、结果分析等。
  • 评估论文结构的逻辑完整性和条理性,查看论文是否按照标准的学术论文结构进行组织,并对每个部分的逻辑顺序进行评估。

2.2 问题二

评估论文是否就赛题问题做出了相关的研究,则使用自然语言处理的方法,抽取论文每个段落的关键词,与赛题给出的关键词进行对比评分。

  • 首先使用自然语言处理的方法,如分词、词性标注和句法分析,将论文分成段落或句子。
  • 然后采用主题建模方法,如Latent Dirichlet Allocation (LDA)或其它话题模型,从文本中识别与赛题相关的主题或话题,以确定哪些部分涉及与赛题相关的内容。
  • 结合语义分析技术,如词向量模型或深度学习模型,量化评估问题陈述部分是否包含了关键信息,例如问题的关键词、目标和约束条件。

2.3 问题三

衡量论文摘要与正文的相关性和一致性,并对摘要进行质量评价打分,可以借助文本相似度、主题模型、关键词抽取和语义分析等方法。

(1)文本相似度分析

  • 利用词袋模型、TF-IDF、Word2Vec或BERT等方法,计算论文摘要与正文之间的相似度。可以采用余弦相似度或Jaccard相似度等指标。如果摘要与正文内容相关性高,相似度分数会相应增加。

(2)主题模型分析

使用主题模型如Latent Dirichlet Allocation (LDA)或潜在语义分析(LSA),比较摘要中的主题与正文中的主题,以评估摘要是否涵盖了论文的核心主题。。

(3)关键词抽取与比对

使用关键词抽取技术,比较摘要中提取的关键词和正文中的关键词,检查它们的一致性和覆盖度。分析摘要中提取的关键词是否在正文中有对应的论述。

(4)语义分析与信息覆盖度

利用自然语言处理技术,分析摘要中涉及的信息在正文中的覆盖程度,包括实体识别、概念匹配等。分析摘要中涉及的重要信息在正文中的覆盖情况。

2.4 问题四

评价文字流畅性、写作规范和论文逻辑性,涉及到文本通顺、立意分析、篇章结构、论证挖掘等多个维度。传统论文评分技术结合了自然语言处理和机器学习技术进行综合评估,下面是一些技术细节、评价指标及其依据:

(1)文本通顺性评价

使用使用句法分析器,如StanfordNLP、Spacy等,对句子进行语法分析,识别句子中的主语、谓语、宾语等成分,以及句法结构关系。检测句子内部的语法结构是否合理。应用词义消歧、语义角色标注等技术,检测句子之间的逻辑衔接和连贯性;

(2)写作规范性评价:

使用Python的库NLTK或spaCy,来对论文中的图表标注进行文本解析和识别。结合正则表达式和规则匹配,检测图表标题、标签、图表内容等是否符合规范格式。可以使用正则表达式来匹配特定格式的图表标题和标签。

(3)立意分析评价:

应用聚类分析和关键词抽取,分析文本中表达的核心观点和立意。

(4)篇章结构

使用词性标注和文本匹配技术,识别文本中的桥接词或过渡性词语,以评估段落间的连接和衔接情况,来表示篇章之间的逻辑关系。

(5)论证挖掘评价

利用ChatGPT、讯飞星火、文心一言等大模型分析论文中的论点、论据、论证关系,评估其合理性和逻辑性。

3 Python代码实现

3.1 问题一

使用PdfMiner提取PDF文档中的章节和段落信息,并打分

import re
from pdfminer.high_level import extract_text

# 读取PDF文件内容
def extract_pdf_text(pdf_path):
    return extract_text(pdf_path)

# 识别标题结构
def recognize_structure(text, titles):
    recognized_titles = [title for title in titles if re.search(title, text, re.IGNORECASE)]
    return recognized_titles

# 评估结构的逻辑完整性和条理性
def evaluate_structure(recognized_titles, expected_titles):

    
    if recognized_titles == expected_titles:
        logic_score = 1
    else:
        logic_score = round(len(recognized_titles) / len(expected_titles),1)
    
    return logic_score

pdf_path = "data/B20104870036.pdf"  
expected_titles = ["摘要", "目录", "问题重述", "假设条件", "符号说明", "模型建立", "模型求解", "模型检验", "结果分析", "结论", "参考文献", "附录"]
text = extract_pdf_text(pdf_path)
recognized_titles = recognize_structure(text, expected_titles)

score = evaluate_structure(recognized_titles, expected_titles)
# 0到1之间,如果要十分制,乘以10即可
print(f"论文结构的逻辑完整性和条理性得分: {
      score:.2f}")

请添加图片描述

3.2 问题二

import re
from pdfminer.high_level import extract_text
import spacy
import gensim
import numpy as np
import jieba
from gensim.parsing.preprocessing import STOPWORDS
import os

# 加载中文模块
nlp = spacy.load("zh_core_web_sm")
# 读取PDF文件内容
def extract_pdf_text(pdf_path):
    return extract_text(pdf_path)

# 将文本分成段落或句子
def segment_text(text):
    ...return segments

# 从文本中提取赛题相关的关键词
def extract_keywords(segments,stop_keywords):
    ...return keywords

# 从文本中识别与赛题相关的主题或话题
def evaluate_problem_statement(topics, keywords):
    # 输出每个主题的关键词
    topic_words = []
    for topic in topics:
        topic_num = topic[0]
        topic_keywords = [word[0] for word in topic[1]]
        topic_words.extend(topic_keywords)
        print(f"主题{
      topic_num+1}的关键词:{
      topic_keywords}")

    topic_coverage = len(set(keywords) & set(topic_words)) / len(keywords)
    return round(topic_coverage,2)

  
problem_pdf_path = "data/2020华为杯B题题目.pdf"  # 赛题题目
paper_pdf_path = "data/B20104870036.pdf"    # 论文

# 读取文件内容
problem_text = extract_pdf_text(problem_pdf_path)
paper_text = extract_pdf_text(paper_pdf_path)

# 将文本分成段落或句子
problem_segments = segment_text(problem_text)
# 使用哈工大中文停用词库
chinese_stopwords = [line.strip() for line in open('data/hit_stopwords.txt', encoding='utf-8').readlines()]

# 去除中文停用词和符号
filtered_paper_text = [word for word in jieba.cut(paper_text) if word not in chinese_stopwords and word.strip()]

# 从文本中提取赛题相关的关键词
problem_keywords = extract_keywords(problem_segments,chinese_stopwords)
dict_file = 'data/custom_dict.txt'
if not os.path.exists(dict_file):
    # 将自定义词典列表写入文件
    with open(dict_file, 'w', encoding='utf-8') as f:
        for word in problem_keywords:
            f.write(word + ' 10 n' + '\n')  

# 把题目中的关键词,加入自定义词典
jieba.load_userdict(dict_file)

# 创建并训练LDA主题模型
num_topic = 10
paper_dictionary = gensim.corpora.Dictionary([paper_segment.lower().split() for paper_segment in filtered_paper_text])
paper_bow_corpus = [paper_dictionary.doc2bow(segment.lower().split()) for segment in filtered_paper_text]
lda_model = gensim.models.LdaModel(paper_bow_corpus, id2word=paper_dictionary, num_topics=num_topic, passes=10)

# 获取主题关键词
topics = lda_model.show_topics(num_topics=num_topic, num_words=20, formatted=False)
# 从文本中识别与赛题相关的主题或话题
# 0到1之间,如果要十分制,乘以10即可
problem_statement_score = evaluate_problem_statement(topics, problem_keywords)
print(f"论文相关性得分: {
      problem_statement_score}")

请添加图片描述

3.3 问题三

使用国内GPT的API,kimi是免费且支持200万token的大模型

import requests
import json
import os

# 通过AI API生成文本
def AI_chat(user_message):
    MOONSHOT_API_KEY = "自己的API KEY"

    headers = {
    
        'Content-Type': 'application/json',     
        'Authorization': f'Bearer {
      MOONSHOT_API_KEY}',
    }

    data = {
    
        "model": "moonshot-v1-32k",     
        "messages": [
            {
    "role": "user", "content": user_message}  
        ],
        "temperature": 0.5,
    }

    response = requests.post('https://api.....', headers=headers, data=json.dumps(data))
    response_json = response.json()
    assistant_message = response_json['choices'][0]['message']['content']

    return assistant_message

读取论文中摘要和正文的内容

from pdfminer.high_level import extract_text
import re
# 读取PDF文件内容
# 使用正则表达式提取摘要部分和正文部分
def extract_abstract_and_body(pdf_path):
   full_text = extract_text(pdf_path)
   # 去除文本中的空格和空行
   full_text = full_text.replace(' ','').replace('\n','')
   # 移除掉目录项,假设目录项以数字加页码的形式出现,例如 "1 引言...2"
   full_text = re.sub(r'\d+\s+.*\.\.\.\s+\d+','',full_text) 
   # 修复可能的分页导致关键词被割断的问题
   repaired_text = full_text.replace('-\n','').replace('\n',' ')

   # 找到‘摘要’和‘关键词’之间的文本
   ...# 找到正文起始关键词后的所有文本作为正文
   ...# 清除摘要与正文之间可能多余的标题等内容
   return abstract.strip(),body.strip()


# 计算摘要与正文的相关性和一致性,并进行质量评价打分
def evaluate_summary(summary, content):
    # 构建提示词
    user_message = f"请计算以下论文摘要与正文的相关性和一致性,并进行质量评价打分(输出1到10分之间),要求只输出最终的评分数字,如9:\n摘要: {
      summary}\n正文: {
      content}"
    # 使用kimi_chat函数获取结果
    result = AI_chat(user_message)
   #  解析返回的结果以获取分数
    try:
        number = re.search(r'\d+',result).group(0)  # 使用正则表达式提取整数数字
        score = int(number)  # 将提取的数字转换为整数类型
        return score
    except ValueError:
        return "无法解析分数,请确保返回的内容包含一个整数值。"
paper_file_path = "data/B20100040057.pdf" # 论文
# 读取摘要和正文
summary_paper, content_paper = extract_abstract_and_body(paper_file_path)


# 计算相关性和一致性,并进行质量评价打分
score = evaluate_summary(summary_paper,content_paper)
print(f"论文摘要的质量评价分数是: {
      score}")

在这里插入图片描述

3.4 问题四

import pdfminer
from pdfminer.high_level import extract_text
import spacy
import re
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from spacy.tokens import Doc
import jieba.analyse
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 载入中文NLP模型
nlp = spacy.load('zh_core_web_sm')


# 使用哈工大中文停用词库
stop_words = [line.strip() for line in open('data/hit_stopwords.txt', encoding='utf-8').readlines()]

# 读取PDF文件函数
def read_pdf(file_path):
   
   text = extract_text(file_path)
   # 去除文本中的空格和空行
   full_text = text.replace(' ','').replace('\n','')
   return full_text

# 评价语法结构
def evaluate_text_flow(text):
    ...# 最后,必须确保分数介于0到10之间
    flow_score = min(10, flow_score)

    # 标准化分数
    if len(sentences) > 1:
        norm_score = (flow_score / (len(sentences)-1)) * 10
        return norm_score
    else:
        # 如果只有一句话,则不适用流程评分标准
        return 10


# 写作规范性评价函数
def evaluate_writing_standard(text):
   ...return standard_score



# 篇章结构评价函数
def evaluate_structure(text):
   ...# 将分数归一化到0-10分之间
   return min((structure_score / len(list(doc.sents))) * 10,10)


# 定义评价论文立意的函数
def evaluate_intention(prob_keywords,paper_keywords):
   ...return score

problem_pdf = "data/2020华为杯B题题目.pdf"  # 赛题题目
paper_pdf = "data/B20100040057.pdf"    # 论文
# 读取pdf文件
problem_text = read_pdf(problem_pdf)
paper_text = read_pdf(paper_pdf)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 完整资料

完整代码下载
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43935696/article/details/136644484

智能推荐

874计算机科学基础综合,2018年四川大学874计算机科学专业基础综合之计算机操作系统考研仿真模拟五套题...-程序员宅基地

文章浏览阅读1.1k次。一、选择题1. 串行接口是指( )。A. 接口与系统总线之间串行传送,接口与I/0设备之间串行传送B. 接口与系统总线之间串行传送,接口与1/0设备之间并行传送C. 接口与系统总线之间并行传送,接口与I/0设备之间串行传送D. 接口与系统总线之间并行传送,接口与I/0设备之间并行传送【答案】C2. 最容易造成很多小碎片的可变分区分配算法是( )。A. 首次适应算法B. 最佳适应算法..._874 计算机科学专业基础综合题型

XShell连接失败:Could not connect to '192.168.191.128' (port 22): Connection failed._could not connect to '192.168.17.128' (port 22): c-程序员宅基地

文章浏览阅读9.7k次,点赞5次,收藏15次。连接xshell失败,报错如下图,怎么解决呢。1、通过ps -e|grep ssh命令判断是否安装ssh服务2、如果只有客户端安装了,服务器没有安装,则需要安装ssh服务器,命令:apt-get install openssh-server3、安装成功之后,启动ssh服务,命令:/etc/init.d/ssh start4、通过ps -e|grep ssh命令再次判断是否正确启动..._could not connect to '192.168.17.128' (port 22): connection failed.

杰理之KeyPage【篇】_杰理 空白芯片 烧入key文件-程序员宅基地

文章浏览阅读209次。00000000_杰理 空白芯片 烧入key文件

一文读懂ChatGPT,满足你对chatGPT的好奇心_引发对chatgpt兴趣的表述-程序员宅基地

文章浏览阅读475次。2023年初,“ChatGPT”一词在社交媒体上引起了热议,人们纷纷探讨它的本质和对社会的影响。就连央视新闻也对此进行了报道。作为新传专业的前沿人士,我们当然不能忽视这一热点。本文将全面解析ChatGPT,打开“技术黑箱”,探讨它对新闻与传播领域的影响。_引发对chatgpt兴趣的表述

中文字符频率统计python_用Python数据分析方法进行汉字声调频率统计分析-程序员宅基地

文章浏览阅读259次。用Python数据分析方法进行汉字声调频率统计分析木合塔尔·沙地克;布合力齐姑丽·瓦斯力【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)035【摘要】该文首先用Python程序,自动获取基本汉字字符集中的所有汉字,然后用汉字拼音转换工具pypinyin把所有汉字转换成拼音,最后根据所有汉字的拼音声调,统计并可视化拼音声调的占比.【总页数】2页(13-14)【关键词】数据分析;数据可..._汉字声调频率统计

linux输出信息调试信息重定向-程序员宅基地

文章浏览阅读64次。最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0)。因为后期要使用ttySAC0作为上层应用通信串口,所以要把所有的调试信息都给去掉。参考网上的几篇文章,自己做了如下修改,终于把调试信息重定向到ttySAC1上了,在这做下记录。参考文章有:http://blog.csdn.net/longt..._嵌入式rootfs 输出重定向到/dev/console

随便推点

uniapp 引入iconfont图标库彩色symbol教程_uniapp symbol图标-程序员宅基地

文章浏览阅读1.2k次,点赞4次,收藏12次。1,先去iconfont登录,然后选择图标加入购物车 2,点击又上角车车添加进入项目我的项目中就会出现选择的图标 3,点击下载至本地,然后解压文件夹,然后切换到uniapp打开终端运行注:要保证自己电脑有安装node(没有安装node可以去官网下载Node.js 中文网)npm i -g iconfont-tools(mac用户失败的话在前面加个sudo,password就是自己的开机密码吧)4,终端切换到上面解压的文件夹里面,运行iconfont-tools 这些可以默认也可以自己命名(我是自己命名的_uniapp symbol图标

C、C++ 对于char*和char[]的理解_c++ char*-程序员宅基地

文章浏览阅读1.2w次,点赞25次,收藏192次。char*和char[]都是指针,指向第一个字符所在的地址,但char*是常量的指针,char[]是指针的常量_c++ char*

Sublime Text2 使用教程-程序员宅基地

文章浏览阅读930次。代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。我用过的编辑器不少,真不少~ 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号。它小巧绿色且速度非

对10个整数进行按照从小到大的顺序排序用选择法和冒泡排序_对十个数进行大小排序java-程序员宅基地

文章浏览阅读4.1k次。一、选择法这是每一个数出来跟后面所有的进行比较。2.冒泡排序法,是两个相邻的进行对比。_对十个数进行大小排序java

物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)_网络调试助手连接阿里云连不上-程序员宅基地

文章浏览阅读2.9k次。物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)其实作者本意是使用4G模块来实现与阿里云物联网平台的连接过程,但是由于自己用的4G模块自身的限制,使得阿里云连接总是无法建立,已经联系客服返厂检修了,于是我在此使用网络调试助手来演示如何与阿里云物联网平台建立连接。一.准备工作1.MQTT协议说明文档(3.1.1版本)2.网络调试助手(可使用域名与服务器建立连接)PS:与阿里云建立连解释,最好使用域名来完成连接过程,而不是使用IP号。这里我跟阿里云的售后工程师咨询过,表示对应_网络调试助手连接阿里云连不上

<<<零基础C++速成>>>_无c语言基础c++期末速成-程序员宅基地

文章浏览阅读544次,点赞5次,收藏6次。运算符与表达式任何高级程序设计语言中,表达式都是最基本的组成部分,可以说C++中的大部分语句都是由表达式构成的。_无c语言基础c++期末速成