当前位置: 首页 > news >正文

【2025年泰迪杯数据挖掘挑战赛】A题 数据分析+问题建模与求解+Python代码直接分享

目录

  • 2025年泰迪杯数据挖掘挑战赛A题
  • 完整论文:建模与求解Python代码
  • 1问题一的思路与求解
    • 1.1 问题一的思路
      • 1.1.1对统计数据进行必要说明:
      • 1.1.2统计流程:
      • 1.1.3特殊情况的考虑:
    • 1.2 问题一的求解
      • 1.2.1代码实现
      • 1.2.2 问题一结果
      • 代码分享
  • 2 问题二的思路与求解
    • 2.1 问题二的思路
      • 2.1.1检测方法的设计:
      • 2.1.2统计流程:
      • 2.1.3特殊情况的考虑:
      • 2.1.4 问题二模型的建立
        • 1. 单棵决策树的构建(CART算法)
        • 2. 随机森林集成
        • 3. 特征重要性计算
        • 4. 概率输出(Soft Voting)
        • 5. 模型决策规则
    • 2.2 问题二的求解
      • 2.2.1特征工程
      • 2.2.2代码实现

2025年泰迪杯数据挖掘挑战赛A题

完整论文:建模与求解Python代码

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

1问题一的思路与求解

1.1 问题一的思路

首先,题目要求对竞赛论文的基本信息进行统计,保存到result1.xlsx中。附件1提供了参赛队伍的信息,其中加密号对应附件3的文件名。
根据附件4中的result1.xlsx模板,需要统计的列包括论文标题、总页数、总字数、摘要页数和字数、目录页数、正文页数和字数,还有图片数、表格数、独立公式数、参考文献数量等。此外,还包括一些比例,比如图片所占比例,以及平均句子数和平均字数等。

1.1.1对统计数据进行必要说明:

  • 总页数:PDF文件的总页数,使用PyPDF2或pdfplumber获取。
  • 总字数:提取所有文本后统计字符数(包括空格和标点)。
  • 摘要页数与字数:定位包含“摘要”或“Abstract”的页面,统计其页数和字数。
  • 目录页数:定位“目录”或“Contents”部分,统计其页数。
  • 正文页数与字数:正文起始页为目录结束页+1,结束于参考文献起始页-1,统计页数和字数。
  • 正文图片数:统计正文中所有Image对象的数量。
  • 正文图片所占比例:正文图片数 / 总图片数。
  • 正文表格数:使用pdfplumber提取表格数量。
  • 正文独立公式数:正则表达式匹配LaTeX公式块(如[…])。
  • 正文段落平均句子数与字数:使用句号、问号、感叹号分句,计算句子数和平均字数。
  • 参考文献数量:统计参考文献部分的条目数(以[数字]开头)。

1.1.2统计流程:

(1)读取PDF文件:使用Python库如PyPDF2、pdfplumber或PyMuPDF来读取PDF内容,提取文本、图片、表格等信息。
(2)提取元数据:获取总页数。
(3)分部分统计页数和字数:

  • 摘要:识别摘要部分,通常位于开头,可能有“摘要”或“Abstract”作为标题。需要找到该部分的起始页和结束页,统计该部分的页数和字数。
  • 目录:查找“目录”或“Contents”部分,统计其页数和字数。
  • 正文:正文可能从引言开始,直到参考文献之前。需要确定正文的起始和结束位置。

(4)统计图片数:遍历每一页,检测PDF中的图片对象,统计总数。
(5)统计表格数:检测PDF中的表格结构,可能需要使用pdfplumber的表格提取功能。
(6)统计独立公式数:可能需要分析文本中的公式模式,如识别被括号包围的公式编号,或者使用正则表达式匹配公式结构。
(7)参考文献数量:找到参考文献部分,统计条目数量,通常每个条目以编号或作者开头。
(8)计算平均句子数和平均字数:以句号、问号、感叹号作为句子分隔符,对正文文本进行分句和分词统计。

1.1.3特殊情况的考虑:

  1. 摘要和目录的灵活匹配:有些论文可能将“摘要”写成“摘 要”或“摘 要”等变体形式,存在空格或其他格式变化。
    解决方案:使用正则表达式模糊匹配,忽略空格和特殊字符。例如,匹配“摘\s要”或“目\s录”。
  2. 正文范围的优化:若参考文献起始页与正文最后一页同一页时,以参考文献的前一页推算正文页数的方法可能错误地将部分正文页排除。
    解决方案:定位参考文献起始段落的位置,而不是整个页面。例如,找到“参考文献”所在的段落起始位置,正文结束于该段落的开始位置。
  3. 独立公式数的统计优化:表格中的公式可能未被检测。
    解决方案:在提取表格内容后,对表格内的文本也进行公式匹配。
  4. PDF为图片型文档的处理:对于整个页面为图片的PDF,无法提取文本,导致字数统计为0。
    解决方案:使用OCR工具(如Tesseract)对图片型PDF进行文本提取。
  5. 标题跨行:如果标题跨越多行,不进行特殊处理只会获取到第一行,标题不完整。
    解决方案:提取第一页的所有行,合并从第一行开始,直到遇到分隔线、空行或特定关键词(如“摘要”)。
  6. 正文页数的判定:若论文格式不规范,当论文没有目录或参考文献时,正文页数会统计错误。
    解决方案:修改判断逻辑:
    正文起始页判定:①如果存在目录,正文从目录页后一页开始;②如果没有目录,则尝试从摘要后的页面开始正文;③如果连摘要也未找到,默认正文从第一页开始(假设标题页后即为正文)。
    正文结束页判定:①仍然以参考文献或附录作为结束标志;②若无参考文献或附录,则以总页数为结束页。

1.2 问题一的求解

1.2.1代码实现

Step1:使用pandas读取附件1.xlsx,创建字典,键为加密号,值为参赛队号和其他信息,从而获取加密号与参赛队号的对应关系。
Step2:遍历附件3中的PDF文件,对于每个PDF文件:
a. 使用pdfplumber打开,获取总页数。
b. 提取所有页面的文本,并存储每页的文本和对象(图片、表格等)。
c. 定位摘要、目录、正文、参考文献部分:

  • 摘要:搜索页面中的“摘要”或“Abstract”,确定其起始页和结束页(可能摘要仅在一页)。
  • 目录:同样通过关键词定位。
  • 正文:可能从目录后的页面开始,或者根据章节标题判断。
  • 参考文献:找到“参考文献”或“References”部分,统计条目数。

d. 统计图片数:遍历每页的images属性,统计总数。
e. 统计表格数:使用pdfplumber的extract_tables(),统计所有页面的表格数量。
f. 独立公式数:使用正则表达式匹配公式块,同时结合公式编号进行考虑。
g. 参考文献数量:统计参考文献部分的条目数。
h. 计算总字数:所有文本的总字符数,或者分词后的词语数。
i. 计算平均句子数和平均字数:对正文文本进行处理。
Step3:保存结果到result1.xlsx:使用pandas将统计结果写入Excel文件。

1.2.2 问题一结果

注意:本文档使用示例数据求解
展示部分输出结果:

在这里插入图片描述

对结果可视化:给大家提供了很多种图像参考,如果图像绘制出来后不明白如何分析,可以将代码和输入数据上传给AI,让它给出建议。

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

代码分享

import os
import pandas as pd
import pdfplumber
import re
from PyPDF2 import PdfReader
from pdf2image import convert_from_path
import pytesseractdef flexible_keyword_match(text, keywords):pattern = r'[\s\u3000]*'.join(list(keywords))return re.search(pattern, text or '') is not Nonedef ocr_pdf(pdf_path):images = convert_from_path(pdf_path)full_text = []for img in images:text = pytesseract.image_to_string(img, lang='chi_sim+eng')full_text.append(text)return full_textdef extract_title(first_page_text):"""提取论文标题,更准确地区分标题与摘要等其他内容"""if not first_page_text:return '无标题'# 按行分割lines = first_page_text.split('\n')non_empty_lines = [line.strip() for line in lines if line.strip()]# 检查是否有明确的"摘要"标记,这常常是标题与摘要的分界线abstract_index = -1for i, line in enumerate(non_empty_lines):if re.search(r'^摘\s*要$|^摘\s*[要約][\s\::]|^ABSTRACT$|^Abstract$', line):abstract_index = ibreak# 如果找到了摘要标记,则摘要标记之前的行(最多2)可能是标题if abstract_index > 0:# 一般标题在摘要之前的1-2行potential_title_lines = non_empty_lines[max(0, abstract_index-2):abstract_index]# 过滤掉明显不是标题的行title_lines = []for line in potential_title_lines:# 过滤掉包含特定关键词的行,如学院、作者等if not re.search(r'(学院|大学|指导老师|作者|姓名|学号|导师|系|专业|年级|班级)', line):title_lines.append(line)if title_lines:# 取最长的一行作为标题,或者合并多行if len(title_lines) == 1 or len(title_lines[0]) > 15:  # 如果只有一行或第一行够长return title_lines[0]else:return ' '.join(title_lines)  # 合并多行标题# 如果没有找到摘要标记,或者摘要标记之前没有合适的标题行# 尝试查找文档最开始的几行中可能的标题# 1. 论文标题通常是文档开头的1-3行中最长的那一行(长度适中,不会太短也不会太长)potential_titles = []for i, line in enumerate(non_empty_lines[:5]):  # 只考虑前5行line_length = len(line)if 4 < line_length < 50 and not re.search(r'(摘要|abstract|关键词|keywords|目录|contents)', line.lower()):# 根据行长度和位置计算可能性得分 - 通常标题比较靠前且长度适中score = (5-i) + min(line_length, 30)/10  # 位置越靠前分数越高,长度适中加分potential_titles.append((line, score))# 按得分排序potential_titles.sort(key=lambda x: x[1], reverse=True)if potential_titles:return potential_titles[0][0]  # 返回得分最高的行# 2. 如果上述方法失败,尝试更简单的方法:取文档第一个非空行if non_empty_lines:first_line = non_empty_lines[0]# 确保第一行不是太长,如果太长可能是段落而非标题if len(first_line) < 100:return first_linereturn first_line[:50] + "..."  # 截断过长的行# 3. 实在找不到合适的标题return "无标题"def count_code_lines(text):"""计算代码行数"""total_lines = 0# 查找代码块code_blocks = re.findall(r'```.*?```', text, re.DOTALL)for block in code_blocks:lines = block.split('\n')# 减去代码块标记total_lines += max(0, len(lines) - 2)# 查找附录中的代码行 - 搜索常见的代码模式code_patterns = [r'^\s*function\s+\w+',           # 函数定义r'^\s*def\s+\w+',                # Python函数定义r'^\s*for\s+\w+\s*=',            # for循环r'^\s*if\s+',                    # if语句r'^\s*else',                     # else语句r'^\s*while\s+',                 # while循环r'^\s*switch\s+',                # switch语句r'^\s*case\s+',                  # case语句r'^\s*try\s*{',                  # try块r'^\s*catch\s*{',                # catch块r'^\s*import\s+',                # import语句r'^\s*#include',                 # include语句r'^\s*return\s+',                # return语句r'^\s*\w+\s*=\s*\w+\(',          # 函数调用赋值r'^\s*\w+\s*\+=|\-=|\*=|/=',     # 运算赋值r'^\s*\w+\s*\+\+|\-\-',          # 自增自减r'^\s*//|^\s*#|^\s*%',           # 注释行r'^\s*\w+\s*:\s*$',              # 标签行r'^\s*\w+\s*\[.+\]\s*=',         # 数组赋值]# 检查文本行lines = text.split('\n')for line in lines:line = line.strip()# 如果行不在已识别的代码块中,检查是否匹配代码模式if any(re.match(pattern, line) for pattern in code_patterns):total_lines += 1return total_linesdef detect_formulas(text):"""识别文本中的独立数学公式"""formula_count = 0# 查找标准公式模式 (LaTeX风格的公式)latex_formulas = re.findall(r'\$\$.*?\$\$|\\\[.*?\\\]', text, re.DOTALL)formula_count += len(latex_formulas)# 按行分析文本lines = text.split('\n')i = 0while i < len(lines):line = lines[i].strip()# 跳过空行或太短的行if not line or len(line) < 3:i += 1continue# 跳过标题、章节号等if re.match(r'^[【(\[【\d\.]|^参考文献|^附录|^表\s|^图\s', line):i += 1continue# 检查是否是独立公式行(前后都是空行或段落分隔)is_isolated_line = Falseif i > 0 and i < len(lines) - 1:prev_line = lines[i-1].strip()next_line = lines[i+1].strip()is_isolated_line = (not prev_line or prev_line.endswith('.')) and (not next_line or re.match(r'^[A-Z\u4e00-\u9fff]', next_line))# 独立公式行的特征检查if is_isolated_line:# 1. 包含典型数学符号has_math_symbols = bool(re.search(r'[+\-*/=()[\]{}∫∑∏∇∆]|∂|∇', line))# 2. 包含典型公式结构(如变量和运算符的组合)has_formula_structure = bool(re.search(r'[a-zA-Z][\s]*[+\-*/=><]', line))# 3. 有公式编号或居中对齐has_formula_numbering = bool(re.search(r'\(\d+\)$|\[\d+\]$', line))# 4. 行只包含公式相关内容(不含普通文本的整句)is_formula_only = not re.search(r'[。,;:?!""()]', line) and len(line.split()) <= 5# 公式需满足的条件组合if has_math_symbols and has_formula_structure and (has_formula_numbering or is_formula_only):formula_count += 1i += 1continue# 检查连续的多行公式(当前行和下一行都有数学符号且没有普通句子标点)if i < len(lines) - 1:next_line = lines[i+1].strip()if (re.search(r'[+\-*/=()[\]{}]', line) and re.search(r'[+\-*/=()[\]{}]', next_line) and not re.search(r'[。,;:?!""()]', line) andnot re.search(r'[。,;:?!""()]', next_line)):# 确认是否为延续性公式(一般公式比普通文本短,且两行都没有完整句)if len(line) < 60 and len(next_line) < 60 and not line.endswith('。'):formula_count += 1i += 2  # 跳过下一行,因为它是公式的一部分continuei += 1return formula_countdef detect_appendix_pages(full_text):"""识别附录页面并计算附录页数"""appendix_start = None# 查找附录开始的页码for i, text in enumerate(full_text):if re.search(r'^附录\s*$|^附录[::\s]|^\d+[\s\.、]*附录', text.strip()) or re.search(r'附\s*录', text[:20]):appendix_start = ibreak# 如果找不到明确的"附录"标题,尝试查找"参考文献"之后的内容if appendix_start is None:ref_end = Nonefor i, text in enumerate(full_text):if re.search(r'^参考文献\s*$|^参考文献[::\s]|^\d+[\s\.、]*参考文献', text.strip()):ref_end = i# 在参考文献之后查找可能是附录的内容for j in range(ref_end + 1, len(full_text)):if re.search(r'附录\s*\d+|^附\s*\d+|程序代码|附\s*代码|附表|附图|附\s*[A-Za-z]', full_text[j]):appendix_start = jbreakbreak# 如果仍然找不到附录,查找最后一个"参考文献"之后的所有内容if appendix_start is None:for i in reversed(range(len(full_text))):if re.search(r'^参考文献\s*$|^参考文献[::\s]|^\d+[\s\.、]*参考文献', full_text[i].strip()):# 确保参考文献不是最后一页if i + 1 < len(full_text):appendix_start = i + 1break# 如果找到了附录开始页if appendix_start is not None and appendix_start < len(full_text):appendix_pages = len(full_text) - appendix_start# 检查是否是真正的附录内容appendix_content = ' '.join(full_text[appendix_start:])has_appendix_content = (re.search(r'附录\s*\d+|附\s*\d+|附表|附图|程序代码|代码清单|function|def\s+\w+|import\s+|#include|void\s+\w+\s*\(', appendix_content) orlen(re.findall(r'\b(for|if|while|return|print|int|float|char|string)\b', appendix_content)) > 3)if has_appendix_content:return appendix_pages, appendix_start# 默认情况下返回0(没有找到附录)和None(没有找到附录开始页)return 0, Nonedef count_references(text):"""统计参考文献数量,考虑多种常见引用格式"""# 定义可能的参考文献格式模式patterns = [r'[\[\(]\d+[\]\)]',          # 匹配[1](1)等标准格式r'【\d+】',                   # 匹配【1】等中文方括号格式r'^\s*\[\d+\]',              # 匹配行首的[1]等(适用于参考文献列表)r'^\s*【\d+】',               # 匹配行首的【1】等r'^\s*\(\d+\)',              # 匹配行首的(1)等r'^\s*\d+\.\s'               # 匹配行首的"1. "等格式]# 将参考文献文本分割成行,便于处理行首模式lines = text.split('\n')# 对于行首模式(最后三种模式),直接在行中计数line_count = 0for line in lines:if (re.match(r'^\s*\[\d+\]', line) or re.match(r'^\s*【\d+】', line) or re.match(r'^\s*\(\d+\)', line) or re.match(r'^\s*\d+\.\s', line)):if re.search(r'[A-Za-z\u4e00-\u9fff]', line):  # 确保有实际内容line_count += 1# 如果通过行首模式找到了参考文献,直接返回if line_count > 0:return line_count# 否则使用第一种和第二种模式进行全文搜索# 注意:这种方法可能会过度计数,因为正文中也可能有[1]这样的引用pattern_count = len(re.findall(r'[\[\(]\d+[\]\)]', text)) + len(re.findall(r'【\d+】', text))# 还可以尝试查找格式化的参考文献格式,如"[1] 作者名"formatted_count = len(re.findall(r'([\[\(]\d+[\]\)]|【\d+】)\s+[A-Za-z\u4e00-\u9fff]', text))# 根据实际情况返回更合理的计数if formatted_count > 0:return formatted_countreturn pattern_count# 读取参赛队信息
df_teams = pd.read_excel('附件1.xlsx', sheet_name='Sheet1')
team_mapping = df_teams.set_index('加密号')['参赛队号'].to_dict()results = []
pdf_folder = '附件3/'for filename in os.listdir(pdf_folder):if not filename.endswith('.pdf'):continueencryption_code = filename.split('.')[0]team_number = team_mapping.get(encryption_code, '未知')pdf_path = os.path.join(pdf_folder, filename)with pdfplumber.open(pdf_path) as pdf:# OCR处理判断first_page_text = pdf.pages[0].extract_text()if not first_page_text:full_text = ocr_pdf(pdf_path)else:full_text = [page.extract_text() or '' for page in pdf.pages]total_pages = len(pdf.pages)total_words = sum(len(text) for text in full_text)# 摘要统计abstract_pages, abstract_words = 0, 0for i, text in enumerate(full_text):if flexible_keyword_match(text, '摘要') or flexible_keyword_match(text, 'Abstract'):abstract_pages += 1abstract_words += len(text)break  # 假设摘要只占一页# 目录统计toc_pages, toc_words = 0, 0for i, text in enumerate(full_text):if flexible_keyword_match(text, '目录') or flexible_keyword_match(text, 'Contents'):toc_pages += 1toc_words += len(text)break# 修改正文起始页的判定逻辑body_start = None# 情况1:存在目录for i, text in enumerate(full_text):if flexible_keyword_match(text, '目录') or flexible_keyword_match(text, 'Contents'):body_start = i + 1break# 情况2:没有目录,但存在摘要if body_start is None:for i, text in enumerate(full_text):if flexible_keyword_match(text, '摘要') or flexible_keyword_match(text, 'Abstract'):# 假设摘要可能跨多页,正文从摘要最后一页的下一页开始abstract_end = ibody_start = abstract_end + 1break# 情况3:既无目录也无摘要,默认正文从第一页开始if body_start is None:body_start = 0  # 或根据实际情况跳过标题页(如 body_start = 1)# 查找参考文献部分ref_start_page = Nonefor i, text in enumerate(full_text):if (re.search(r'^参考文献\s*$|^参考文献[::\s]|^\d+[\s\.、]*参考文献', text.strip()) or re.search(r'^References\s*$|^REFERENCES\s*$', text.strip())):ref_start_page = ibreak# 找不到明确的"参考文献"标题,尝试其他方法查找if ref_start_page is None:# 搜索包含参考文献的行for i, text in enumerate(full_text):if re.search(r'参\s*考\s*文\s*献', text[:50]):  # 只在页面开头部分查找ref_start_page = ibreak# 从参考文献开始到结束的所有页面中提取文本ref_count = 0if ref_start_page is not None:# 获取参考文献部分至文档结束的文本ref_text = '\n'.join(full_text[ref_start_page:])# 尝试限定参考文献部分(避免计算后续章节)next_section_match = re.search(r'\n(附录|appendix|附\s*录|APPENDIX)\s*\n', ref_text, re.IGNORECASE)if next_section_match:ref_text = ref_text[:next_section_match.start()]# 计算参考文献数量ref_count = count_references(ref_text)# 如果数量不合理(例如太大),尝试使用更严格的计数方法if ref_count > 50:  # 假设超过50篇引用不太常见ref_text_lines = ref_text.split('\n')strict_count = 0for line in ref_text_lines:# 只计算那些看起来像参考文献条目开头的行if (re.match(r'^\s*\[\d+\]', line) or re.match(r'^\s*【\d+】', line) or re.match(r'^\s*\(\d+\)', line) or re.match(r'^\s*\d+\.\s', line)):if re.search(r'[A-Za-z\u4e00-\u9fff]', line):  # 确保有实际内容strict_count += 1if strict_count > 0:ref_count = strict_count# 使用新的附录检测函数appendix_pages, appendix_start = detect_appendix_pages(full_text)# 确定正文结束页 - 需要考虑参考文献和附录的位置body_end = total_pages  # 默认正文结束于最后一页# 如果找到参考文献,正文结束于参考文献开始页if ref_start_page is not None and ref_start_page > body_start:body_end = ref_start_page# 如果找到附录且附录在正文起始页之后,正文结束于附录开始页elif appendix_start is not None and appendix_start > body_start:body_end = appendix_start# 确保body_start和body_end合法,避免负数页数if body_start is None:body_start = 0if body_end <= body_start:body_end = body_start + 1  # 至少保证有1页正文body_pages = body_end - body_startbody_words = sum(len(full_text[i]) for i in range(body_start, body_end))# 计算附录代码行数appendix_code_lines = 0if appendix_start is not None:# 获取附录文本appendix_text = ''.join(full_text[appendix_start:])# 计算代码行数:包括代码块和直接在文本中显示的代码行appendix_code_lines = count_code_lines(appendix_text)# 如果没有明确的代码块,通过关键词和缩进来识别代码行if appendix_code_lines == 0:lines = appendix_text.split('\n')for line in lines:# 检查是否有代码行的特征,如function、forif、end等关键词if (re.search(r'^\s*(function|for|if|while|switch|case|else|end|return|try|catch)', line.strip()) orre.search(r'[{}();=%]', line) orre.search(r'^\s*[a-zA-Z0-9_]+\s*=', line)):appendix_code_lines += 1# 图片统计(全文和正文)total_image_count = 0for i in range(total_pages):total_image_count += len(pdf.pages[i].images)body_image_count = 0for i in range(body_start, body_end):if i < total_pages:  # 确保索引不超出范围body_image_count += len(pdf.pages[i].images)# 计算正文图片所占比例image_ratio = body_image_count / total_image_count if total_image_count > 0 else 0# 表格和公式统计(只统计正文)body_tables = 0body_formula_count = 0# 提取正文文本用于公式识别body_text = ''.join(full_text[body_start:body_end])body_formula_count = detect_formulas(body_text)# 统计表格数量for i in range(body_start, body_end):if i < total_pages:  # 确保索引不超出范围page = pdf.pages[i]tables = page.extract_tables()body_tables += len(tables)# 检查表格内容中的公式for table in tables:if table:for row in table:if row:for cell in row:if cell:table_formula_count = detect_formulas(str(cell))body_formula_count += table_formula_count# 参考文献数量ref_count = 0if ref_start_page is not None:ref_text = full_text[ref_start_page]# 查找常见的参考文献标记格式ref_patterns = [r'\[\d+\]',             # [1], [2], ...r'【\d+】',              # 【1,2, ...r'\(\d+\)',             # (1), (2), ...r'^\d+\.\s',            # 1. , 2. , ... (每行开头)r'^\[\d+\]\s',          # [1] , [2] ... (每行开头)r'^\d+\s[A-Z]',         # 1 Author, 2 Author, ... (数字开头的引用)]# 分行处理以便更好地识别每个文献条目lines = ref_text.split('\n')for line in lines:line = line.strip()for pattern in ref_patterns:if re.search(pattern, line):ref_count += 1break  # 找到一个匹配就跳出内层循环,避免重复计数# 如果仍未找到参考文献,尝试在全文本中查找if ref_count == 0 and ref_start_page < len(full_text) - 1:# 查看参考文献页之后的一页或几页for i in range(ref_start_page, min(ref_start_page + 3, len(full_text))):additional_text = full_text[i]lines = additional_text.split('\n')for line in lines:line = line.strip()for pattern in ref_patterns:if re.search(pattern, line):ref_count += 1break# 正文段落统计body_text = ''.join(full_text[body_start:body_end]) if body_start is not None else ''# 根据换行符分割段落,每个换行符代表一个新段落paragraphs = re.split(r'\n', body_text)paragraphs = [p.strip() for p in paragraphs if p.strip()]paragraph_count = len(paragraphs)# 统计句子数和字数total_sentences = 0for para in paragraphs:sentences = re.split(r'[。!?]', para)sentences = [s.strip() for s in sentences if s.strip()]total_sentences += len(sentences)avg_sentences_per_para = total_sentences / paragraph_count if paragraph_count > 0 else 0avg_words_per_para = body_words / paragraph_count if paragraph_count > 0 else 0# 保存结果results.append({'加密号': encryption_code,'参赛队号': team_number,'论文标题': extract_title(full_text[0]) if full_text else '无标题','总页数': total_pages,'总字数': total_words,'摘要页数': abstract_pages,'摘要字数': abstract_words,'目录页数': toc_pages,'正文页数': body_pages,'正文字数': body_words,'正文图片数': body_image_count,'正文图片所占比例': image_ratio,'正文表格数': body_tables,'正文独立公式数': body_formula_count,'正文段落数': paragraph_count,'正文段落平均句子数': avg_sentences_per_para,'正文段落平均字数': avg_words_per_para,'参考文献数量': ref_count,'附录页数': appendix_pages,'附录代码行数': appendix_code_lines,})# 输出到Excel
pd.DataFrame(results).to_excel('resultC.xlsx', index=False)

2 问题二的思路与求解

2.1 问题二的思路

题目要求从所有竞赛论文中筛选出包含参赛队信息的论文,判断正文内容是否与赛题无关,以及识别无实质内容的论文。问题分解为三个子任务:
1.筛选包含参赛队信息的论文:需要验证论文中是否包含附件1中的参赛队信息,比如队号、队员姓名等。
2.判断正文是否与赛题无关:需要对比论文内容与附件2中的赛题描述,确认论文是否围绕赛题展开。
3.识别无实质内容的论文:需要分析论文是否有足够的实际内容,比如是否包含具体的方法、数据分析和结果,而不仅仅是重复题目或背景信息。

2.1.1检测方法的设计:

针对每个子任务,需要设计相应的检测方法:

  1. 包含参赛队信息的检测:
    需要将附件1中的参赛队信息作为关键词,然后在论文中搜索这些关键词。通过正则表达式匹配附件1中的参赛队号、队员姓名、指导教师等信息。例如,附件1中的参赛队号格式为“20201000001”,队员姓名可能以中文或特定编号形式出现。
  2. 判断正文是否与赛题无关:
    需要判断论文内容是否涉及直肠癌、淋巴结转移、CT影像分割等关键词,使用自然语言处理技术(如TF-IDF或BERT)提取论文的关键词和主题,嵌入模型计算论文与赛题的相似度。设定相似度阈值,低于阈值则判定为与赛题无关(相似度可以设定为论文中提取的关键词与题目关键词的相似度)。例如,B5978.pdf的内容是关于运输车辆安全驾驶的,明显与赛题无关。
  3. 识别无实质内容的论文:
    (1)分析论文的结构完整性(是否包含研究方法、数据分析、结果等),检查是否包含数学公式、图表、算法描述等专业内容。这里可以利用问题一生成的result1.xlsx中的统计信息来增强判断的准确性。
    (2)评估内容的原创性,例如,B1523的论文内容完全复制了赛题描述,没有自己的研究内容,因此属于无实质内容。要识别这类论文,可能需要检测论文中是否存在大量重复的赛题内容,或者是否有足够的原创内容。例如,可以计算论文正文与赛题描述(附件2)的相似度,如果相似度过高,则可能无实质内容。
    注意:需要区分实质性内容与模板化描述,例如目录、参考文献等部分可能不包含实际分析。

2.1.2统计流程:

  1. 判断是否包含参赛队信息:
    (1)提取附件1中的所有参赛队信息,包括队号、学校名、指导教师、队员等。
    (2)对每篇论文的全文进行文本提取,并检查是否包含这些信息中的任意一个。
    (3)如果存在匹配,则标记为1,否则为0。
  2. 判断是否与赛题无关:
    (1)提取赛题(附件2)的关键词,如直肠癌、淋巴结、CT、分割、影像特征等。
    (2)对论文进行文本分析,提取关键词或主题,计算与赛题关键词的相似度。
    (3)如果相似度低于某个阈值,则标记为1(无关),否则为0。
  3. 判断是否无实质内容:
    (1)分析论文的结构,如是否有摘要、方法、实验、结果等部分。
    (2)检测论文中是否大量复制赛题内容,比如与附件2中的描述高度重复。
    (3)如果论文的原创内容过少,或者大部分内容与赛题描述重复,则标记为1。

2.1.3特殊情况的考虑:

  1. 需要处理不同格式的参赛队信息,例如队号可能以不同方式书写,队员姓名可能存在错别字或缩写。
  2. 参赛队信息可能分散在论文的不同位置(如页眉、页脚或正文),需要全面扫描整个文档。
  3. 赛题描述可能包含专业术语,需要确保模型能准确识别相关主题,避免误判。
  4. 赛题无关的判断可能受论文结构影响,例如有些论文可能包含少量相关关键词但整体不相关。
  5. 无实质内容的论文可能包含大量重复内容或模板文字,需要设计有效的特征来捕捉这些模式。

2.1.4 问题二模型的建立

1. 单棵决策树的构建(CART算法)
2. 随机森林集成
3. 特征重要性计算
4. 概率输出(Soft Voting)
5. 模型决策规则

2.2 问题二的求解

2.2.1特征工程

2.2.2代码实现

Step1:读取附件1中的所有参赛队信息,生成一个关键词列表,然后使用PDF文本提取工具(如PyPDF2或pdfplumber)提取每篇论文的文本,进行关键词匹配。
Step2:需要构建赛题的关键词列表,然后计算论文中的关键词频率,或者使用文本相似度方法(如余弦相似度)来比较论文内容与赛题描述。
Step3:可能需要计算论文与赛题文本的重复比例。例如,使用文本相似度检测,如Jaccard相似度或TF-IDF向量化后的余弦相似度。如果相似度过高,说明论文大量复制赛题内容,属于无实质内容。此外,还可以检查论文字数,如果正文过短,可能内容不足。

完整论文与代码,请看下方

相关文章:

【2025年泰迪杯数据挖掘挑战赛】A题 数据分析+问题建模与求解+Python代码直接分享

目录 2025年泰迪杯数据挖掘挑战赛A题完整论文&#xff1a;建模与求解Python代码1问题一的思路与求解1.1 问题一的思路1.1.1对统计数据进行必要说明&#xff1a;1.1.2统计流程&#xff1a;1.1.3特殊情况的考虑&#xff1a; 1.2 问题一的求解1.2.1代码实现1.2.2 问题一结果代码分…...

git在分支上会退到某个指定的commit

1、在idea上先备份好分支&#xff08;基于现有分支new branch&#xff09; 2、在gitlab管理端删除现有分支 3、在idea中大卡terminal&#xff0c;执行 git log 查看commit log ,找到要会退到的commit唯一码&#xff0c;然后执行git reset 唯一码 4、查看本地代码状态 git st…...

Cursor入门教程-JetBrains过度向

Cursor使用笔记 **前置&#xff1a;**之前博主使用的是JetBrains的IDE&#xff0c;VSCode使用比较少&#xff0c;所以会尽量朝着JetBrains的使用习惯及样式去调整。 一、设置语言为中文 如果刚上手Cursor&#xff0c;那么肯定对Cursor中的众多选项配置项不熟悉&#xff0c;这…...

MySQL之text字段详细分类说明

在 MySQL 中&#xff0c;TEXT 是用来存储大量文本数据的数据类型。TEXT 类型可以存储非常长的字符串&#xff0c;比 VARCHAR 类型更适合存储大块的文本数据。TEXT 数据类型分为以下几个子类型&#xff0c;每个子类型用于存储不同大小范围的文本数据&#xff1a; TINYTEXT: 可以…...

为什么 Transformer 要使用多头注意力机制?

简而言之&#xff0c;多头注意力机制可以让模型从不同的在空间中并行地捕捉到不同的特征关系&#xff0c;从而更全面&#xff0c;更灵活地理解序列中的信息。 举个例子&#xff0c;如果要看一幅画&#xff0c;就不能简单地只关注例如颜色&#xff0c;还要关注到结构&#xff0…...

Python项目--基于Python的自然语言处理文本摘要系统

1. 项目概述 自然语言处理(NLP)是人工智能领域中一个重要的研究方向&#xff0c;而文本摘要作为NLP的一个重要应用&#xff0c;在信息爆炸的时代具有重要意义。本项目旨在开发一个基于Python的文本摘要系统&#xff0c;能够自动从长文本中提取关键信息&#xff0c;生成简洁而全…...

【Web APIs】JavaScript 操作多个元素 ③ ( 鼠标经过高亮显示 | onmouseover 事件设置 | onmouseout 事件设置 )

文章目录 一、核心要点解析 - 鼠标经过高亮显示1、案例需求2、获取高亮显示的 列表行3、鼠标经过 onmouseover 事件设置4、鼠标离开 onmouseout 事件设置5、设置高亮方式 二、完整代码示例1、完整代码示例2、执行结果 一、核心要点解析 - 鼠标经过高亮显示 1、案例需求 案例需求…...

金融的未来

1. DeFi的爆发式增长与核心使命 DeFi&#xff08;去中心化金融&#xff09;的使命是重构传统金融基础设施&#xff0c;通过区块链技术实现更高的透明度、可访问性、效率、便利性和互操作性。其增长数据印证了这一趋势&#xff1a; TVL&#xff08;总锁定价值&#xff09;爆炸…...

[ElasticSearch]Suggest查询建议(自动补全纠错)

概述 搜索一般都会要求具有“搜索推荐”或者叫“搜索补全”的功能&#xff0c;即在用户输入搜索的过程中&#xff0c;进行自动补全或者纠错。以此来提高搜索文档的匹配精准度&#xff0c;进而提升用户的搜索体验&#xff0c;这就是Suggest。 四种Suggester 1 Term Suggester…...

GPT-4.1 提示词使用指南

GPT-4.1 提示词使用指南 参考&#xff1a;https://cookbook.openai.com/examples/gpt4-1_prompting_guide 为什么要关注 GPT-4.1 提示词使用指南&#xff1f; GPT-4.1 比其前代模型 GPT-4o 更倾向于严格跟随指令&#xff0c;而不是像 GPT-4o 那样更自由地推断用户和系统提示…...

es6面试常见问题╮(╯▽╰)╭

ES6(ECMAScript 2015)的一些常见面试问题,涵盖了变量声明、箭头函数、模板字符串、解构赋值、模块化、类、Promise、生成器等关键特性。有些面试就是问问,对老程序员面试其实不问这么多╮(╯▽╰)╭ 文章目录 **1. 变量声明****1.1 `let` 和 `const` 与 `var` 的区别是什么…...

Xenomai 如何实现 <10μs 级抖动控制

1. 抖动&#xff08;Jitter&#xff09;的定义与重要性 1.1 什么是抖动&#xff1f; 在实时控制系统中&#xff0c;抖动&#xff08;Jitter&#xff09;指任务实际执行时间与预期周期时间的偏差。例如&#xff1a; • 设定一个任务每 100μs 运行一次&#xff0c;但实际运行时间…...

前端基础常见的算法

你整理的这些前端常见算法知识点挺实用的&#xff0c;适合复习或面试准备。下面我帮你稍微整理美化一下格式&#xff0c;并补充一点细节&#xff0c;让内容更清晰易读&#xff1a; 1. 排序算法 冒泡排序&#xff08;Bubble Sort&#xff09; 原理&#xff1a;通过重复比较相邻元…...

RPA机器人技术原理初探

RPA&#xff08;Robotic Process Automation&#xff0c;机器人流程自动化&#xff09;通过模拟人类操作界面元素来实现自动化任务&#xff0c;其技术原理可分为以下核心模块&#xff1a; 一、基础技术架构 界面元素识别技术 选择器&#xff08;Selector&#xff09;引擎&#…...

AWS CloudFront加速S3配置跨域

1、点击分配 源我们就选择S3–>选择我们要加速的S3存储桶 2、创建OAC访问方式 在我们的来源访问处–>来源访问控制设置(推荐)–>选择创建新的OAC(Create new OAC)–>自定义名字按默认选项保存–>选择刚刚新创建的OAC 3、选择查看器的配置 根据具体情况&#x…...

58.最后一个单词的长度

目录 一、问题描述 二、解题思路 三、代码 四、复杂度分析 一、问题描述 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 二、解题思…...

leetcode_344.反转字符串_java

344. 反转字符串 1、题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1a…...

Android --- FrameWork 入门:极速上手AOSP

文章目录 一、硬件要求二、虚拟机安装三、开发环境搭建四、下载编译源码 一、硬件要求 CPU不低于6核心,建议8核及以上 内存不低于32G,建议64G 存储空间不低于500G,建议 1TB SSD 二、虚拟机安装 1.下载ubuntu&#xff0c;官网网址如下&#xff1a; releases.ubuntu.com/focal…...

“大湾区珠宝艺境花园”璀璨绽放第五届消博会

2025年4月13日&#xff0c;第五届中国国际消费品博览会&#xff08;以下简称"消博会"&#xff09;重要主题活动——《大湾区珠宝艺境花园》启动仪式在海南国际会展中心2号馆隆重举行。由广东省金银珠宝玉器业厂商会组织带领粤港澳大湾区优秀珠宝品牌&#xff0c;以“…...

Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践

Spring Boot系列之使用Arthas Tunnel Server 进行远程调试实践 前言 在开发和运维 Java 应用的过程中&#xff0c;远程诊断和调试是一个不可或缺的需求。尤其是当生产环境出现问题时&#xff0c;能够快速定位并解决这些问题至关重要。Arthas 是阿里巴巴开源的一款强大的 Java…...

ILGPU的核心功能使用详解

什么是ILGPU? ILGPU 是一种用于高性能 GPU 程序的新型 JIT&#xff08;即时&#xff09;编译器 &#xff08;也称为 kernels&#xff09;编写的 .基于 Net 的语言。ILGPU 完全 用 C# 编写&#xff0c;没有任何原生依赖项&#xff0c;允许您编写 GPU 真正可移植的程序。…...

Ubuntu服务器日志满audit:backlog limit exceeded了会报错解决方案-Linux 审计系统 (auditd) 工具

auditd 是 Linux 系统中的审计守护进程&#xff0c;负责收集、记录和监控系统安全相关事件。以下是相关工具及其功能&#xff1a; 核心组件 auditd - 审计守护进程 系统的审计服务主程序 收集系统调用信息并写入日志文件 通常存储在 /var/log/audit/audit.log auditctl - 审计控…...

数据加载与保存

通用方式‌ SparkSQL提供了通用的数据加载方式&#xff0c;使用spark.read.loa方法&#xff0c;并可通过format指定数据类型&#xff08;如csv、jdbc、json、orc、parquet、textFile&#xff09;。 load方法后需传入数据路径&#xff08;针对csv、jdbc、json、orc、parquet、…...

TODO!! IM项目2

感觉似乎部署好了 真不容易 mysql、redis、 rocketmq&#xff08;nameserver、broker&#xff09;、nginx 看代码里是mybatisplus、netty->protobuf协议 现在还发不出去消息 每个密码都要改对 现在可以发消息了但不能at 房间成员也没有 broker内存不够&#xff1f; 从…...

Android ImageView 使用详解

文章目录 一、基本使用1. XML 中声明 ImageView2. Java/Kotlin 中设置图片 二、图片缩放类型 (scaleType)三、加载网络图片1. 使用 Glide (推荐)2. 使用 Picasso 四、高级功能1. 圆形图片2. 圆角图片3. 图片点击缩放动画 五、性能优化六、常见问题解决 ImageView 是 Android 中…...

工资管理系统的主要功能有哪些

工资管理系统通过自动化薪资计算、税务处理、员工数据管理、报表生成等功能&#xff0c;极大地提升了薪资发放的效率和准确性。在传统的人工薪资管理中&#xff0c;HR人员需要手动计算每位员工的薪资&#xff0c;并确保符合税务要求&#xff0c;极易出错且耗时。而现代工资管理…...

WordPiece 详解与示例

WordPiece详解 1. 定义与背景 WordPiece 是一种子词分词算法,由谷歌于2012年提出,最初用于语音搜索系统,后广泛应用于机器翻译和BERT等预训练模型。其核心思想是将单词拆分为更小的子词单元(如词根、前缀/后缀),从而解决传统分词方法面临的词汇表过大和未知词(OOV)处…...

【LeetCode基础算法】滑动窗口与双指针

定长滑动窗口 总结&#xff1a;入-更新-出。 入&#xff1a;下标为 i 的元素进入窗口&#xff0c;更新相关统计量。如果 i<k−1 则重复第一步。 更新&#xff1a;更新答案。一般是更新最大值/最小值。 出&#xff1a;下标为 i−k1 的元素离开窗口&#xff0c;更新相关统计量…...

日本Shopify 3月数据:家居品类销售额激增120%!

2024年第一季度末&#xff0c;电商平台运营商Shopify发布了3月份的最新销售数据&#xff0c;引发业界高度关注。据最新数据显示&#xff0c;日本市场家居品类销售在3月份实现了惊人的增长&#xff0c;同比激增120%&#xff0c;成为该区域增速最快的类目。这一变化不仅映射出日本…...

C语言多进程素数计算

题目描述&#xff1a; 以下代码实现了一个多进程素数计算程序&#xff0c;通过fork()函数创建子进程来并行计算指定范围内的素数。请仔细阅读代码并回答以下问题。 #include "stdio.h" #include "unistd.h" #include <sys/types.h> #include "…...

链表知识回顾

类型&#xff1a;单链表&#xff0c;双链表、循环链表 存储&#xff1a;在内存中不是连续存储 删除操作&#xff1a;即让c的指针指向e即可&#xff0c;无需释放d&#xff0c;因为java中又内存回收机制 添加节点&#xff1a; 链表的构造函数 public class ListNode {// 结点…...

数据库勒索病毒威胁升级:企业数据安全防线如何用安当RDM组件重构

摘要&#xff1a;2025年Q1全球数据库勒索攻击量同比激增101.8%&#xff0c;Cl0p、Akira等团伙通过边缘设备漏洞渗透企业核心系统&#xff0c;制造业、金融业等关键领域面临数据加密与业务停摆双重危机。本文深度解析勒索病毒对数据库的五大毁灭性影响&#xff0c;结合安当RDM防…...

50%时效提升!中巴新航线如何重构ebay跨境电商物流成本?

50%时效提升&#xff01;中巴新航线如何重构eBay跨境电商物流成本&#xff1f; 近年&#xff0c;拉美市场逐步升温&#xff0c;特别是巴西&#xff0c;已成为中国跨境卖家争相布局的新蓝海市场。而随着eBay大力拓展拉美板块&#xff0c;更多卖家开始将目光投向这个人口超2亿、…...

自建 eSIM RSP 服务指南

一、 自建 eSIM RSP 服务的必要性评估 在决定是否自建 RSP&#xff08;远程 SIM 配置&#xff09;服务时&#xff0c;企业需要全面了解其带来的利弊。以下是核心要点&#xff1a; 1. GSMA 安全认证 (SAS-SM) 的重要性 目的: 确保 RSP 服务符合全球移动网络运营商 (MNO) 对安…...

TensorRT模型部署剪枝

TensorRT模型部署剪枝 本文属于学习笔记&#xff0c;在重点章节或代码位置加入个人理解&#xff0c;欢迎批评指正&#xff01; 参考&#xff1a; CUDA与TensorRT部署部署实战第四章 一. Pruning 学习目标 理解什么是模型剪枝模型剪枝的分类&#xff0c;以及各类剪枝的利弊都…...

Servlet 线程安全与并发编程深度解析

Servlet 线程安全与并发编程深度解析 一、Servlet 线程安全机制与风险场景 1.1 Servlet 容器工作原理 单实例多线程模型&#xff1a;每个Servlet在容器中只有一个实例&#xff0c;通过线程池处理并发请求请求处理流程&#xff1a; 接收HTTP请求创建HttpServletRequest和HttpS…...

C++学习:六个月从基础到就业——面向对象编程:封装、继承与多态

C学习&#xff1a;六个月从基础到就业——面向对象编程&#xff1a;封装、继承与多态 本文是我C学习之旅系列的第九篇技术文章&#xff0c;主要讨论C中面向对象编程的三大核心特性&#xff1a;封装、继承与多态。这些概念是理解和应用面向对象设计的关键。查看完整系列目录了解…...

光谱相机的成像方式

光谱相机的成像方式决定了其如何获取物体的空间与光谱信息&#xff0c;核心在于分光技术与扫描模式的结合。以下是主要成像方式的分类解析&#xff1a; ‌一、滤光片切换型‌ ‌1. 滤光片轮&#xff08;Filter Wheel&#xff09;‌ ‌原理‌&#xff1a;通过旋转装有多个窄带…...

Excel 中让表格内容自适应列宽和行高

Excel 中让表格内容自适应列宽和行高 目录 Excel 中让表格内容自适应列宽和行高自适应列宽自适应行高在Excel中让表格内容自适应列宽和行高,可参考以下操作: 自适应列宽 方法一:手动调整 选中需要调整列宽的列(如果是整个表格,可点击表格左上角行号和列号交叉处的三角形全…...

android rtsp 拉流h264 h265,解码nv12转码nv21耗时卡顿问题及ffmpeg优化

一、 背景介绍及问题概述 项目需求需要在rk3568开发板上面&#xff0c;通过rtsp协议拉流的形式获取摄像头预览&#xff0c;然后进行人脸识别 姿态识别等后续其它操作。由于rtsp协议一般使用h.264 h265视频编码格式&#xff08;也叫 AVC 和 HEVC&#xff09;是不能直接用于后续处…...

Day(21)--网络编程

网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输 应用场景&#xff1a;即使通信、网友对战、金融证券等等&#xff0c;不管是什么场景&#xff0c;都是计算机和计算机之间通过网络进行的数据传输 java.net 常见的软件架构 C/S&am…...

Android主流播放器功能详解

Android主流播放器功能详解 前言 本文将深入介绍Android三大主流播放框架(ijkplayer、ExoPlayer和MediaPlayer)的功能特性和实战应用,帮助你选择合适的播放框架并掌握其使用方法。 三大播放框架概述 播放框架开发方特点适用场景MediaPlayerAndroid官方简单易用,系统内置…...

牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记2

目录 一、ArcGIS Engine概述 1、 定义 2、 核心功能 3、 与ArcObjects&#xff08;AO&#xff09;的关系 二、开发环境搭建 1、 开发工具要求 2、 关键步骤 三、 ArcGIS Engine核心组件 1、 对象模型 2、 类库分类 四、 第一个AE应用程序&#xff08;C#示例&#xf…...

语音合成(TTS)从零搭建一个完整的TTS系统-第一节-效果演示

一、概述 语音合成又叫文字转语音&#xff08;TTS-text to speech &#xff09;&#xff0c;本专题我们记录从零搭建一个完整的语音合成系统&#xff0c;包括文本前端、声学模型和声码器&#xff0c;从模型训练到系统的工程化实现&#xff0c;模型可以部署在手机等嵌入式设备上…...

文章记单词 | 第35篇(六级)

一&#xff0c;单词释义 across [əˈkrɒs] prep. 从一边到另一边&#xff1b;横过&#xff1b;在… 对面&#xff1b;遍及&#xff1b;在… 上&#xff1b;跨越&#xff1b;adv. 从一边到另一边&#xff1b;横过&#xff1b;宽&#xff1b;从… 的一边到另一边&#xff1b;在…...

MySQL Binlog 数据恢复总结

&#x1f332; 总入口&#xff1a;你想恢复什么&#xff1f; 恢复类型 ├── 表结构 表数据&#xff08;整张表被 DROP&#xff09; │ ├── Binlog 中包含 CREATE TABLE │ │ └── ✅ 直接用 mysqlbinlog 提取建表 数据语句&#xff0c;回放即可 │ └── B…...

【Linux】进程基础入门指南(下)

> &#x1f343; 本系列为Linux的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:【小编的个人主页】 >小编将在这里分享学习Linux的心路历程✨和知识分享&#x1f50d; >如果本篇文章有不足&#xff0c;还请多多包涵&a…...

NoETL×大模型:Aloudata重构数据智能新范式,开启Chat BI新落地之道

在当今数据驱动的时代&#xff0c;企业对于高效、智能的数据处理与分析需求日益增长。随着大模型的兴起&#xff0c;如DeepSeek等&#xff0c;数据智能领域正经历着前所未有的变革。 Aloudata大应科技创始人&CEO周卫林表示&#xff0c;企业的核心竞争力包括人才壁垒、技术…...

算法题(126):前缀和

审题&#xff1a; 本题需要我们将题目给出的数组的数据的[l,r]范围内的数据和打印 思路&#xff1a; 方法一&#xff1a;前缀和 前缀和的思想就是预处理数据&#xff0c;通过空间换时间的方式提高代码效率 第一步&#xff1a;利用数组f将前缀和记录下来&#xff0c;f[i]表示索引…...

选择排序(简单选择排序、堆排序)

简单选择排序&#xff08;Selection Sort&#xff09; 1. 算法思想 它通过多次遍历数组&#xff0c;每次从未排序部分中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其放到已排序部分的末尾&#xff08;或开头&#xff09;&#xff0c;直到整个数组有序。 2.…...