前文之后, 唤起了以前的一个想法:
将尽可能多的教科书知识(从小学开始)用程序+数据整理表达, 比如梯形定义,面积, 主谓宾语法, 电流公式, 煤矿富集的省份, 19xx年发生的历史事件
等等. 感觉与前文的学科结合手段有点接近, 范围也许更广.
感觉这样的项目做大了就会接近, 优势是开源, 中文化和更侧重中国相关的数据. 下面从数学和历史两个方向做了非常初步的尝试.
数学
尝试从人教版小学数学一年级上册开始, 但也许从更高年级开始更有可行性(更容易程序化).
"准备课"中的认知部分, 如认识上下左右前后, 算法识别不现实. 比多少的部分, 在没有加减能力的前提下, 通过将两组物品进行1:1的摆放, 定义了"同样多", "A比B多/少"的概念. 因此也模拟此过程, 避免使用加减法和数字大小比较, python3实现如下:
from enum import Enumclass 比较结果(Enum): 多 = "多" 少 = "少" 同样 = "同样"def 比较(组1, 组2): for 序号 in range(10): if 组1: if not 组2: return 比较结果.多 else: 组1.pop(0) 组2.pop(0) else: if 组2: return 比较结果.少 else: return 比较结果.同样print(比较([1,2], [1,2,3]))print(比较([1,2,3], [1,2]))print(比较([1,2,3], [1,2,3]))
历史
先用Python3, 后用JavaScript(因为想和结合)编写历史数据, 感觉有几个优势:
- 数据是文本格式, 易于合作编辑
- 易于扩展和重构, 相比数据库, 可以更方便地增减/修改数据之间的关系
- 编辑时可以借助IDE的自动补全, 语法错误等功能, 减少笔误
- 易于编写自动测试以保证一些基本检验规则, 比如朝代没有重合部分, 先辈出生日期肯定早于后辈, 等等.
- 易于直接使用数据进行分析: 比如这样:
Array.prototype.diff = function(a) { return this.filter(function(i) {return a.indexOf(i) < 0;});};消失国家 = 国家所属时期[朝代.春秋].diff(国家所属时期[朝代.战国])console.log("春秋消失的国家: " + JSON.stringify(消失国家))
输出:
春秋消失的国家: ["晋国","宋国","吴国","越国","鲁国"]
下面是源码, 仅作原型演示之用, 如果正式开始项目会采用更翔实的史实参考来源(如教材). 数据结构设计等等很不成熟, 请多指摘, 尤其是TODO部分.
// 来源: 中国少儿百科全书-历史大观: 河姆渡文化-郑和下西洋var 朝代 = Object.freeze({ 新石器: "新石器时代", 东周: "东周", 春秋: "春秋时期", 战国: "战国时期", 秦: "秦朝", 西汉: "西汉", 东汉: "东汉", 三国: "三国时期", 隋: "隋朝", 唐: "唐朝", 元: "元朝", 明: "明朝"});var 社会类型 = Object.freeze({ 氏族社会: "氏族社会", 母系社会: "母系社会"});// TODO: 添加地点关系, 如国-地区-省-市-镇, 以及行政区划改变(村->镇等)var 地点 = Object.freeze({ 浙江: "浙江省", 余姚: "余姚市", 河姆渡: "河姆渡文化", 长江下游: "长江下游地区", 黄河中游: "黄河中游地区", 陕西: "陕西省", 西安: "西安市", 半坡: "半坡遗址", 长安: "长安", 洛阳: "洛阳", 齐: "齐国", 晋: "晋国", 宋: "宋国", 秦: "秦国", 楚: "楚国", 吴_春秋: "吴国", 越: "越国", 燕: "燕国", 韩: "韩国", 赵: "赵国", 魏_战国: "魏国", 鲁: "鲁国", 匈奴: "匈奴", 大月氏: "大月氏", 西域: "西域", 官渡: "官渡", 赤壁: "赤壁", 魏_三国: "魏国", 蜀国: "蜀国", 吴_三国: "吴国", 吐蕃: "西藏", 蒙古: "蒙古国", 中亚: "中亚", 东欧: "东欧", 西洋: "东南亚和印度洋沿海"});// TODO: 更多人物信息, 如原名, 性别, 小名等等var 人物 = Object.freeze({ 周平王: "周平王", 齐桓公: "齐桓公", 晋文公: "晋文公", 宋襄公: "宋襄公", 秦穆公: "秦穆公", 楚庄王: "楚庄王", 吴王: "阖闾", 越王: "勾践", 孔子: "孔子", 老子: "老子", 墨子: "墨子", 孟子: "孟子", 秦王: "嬴政", 汉景帝: "汉景帝", 汉武帝: "刘彻", 卫青: "卫青", 霍去病: "霍去病", 张骞: "张骞", 袁绍: "袁绍", 袁术: "袁术", 曹操: "曹操", 孙坚: "孙坚", 刘备: "刘备", 孙权: "孙权", 曹丕: "曹丕", 汉献帝: "汉献帝", 唐太宗: "李世民", 李靖: "李靖", 尉迟恭: "尉迟恭", 李建成: "李建成", 魏征: "魏征", 文成公主: "文成公主", 松赞干布: "松赞干布", 武则天: "武则天", 唐高宗: "唐高宗", 成吉思汗: "铁木真", 忽必烈: "忽必烈", 郑和: "马和", 朱棣: "朱棣"});var 年号 = Object.freeze({ 贞观: "贞观"});var 路线 = Object.freeze({ 丝绸之路: "丝绸之路"});var 群体 = Object.freeze({ 儒家: "儒家", 道家: "道家", 墨家: "墨家"})var 行为 = Object.freeze({ 栽种: "栽种", 制作: "制作", 结婚: "结婚", 求教: "求教", 消灭: "消灭", 出使: "出使", 出击: "出击", 击败: "击败", 效力: "效力", 称帝: "称帝"});var 植物 = Object.freeze({ 水稻: "水稻"});var 物件 = Object.freeze({ 陶器: "陶器"});var 国家所属时期 = Object.freeze({ [朝代.春秋]: [地点.齐, 地点.晋, 地点.宋, 地点.秦, 地点.楚, 地点.吴_春秋, 地点.越, 地点.鲁], [朝代.战国]: [地点.齐, 地点.楚, 地点.燕, 地点.秦, 地点.韩, 地点.赵, 地点.魏_战国], [朝代.三国]: [地点.魏_三国, 地点.吴_三国, 地点.蜀国]});// 数字为公元纪年, 如-5000即公元前5000年, 221即公元后221年// TODO: 很多年份如秦代-200需更正var 时间跨度 = Object.freeze({ [地点.河姆渡]: {开始: -6000, 结束: -5000}, [地点.半坡]: {开始: -4400, 结束: -4300}, [朝代.东周]: {开始: -770, 结束: -221}, [朝代.秦]: {开始: -221, 结束: -200}, [朝代.西汉]: {开始: -200, 结束: 0}, [朝代.东汉]: {开始: 0, 结束: 229}, [年号.贞观]: {开始: 626, 结束: 650}});// TODO: 此表仅在人物无具体生卒年月时有用var 所属时期 = Object.freeze({ [地点.半坡]: 朝代.新石器, [地点.河姆渡]: 朝代.新石器, [人物.孔子]: 朝代.春秋, [人物.老子]: 朝代.春秋, [人物.卫青]: 朝代.西汉, [人物.霍去病]: 朝代.西汉});var 所属地点 = Object.freeze({ [人物.孔子]: 地点.鲁,});var 人物所属群体 = Object.freeze({ [人物.孔子]: 群体.儒家, [人物.孟子]: 群体.儒家, [人物.老子]: 群体.道家, [人物.墨子]: 群体.墨家});var 属性 = Object.freeze({ [地点.河姆渡]: 社会类型.氏族社会, [地点.半坡]: 社会类型.母系社会});// 行为方向为: 前者对后者// TODO: 加入事件发生时间, 地点var 事件 = Object.freeze({ [行为.结婚]: [(人物.文成公主, 人物.松赞干布), (人物.武则天, 人物.唐高宗)], [行为.栽种]: [(地点.河姆渡, 植物.水稻)], [行为.制作]: [(地点.半坡, 物件.陶器)], [行为.求教]: [(人物.孔子, 人物.老子)], [行为.消灭]: [(地点.秦, 地点.韩), (地点.秦, 地点.赵), (地点.秦, 地点.魏_战国)], [行为.出使]: [(人物.张骞, 地点.西域), (人物.郑和, 地点.西洋)], [行为.出击]: [(人物.卫青, 地点.匈奴), (人物.霍去病, 地点.匈奴)], [行为.击败]: [(人物.曹操, 人物.袁绍)], [行为.效力]: [(人物.魏征, 人物.李建成), (人物.魏征, 人物.唐太宗), (人物.李靖, 人物.唐太宗), (人物.尉迟恭, 人物.唐太宗), (人物.郑和, 人物.朱棣)], [行为.称帝]: [(人物.曹丕, 地点.魏_三国, 220), (人物.刘备, 地点.蜀国, 221), (人物.孙权, 地点.吴_三国, 229)]});var 名言 = Object.freeze({ [人物.唐太宗]: ["民, 水也; 君, 舟也. 水能载舟, 亦能覆舟"]});
之前问过的: 其中并没有很多事件数据, sqlite数据库就有230MB. 考虑将数据范围限制在教材内, 以避免数据量过度膨胀.
源于讨论:
相关问题: