初步尝试将传统学科的内容程序/数据化

简介: 将数学, 历史等传统学科的内容用代码进行表达. Use program to implement common-sense knowledge, like math and history.

前文它山之石-日本推广编程中使用日语命名的渊源之后, 唤起了以前的一个想法:

将尽可能多的教科书知识(从小学开始)用程序+数据整理表达, 比如梯形定义,面积, 主谓宾语法, 电流公式, 煤矿富集的省份, 19xx年发生的历史事件等等. 感觉与前文的学科结合手段有点接近, 范围也许更广.

感觉这样的项目做大了就会接近wolfram知识库, 优势是开源, 中文化和更侧重中国相关的数据. 下面从数学和历史两个方向做了非常初步的尝试.

数学

尝试从人教版小学数学一年级上册开始, 但也许从更高年级开始更有可行性(更容易程序化).

"准备课"中的认知部分, 如认识上下左右前后, 算法识别不现实. 比多少的部分, 在没有加减能力的前提下, 通过将两组物品进行1:1的摆放, 定义了"同样多", "A比B多/少"的概念. 因此也模拟此过程, 避免使用加减法和数字大小比较, python3实现如下:

from enum import Enum

class 比较结果(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(因为想和通过浏览器插件实现一个计算/编程工具 · Issue #61 · program-in-chinese/overview结合)编写历史数据, 感觉有几个优势:

  • 数据是文本格式, 易于合作编辑
  • 易于扩展和重构, 相比数据库, 可以更方便地增减/修改数据之间的关系
  • 编辑时可以借助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. 考虑将数据范围限制在教材内, 以避免数据量过度膨胀.

源于讨论: 通过中文命名将少儿编程与核心学科结合起来 · Issue #97 · program-in-chinese/overview

相关问题: 有哪些开源的知识库(数据, 非软件)? - V2EX

2018-10-27

相关文章
|
16天前
|
机器学习/深度学习 搜索推荐 大数据
大数据与教育:学生表现分析的工具
【10月更文挑战第31天】在数字化时代,大数据成为改善教育质量的重要工具。本文探讨了大数据在学生表现分析中的应用,介绍学习管理系统、智能评估系统、情感分析技术和学习路径优化等工具,帮助教育者更好地理解学生需求,制定个性化教学策略,提升教学效果。尽管面临数据隐私等挑战,大数据仍为教育创新带来巨大机遇。
|
6月前
|
分布式计算 NoSQL 大数据
探索数据宇宙:深入解析大数据分析与管理技术
探索数据宇宙:深入解析大数据分析与管理技术
112 1
|
自动驾驶 安全 大数据
大数据对人类生活的好处
大数据对人类生活的影响是巨大的。它可以帮助我们改善医疗保健、提高交通效率、创造新的商业机会,甚至帮助我们更好地了解自己。
115 0
《现实世界数字化大型城市建模的实践与挑战》电子版地址
现实世界数字化:大型城市建模的实践与挑战
56 0
《现实世界数字化大型城市建模的实践与挑战》电子版地址
|
数据采集 供应链 数据管理
统一数据的认识三观 发挥数据的核心价值
数据治理是长期、复杂的工程,绝非一个部门的事情,更应该从董、监、高治理层建立组织、赋予职责。
统一数据的认识三观 发挥数据的核心价值
|
存储 分布式计算 大数据
通俗理解大数据及其应用价值
通俗理解大数据及其应用价值
通俗理解大数据及其应用价值
《现实世界数字化:大型城市建模的实践与挑战》电子版地址
现实世界数字化:大型城市建模的实践与挑战
144 0
《现实世界数字化:大型城市建模的实践与挑战》电子版地址
|
数据采集 存储 人工智能
数据价值有效发挥的障碍:高级数据分析常见的五种挑战
我们经常听到高级分析的成功案例。人们对人工智能的期望很高——据预测人工智能和人工智能的年经济价值将在9.5万亿到15.4万亿美元之间——因此,只要有可能,许多人都想把目光聚焦在数据分析技术的发展上。
|
Web App开发 监控 大数据
解析业务数据的特征——《企业大数据实践路线》之三
阿里云MVP戚俊带你分析数据类型,进行大数据实战
2492 0
|
机器学习/深度学习 人工智能 搜索推荐