第一部分:高考作文到底能不能被“预测”?
“凡事预则立,不预则废。”——《礼记·中庸》
又是一年高考季,语文试卷刚刚落地,微博热搜就被“某省高考作文题”刷屏。有人感叹“太离谱了”,有人喊着“押中了”,还有人调侃“果然是AI时代,命题也越来越像GPT写的了”。
问题来了:
高考作文题,到底能不能被AI预测?
这并不是一个无厘头的脑洞,而是一个值得深究的技术问题——AI是否能通过机器学习和自然语言处理,分析历年高考作文命题的规律,从而预测未来可能的作文题目?
想一想,你是不是也曾在考前苦苦背诵那些“万能作文模板”“十大高频命题角度”?那么,AI是否能比人类更精准地“押题”?它会不会真的成为“高考最强辅导老师”?
先别急着否定。我们不妨先来看看“人类老师”是怎么押题的:
📖 人类的押题方法,其实就是“数据拟合”
回想你高中的语文老师,是不是每年都让你背一大堆范文,还动不动就来一句:
“从‘大我’与‘小我’、‘责任’与‘自由’、‘传承’与‘创新’这几个角度出发,高考作文基本都能写。”
是不是很熟悉?
其实他们做的事,本质上就是基于过往样本,进行趋势建模。这不就是我们做机器学习的套路吗?
- 老师:用经验和主观判断提炼规律
- AI:用大量语料和神经网络拟合模式
📊 从数据的角度看,高考作文其实是有“套路”的
我们简单看一下2013年到2023年的全国卷作文题(数据略):
年份 | 作文主题关键词 |
---|---|
2013 | 社会热点:同龄人、青少年梦想 |
2014 | 家国情怀:老舍与北京城 |
2015 | 科技发展:手机的利与弊 |
2016 | 文化自信:语文素养的重要性 |
2017 | 核心价值观:理想与现实 |
2018 | 青年担当:奋斗新时代 |
2019 | 社会责任:劳动与奋斗 |
2020 | 抗疫情感:共克时艰 |
2021 | 数字社会:AI与人类共处 |
2022 | 教育话题:“双减”政策 |
2023 | 心理建设:自我认同与群体关系 |
这像不像某种“非线性时间序列”?每年虽然不同,但背后都埋着一些重复出现的“命题元主题”:国家意识、文化传统、社会热点、青年成长、科技伦理等。
于是问题来了:
既然人类可以根据规律押题,为什么AI不可以?
只要我们:
- 拿到足够多年的高考作文题
- 提取出关键词、语义特征
- 用大语言模型(如GPT)学习“命题风格”
- 再加点时间感知能力(比如“2024年的社会热点”)
那么——是不是就可以预测2025年的作文题?
🧠 本文目标:打造一个“AI押题系统”
本文将从头到尾动手实现一个简单但有趣的系统,它能:
- 爬取并结构化高考作文题数据
- 提取语义信息并进行聚类
- 使用GPT或类似模型生成“下一道高考作文题”
- 甚至还能自动写一篇范文!
别急,我们不是在搞玄学,而是用数据科学 + 语言模型,用“程序员的方式”做一次“教育界的押题实验”。
下一部分,我们就从如何获取高考作文题数据开始,手把手带你搭建这个“AI押题机”。
预测不等于押中,但方向对了,就不远了。
第二部分:数据收集——高考作文语料怎么爬?
“巧妇难为无米之炊。” —— 程序员版就是:“模型再强,没数据也白搭。”
在让AI预测高考作文之前,我们得先喂给它“过去吃过的饭”——也就是历年高考语文作文题、范文和解析资料。这一步听上去像苦力活,但用好Python,分分钟就能自动化。
📌 数据目标
我们需要收集以下类型的数据:
数据类型 | 示例 |
---|---|
作文题目原文 | “围绕‘时间的厚度’写一篇议论文…” |
出题年份与试卷 | “2023年 全国甲卷” |
作文类型 | “材料作文 / 命题作文 / 开放作文” |
官方范文 | 范文内容(不少于800字) |
命题分析 | 教育专家的点评或老师解析 |
✅ 技术路线:爬虫 + 正则 + 手动标注少量异常数据。
一、找到靠谱的作文数据源
目前国内有几个还算稳定的作文题目发布网站,比如:
我们以高考作文网为例,分析页面结构后发现,每篇文章都有一个 class 为 .title
的 div,我们可以从中提取题目链接,进入详情页获取正文。
二、用Python写一个爬虫脚本
下面是一个基础版爬虫示例,使用 requests
和 BeautifulSoup
,用于抓取作文题目与链接:
import requests
from bs4 import BeautifulSoup
# 设置目标URL和请求头
url = "https://www.gaokao.com/e/zuowen/"
headers = {
'User-Agent': 'Mozilla/5.0'}
# 发起请求
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取作文题目的链接
titles = soup.select('.title a')
for title in titles:
print(f"标题:{
title.text}")
print(f"链接:https://www.gaokao.com{
title['href']}")
👆运行后我们可以获取到多个高考作文题的页面链接。
三、继续爬详情页,抓取正文内容
接下来,我们对每个详情页进行进一步爬取:
def get_essay_content(url):
res = requests.get(url, headers=headers)
s = BeautifulSoup(res.text, 'html.parser')
try:
# 文章正文通常在 .art_main 类中
content_div = s.select_one('.art_main')
paragraphs = content_div.find_all('p')
content = "\n".join([p.text.strip() for p in paragraphs])
return content
except:
return "解析失败"
# 示例调用
link = "https://www.gaokao.com/e/zuowen/64b25878d73e6.shtml"
print(get_essay_content(link))
结果通常会包含作文题干、命题背景、写作要求,有些页面甚至还有范文,非常适合训练数据集使用。
四、保存数据为结构化JSON文件
便于后续训练,我们可以将数据结构化保存:
import json
def save_data(data, filename="gaokao_essays.json"):
with open(filename, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=4)
# 构造数据结构示例
essay_data = {
"year": 2023,
"region": "全国甲卷",
"title": "谈谈你对‘数智社会’的理解",
"type": "材料作文",
"content": "材料内容+写作要求…",
"link": link
}
save_data([essay_data])
你可以构建一个循环,自动收集近十年所有作文数据,整理成数百条结构化样本。
五、如何处理动态加载页面?用 Selenium
有些网站使用了 JavaScript 加载内容,requests
是“看不见”的,这种情况我们可以使用 Selenium
模拟浏览器行为:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.get("https://www.gaokao.com/e/zuowen/")
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 后续逻辑与 requests 相同
六、实用建议:建立自己的“高考作文数据库”
抓取完几十篇之后,你就能构建一个本地数据库(可以是JSON/CSV,也可以直接存入 SQLite/MySQL),后续用于:
- 模型训练语料
- 命题风格提取
- 关键词分析
- 样式迁移生成新题
例如:
{
"year": 2021,
"region": "全国新高考Ⅰ卷",
"type": "材料作文",
"theme": "科技与人类关系",
"content": "请根据以下材料写一篇作文...",
"official_sample": "在数字时代,我们的生活被算法包围……"
}
🧩 小结
- 我们完成了“AI预测作文”的第一步——数据获取
- 接下来将对这些数据进行清洗、分类与语义分析
- 为下一步的模型训练做准备!
第三部分:数据清洗与标注——让AI看懂作文题
“你喂它饭之前,得先把骨头剔干净。”—— 一位懂AI的老语文老师
在上一节,我们已经用 Python 成功爬取了大量的高考作文题原文、出题年份、试卷名称、作文要求、范文内容等等。这些数据就像是AI眼中的一堆“文字汤”,它根本看不懂。
我们接下来要做的事情,就是把这锅汤过滤干净、分类装盘,形成适合训练的“干净语料”:
📌 本节目标
任务 | 技术点 |
---|---|
提取作文题干内容 | 正则表达式清洗 |
判断作文题类型(命题作文、材料作文等) | 关键词 + 规则判断 |
提取关键词或主题 | 分词 + 命名实体识别 |
标注主题类别(科技类、家国类、成长类) | 自定义分类字典 or 分类器 |
格式标准化为 JSON 数据结构 | 清洗输出训练语料 |
一、用正则表达式提取作文题干与要求
大部分高考作文题的格式是这样的:
阅读下面材料,根据要求写一篇不少于800字的作文。
材料如下:……
要求:自拟标题,观点明确,结构完整。
我们要抽取的是:
- 命题方式(命题作文/材料作文/开放作文)
- 写作要求
- 材料正文
下面是一个提取示例:
import re
text = """阅读下面材料,根据要求写一篇不少于800字的作文。
材料如下:2020年春,新冠疫情突如其来,人们感受到了团结的力量……
要求:自拟标题,结合材料,写一篇议论文。"""
# 提取命题方式
if "阅读下面材料" in text:
essay_type = "材料作文"
elif "根据提示语写作" in text:
essay_type = "开放作文"
else:
essay_type = "命题作文"
# 提取材料段
material_match = re.search(r"材料如下:(.+?)要求:", text, re.S)
material = material_match.group(1).strip() if material_match else ""
# 提取写作要求
requirement_match = re.search(r"要求:(.*)", text