一、核心结构定义
对任意时间类型(如创作时间、事件时间等),采用以下双字段结构:
表格
| 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|
temporal_original | string | 文本中原始时间表述(保留原字) | “至德二载春”、“昨日”、“先王之时” |
temporal_normalized | object | 标准化后的时间结构 | 见下表 |
而 temporal_normalized 又分为两种子类型:
A. 绝对时间(absolute)
json
编辑
1{
2 "type": "absolute",
3 "iso8601": "0757-03", // ISO 8601 扩展格式(支持年、年月、年月日)
4 "calendar": "chinese_gregorian_mixed", // 可选:gregorian, chinese, julian 等
5 "confidence": "high" // 可选:high / medium / low
6}
B. 相对时间(relative)
json
编辑
1{
2 "type": "relative",
3 "expression": "three days after", // 标准化后的相对表达(英文或可控词汇)
4 "anchor_id": "sent_123", // 指向锚点(如某句、某事件)的ID
5 "offset": "+3D", // ISO 8601 duration 格式:+3D=三天后,-1Y=一年前
6 "resolved_iso8601": "0757-04-10" // (可选)若已解析出绝对时间,可填此字段
7}
🔔 关键原则:
- 所有绝对时间必须能映射到 ISO 8601 公历坐标系(公元前用负号,如
-0208)- 相对时间必须关联一个明确的锚点(anchor),否则无法解析
二、完整时间类型模板(适用于任一层级)
json
编辑
1{
2 "creation_time": {
3 "temporal_original": "乾元二年秋",
4 "temporal_normalized": {
5 "type": "absolute",
6 "iso8601": "0759-09",
7 "calendar": "chinese",
8 "confidence": "medium"
9 }
10 },
11 "event_time": {
12 "temporal_original": "安禄山反于范阳",
13 "temporal_normalized": {
14 "type": "absolute",
15 "iso8601": "0755-12",
16 "calendar": "gregorian_estimated",
17 "confidence": "high"
18 }
19 },
20 "reference_time": {
21 "temporal_original": "明日",
22 "temporal_normalized": {
23 "type": "relative",
24 "expression": "next day",
25 "anchor_id": "para_005", // 锚定到上一段落所指时间
26 "offset": "+1D"
27 // resolved_iso8601 可由推理引擎后续填充
28 }
29 },
30 "recording_time": {
31 "temporal_original": "宋绍兴年间刊本",
32 "temporal_normalized": {
33 "type": "absolute",
34 "iso8601": "1131/1162", // 表示时间段
35 "calendar": "gregorian",
36 "confidence": "low"
37 }
38 }
39}
三、在 TEI XML 中的实现方式
TEI 支持通过 <date> 元素 + 自定义属性实现上述结构:
xml
编辑
1<date type="creation" 2 evidence="original" 3 when-custom="乾元二年秋" 4 when="0759-09" 5 calendar="chinese" 6 confidence="medium"/> 7 8<date type="reference" 9 evidence="original" 10 when-custom="明日" 11 ana="#relative_time" 12 instant="#anchor_para_005" 13 dur="+1D"/>
💡 注:TEI 本身不强制
when-custom,但可通过 ODD 定制 schema 添加该属性。
四、各时间类型的适用场景说明
表格
| 时间类型 | 原始文本常见形式 | 标准化难点 | 建议处理方式 |
|---|---|---|---|
| 创作时间 | 年号+干支(“贞观三年”)、作者生卒推断 | 年号转公历、不确定年份 | 用 notBefore/notAfter 或 ISO 范围 |
| 记录时间 | 版本题记(“嘉靖乙酉刻本”) | 刊刻年代模糊 | 标注为时间段,confidence=low |
| 发生时间 | 历史事件(“赤壁之战”)、季节(“春”) | 事件年代争议、季节无具体日 | 优先用年,季节可补为 YYYY-03(春) |
| 指向时间 | “昔者”“今”“后五年” | 高度依赖上下文锚点 | 必须绑定 anchor_id,暂不强制 resolved |
| 传播时间 | “初刊于1905年” | 近代较明确 | 直接 absolute |
五、相对时间的锚点管理策略
为支持相对时间解析,需在系统中维护时间锚点注册表:
json
编辑
1{
2 "time_anchors": {
3 "para_005": {
4 "text_snippet": "至德二载三月,长安陷。",
5 "normalized_time": "0757-03"
6 },
7 "event_001": {
8 "description": "安史之乱爆发",
9 "normalized_time": "0755-12"
10 }
11 }
12}
当遇到“其明年”时,系统可:
- 识别其锚点(前一句或前一事件)
- 提取该锚点的
normalized_time - 加 offset(+1Y)→ 得到
resolved_iso8601
六、标准化时间格式细则(推荐)
表格
| 场景 | ISO 8601 表达 | 说明 |
|---|---|---|
| 公元757年 | "0757" | xsd:gYear |
| 公元前208年 | "-0208" | 注意四位数,补零 |
| 757年春季 | "0757-03" | 春=3月,夏=6月,秋=9月,冬=12月(约定俗成) |
| 不确定年份(750–759) | "075X" 或 "0750/0759" | 后者更标准 |
| 三天后 | "+3D"(duration) | 用于 relative.offset |
| 从757年到760年 | "0757/0760" | 时间段 |
总结:时间模型优势
- 保真性:保留原始文本,避免信息丢失
- 计算友好:标准化字段支持排序、查询、可视化
- 语义清晰:区分绝对/相对,强制锚点机制
- 跨时代兼容:从“贞观三年”到“2025-02-11”统一处理