尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

上海高考数学知识点PDF解析:构建可检索数据库与知识图谱

上海高考数学知识点PDF解析:构建可检索数据库与知识图谱 简介这份《上海高考数学知识点整理(全)》PDF面向备战上海高考的高三学生及高中数学教师聚焦集合与简易逻辑、不等式两大核心板块帮助读者系统梳理高频考点与易错细节。内容从集合元素形式、三性确定性、互异性、无序性、交并补运算与德摩根定律讲起延伸至命题四种形式、逆否等价、常见结论的否定形式及充要条件判断并配套不等式基本性质、一元二次与分式不等式解法、绝对值去符号技巧、含参分类讨论及恒成立问题的函数与分离变量思想例题与提醒穿插其中。资源为单个PDF文件压缩包约2.69MB轻量便携适合打印或平板批注。目前已有138人学习下载可作为一轮复习提纲或考前查漏补缺的速查手册帮助考生在有限时间内建立清晰的知识框架与解题路径。1. 从一份“上海高考数学知识点整理(全).pdf”说起为什么值得把它做成可检索的数据很多上海高三学生手里都有这么一份 PDF封面写着“上海高考数学知识点整理(全)”几十上百页目录从集合与逻辑、函数、三角、数列一路排到解析几何、立体几何、概率统计。它看起来只是复习资料但真正用起来会发现两个痛点一是翻页慢想查“二面角怎么求”得靠肉眼扫二是没法按知识点、难度、题型做筛选更别说统计自己哪块薄弱。把这份 PDF 变成结构化数据本质是一次小型的信息抽取工程解析文本、切分知识点、打标签、建索引最后做成能按关键词和章节检索的小工具。它适合三类人正在带上海高三的数学老师、想给自己做错题本和知识图谱的学生以及想练手 PDF 解析与文本检索的开发者。下面按“先讲清原理再给可复现步骤”的顺序展开代码以 Python 为主命令可直接在本地跑。2. 解析“上海高考数学知识点整理(全).pdf”的文本与结构2.1 先判断 PDF 是文本型还是扫描型动手前必须确认 PDF 的类型否则后面所有抽取都是白费。文本型 PDF 可以直接提取字符扫描型图片必须先 OCR。判断方法很简单用pdfplumber打开第一页看能不能拿到文字。import pdfplumber pdf_path 上海高考数学知识点整理(全).pdf with pdfplumber.open(pdf_path) as pdf: first_page pdf.pages[0] text first_page.extract_text() or print(首页字符数:, len(text)) print(text[:200])逻辑说明extract_text()返回该页可提取的文本如果长度接近 0基本可判定为扫描件。参数上pdfplumber.open默认按页读取适合逐页处理若文件很大可加laparams调整布局解析精度。扫描件则改用pytesseract配合pdf2image先转图再 OCR中文需指定langchi_sim。提示上海高考数学资料里公式多纯文本抽取常把上下标、分数线打乱别指望一次完美先保证正文可读。2.2 用 pdfplumber 逐页抽取并保留页码知识点整理类 PDF 的价值在于“第几页讲了什么”所以抽取时要带上页码方便回溯。import pdfplumber import json records [] with pdfplumber.open(pdf_path) as pdf: for i, page in enumerate(pdf.pages, start1): txt page.extract_text() or records.append({page: i, text: txt.strip()}) with open(raw_pages.json, w, encodingutf-8) as f: json.dump(records, f, ensure_asciiFalse, indent2) print(总页数:, len(records))逻辑说明enumerate(..., start1)让页码从 1 开始符合阅读习惯ensure_asciiFalse保证中文不被转义。参数上若某页是纯图text会为空可在后续步骤单独标记为待 OCR 页。常见坑是页眉页脚重复出现比如每页都有“上海高考数学”需要在清洗阶段用正则去掉。2.3 清洗页眉页脚与多余空白抽取后的文本往往夹杂页码、书名、空行。用正则统一处理能显著提升后续检索质量。import re def clean_text(s: str) - str: s re.sub(r上海高考数学知识点整理.*?\n, , s) # 去页眉 s re.sub(r\n\s*\d\s*\n, \n, s) # 去独立页码行 s re.sub(r[ \t], , s) # 合并空格 s re.sub(r\n{3,}, \n\n, s) # 压缩空行 return s.strip() cleaned [{page: r[page], text: clean_text(r[text])} for r in records]逻辑说明第一条正则针对固定页眉实际使用时按你 PDF 里的真实页眉改第二条去掉单独成行的数字页码后两条做空白归一化。参数上正则里的.*?是非贪婪匹配避免跨行误删。清洗后建议人工抽查 3 到 5 页确认没有把正文里的数字误删。2.4 按章节标题切分知识点上海高考数学的章节边界通常很清晰比如“一、集合与逻辑”“二、函数”。用正则匹配中文序号加标题把整本 PDF 切成章节块。import re chapter_pattern re.compile(r^[一二三四五六七八九十]、\s*.$, re.M) chapters [] current {title: 前言, content: } for r in cleaned: for line in r[text].split(\n): if chapter_pattern.match(line.strip()): chapters.append(current) current {title: line.strip(), content: } else: current[content] line \n chapters.append(current) for c in chapters: print(c[title], len(c[content]))逻辑说明re.M让^匹配每行开头遇到章节标题就开新块否则累加到当前块。参数上若你的 PDF 用“第一章”或“1.”编号改chapter_pattern即可。切分后每章内容可能仍含小节可再用###级别标题二次切分形成“章—节—知识点”三级结构。3. 给知识点打标签并建立可检索索引3.1 设计标签体系模块、难度、题型光有文本还不够检索时要能按“三角中等解答题”过滤。标签体系建议三到四个维度别贪多。维度取值示例说明模块函数、三角、数列、解析几何对应上海高考主干难度基础、中等、压轴按常见分层题型选择、填空、解答上海卷固定结构考频高频、中频、低频可后续统计标签来源有两种一是从章节标题直接映射模块二是用关键词规则给内容打难度和题型。比如出现“证明”“求二面角”多为解答题出现“取值范围”可能是填空。3.2 用关键词规则自动打标签规则法简单可控适合知识点整理这种结构稳定的文本。def tag_chapter(title: str, content: str) - dict: module_map { 集合: 集合与逻辑, 函数: 函数, 三角: 三角, 数列: 数列, 向量: 向量, 解析几何: 解析几何, 立体几何: 立体几何, 概率: 概率统计, 统计: 概率统计 } module next((v for k, v in module_map.items() if k in title), 其他) difficulty 中等 if any(k in content for k in [证明, 讨论, 综合]): difficulty 压轴 elif any(k in content for k in [定义, 公式, 基本]): difficulty 基础 qtype 解答 if 证明 in content or 求 in content else 填空 return {module: module, difficulty: difficulty, qtype: qtype} tagged [{**c, **tag_chapter(c[title], c[content])} for c in chapters]逻辑说明module_map按标题关键词映射模块next取第一个命中项难度和题型用内容关键词判断。参数上关键词列表要按你 PDF 的实际用词调整比如上海卷常写“讨论”“探究”。规则法会有误判建议先跑一遍人工修正 10% 左右的边界样本。3.3 用 jieba 做中文分词并建倒排索引要让检索支持“二面角”“等差数列”这类词需要分词后建倒排索引。import jieba from collections import defaultdict inverted defaultdict(set) for idx, c in enumerate(tagged): words jieba.lcut(c[title] c[content]) for w in words: w w.strip() if len(w) 2: # 过滤单字和空白 inverted[w].add(idx) def search(query: str): q_words [w for w in jieba.lcut(query) if len(w) 2] if not q_words: return [] hit set.intersection(*(inverted.get(w, set()) for w in q_words)) return [tagged[i] for i in hit] print(search(二面角 求法))逻辑说明倒排索引把“词→章节编号”存起来检索时对查询词取交集命中即相关。参数上len(w) 2过滤单字噪声也可换成停用词表。常见坑是 jieba 对数学术语分词不准可加自定义词典jieba.add_word(二面角)、jieba.add_word(等差数列)显著提升召回。3.4 把结果落成 JSON 与 SQLite 两种形态JSON 方便人看SQLite 方便查询和后续做界面。import sqlite3, json conn sqlite3.connect(math_points.db) cur conn.cursor() cur.execute(CREATE TABLE IF NOT EXISTS points ( id INTEGER PRIMARY KEY, title TEXT, module TEXT, difficulty TEXT, qtype TEXT, content TEXT)) for c in tagged: cur.execute(INSERT INTO points (title, module, difficulty, qtype, content) VALUES (?,?,?,?,?), (c[title], c[module], c[difficulty], c[qtype], c[content])) conn.commit() cur.execute(SELECT title FROM points WHERE module? AND difficulty?, (三角, 压轴)) print(cur.fetchall())逻辑说明建表时把标签作为独立列便于组合查询插入用参数化占位符避免拼接 SQL。参数上module、difficulty可加索引提升查询速度。JSON 版本可直接json.dump(tagged, ...)导出供前端或笔记软件导入。4. 实战做一个本地可用的知识点检索小工具4.1 用 argparse 写命令行查询入口最轻量的落地方式是一个命令行工具输入关键词和筛选条件输出匹配章节。import argparse, sqlite3 def query(kwNone, moduleNone, difficultyNone): conn sqlite3.connect(math_points.db) cur conn.cursor() sql SELECT title, module, difficulty FROM points WHERE 11 args [] if kw: sql AND content LIKE ? args.append(f%{kw}%) if module: sql AND module? args.append(module) if difficulty: sql AND difficulty? args.append(difficulty) cur.execute(sql, args) return cur.fetchall() if __name__ __main__: p argparse.ArgumentParser() p.add_argument(--kw, help关键词) p.add_argument(--module, help模块) p.add_argument(--difficulty, help难度) a p.parse_args() for row in query(a.kw, a.module, a.difficulty): print(row)逻辑说明WHERE 11是拼接条件时的常用技巧后续每个条件用AND追加LIKE做模糊匹配适合中文短查询。参数上--kw可传“二面角”--module传“立体几何”组合使用能快速定位。运行示例python query.py --kw 二面角 --module 立体几何。4.2 用 Streamlit 做可视化检索页如果想让老师或学生直接用Streamlit 几行代码就能出界面。import streamlit as st import sqlite3 st.title(上海高考数学知识点检索) kw st.text_input(关键词) module st.selectbox(模块, [全部, 函数, 三角, 数列, 解析几何, 立体几何, 概率统计]) if st.button(搜索): conn sqlite3.connect(math_points.db) cur conn.cursor() sql SELECT title, difficulty, content FROM points WHERE content LIKE ? args [f%{kw}%] if module ! 全部: sql AND module? args.append(module) cur.execute(sql, args) for title, diff, content in cur.fetchall(): st.subheader(f{title}{diff}) st.write(content[:300])逻辑说明text_input收关键词selectbox收模块按钮触发查询结果用subheader和write展示前 300 字。参数上content[:300]防止长文本刷屏可改成折叠面板。启动命令streamlit run app.py浏览器会自动打开本地页面。4.3 检索效果验证与常见误判做完要验证召回和准确率。准备 10 个查询比如“等差数列求和”“二面角”“概率分布”人工看返回结果是否相关。查询词期望命中常见误判二面角立体几何章节误命中“角”相关三角内容等差数列数列章节分词把“等差”和“数列”拆开概率分布概率统计命中“分布”但非概率语境误判主要来自分词和LIKE的宽匹配。改进办法一是加自定义词典二是把LIKE换成倒排索引交集三是给标题命中更高权重。验证时记录每个查询的前 5 条人工标注相关与否算一个粗略准确率低于 70% 就回去调分词和标签规则。5. 进阶把知识点整理成可复习的知识图谱与错题关联5.1 用共现关系构建知识点图谱把同一章节或同一查询里频繁共现的知识点连边能看出“三角”和“向量”常一起考。做法是统计章节内知识点词的共现次数超过阈值就连边。from itertools import combinations from collections import Counter co Counter() for c in tagged: words [w for w in jieba.lcut(c[content]) if len(w) 2] for a, b in combinations(set(words), 2): co[(a, b)] 1 edges [(a, b, n) for (a, b), n in co.items() if n 3] print(len(edges), edges[:5])逻辑说明combinations生成词对Counter累计共现次数阈值 3 过滤偶然共现。参数上阈值可按语料大小调整语料小就降到 2。得到的边可导入 Neo4j 或直接用 networkx 画图节点是知识点边是共现强度。5.2 把错题记录关联到知识点学生做错题后记录题目关键词反查知识点章节形成“错题—知识点”映射。def link_mistake(mistake_kw: str): conn sqlite3.connect(math_points.db) cur conn.cursor() cur.execute(SELECT title, module FROM points WHERE content LIKE ?, (f%{mistake_kw}%,)) return cur.fetchall() print(link_mistake(二面角))逻辑说明错题关键词命中知识点后可把错题 ID 和知识点 ID 存到关联表后续统计“哪个模块错得最多”。参数上mistake_kw建议用题目里的核心术语而不是整句否则LIKE命中率低。长期积累后这张关联表就是个性化复习的依据。5.3 定期增量更新 PDF 与索引资料会更新索引也要能增量重建。建议把解析、清洗、打标签、建库写成一条流水线每次换新 PDF 只跑一遍。python parse_pdf.py --input 上海高考数学知识点整理(全).pdf --out raw_pages.json python clean.py --in raw_pages.json --out cleaned.json python tag.py --in cleaned.json --out tagged.json python build_db.py --in tagged.json --db math_points.db逻辑说明四个脚本各管一段输入输出用 JSON 衔接方便单独调试。参数上--input和--out明确路径避免覆盖旧数据。常见坑是 PDF 换版后页眉变了清洗正则要同步更新建议每次更新后抽查 5 页确认章节切分没有错位。最后把math_points.db和错题关联表一起备份换设备也能接着用。本文还有配套的精品资源点击获取
返回列表