第 8 章 · 数据建模

语料数据建模

概

为何用 JSON 存储语料?

JSON是一种用名称和值组织记录的文本格式,既能由人阅读,也能由程序解析。数据模型约定保存哪些信息、怎样组织;字段是其中一项有名称的信息。例如,每条译例保存原文、译文、来源和日期,避免只留一句译文,却不知道出自哪份材料。

JSON 的优势

  • 纯文本格式,可用任何编辑器打开
  • 层次清晰:对象嵌套对象、数组存列表
  • Python / JavaScript / Java 等均有内置支持
  • 可供检索系统等工具读取;导入前仍需核对结构

与其他格式对比

  • CSV/TSV分别用逗号或Tab分列,适合原文、译文等表格信息
  • XML用标签保存结构;翻译记忆交换格式TMX就采用XML
  • JSON:平衡可读性与结构表达力 ✓
技

JSON 基本语法

1. 六种基本类型

类型 示例 说明
对象 object { "key": "value" } 按名称保存信息;例如“来源网址:某个网址”。名称用双引号
数组 array [ "a", "b", "c" ] 按顺序保存多项内容;例如一篇文章中的3条句对
字符串 string "hello" / "中文" 必须用双引号,不能用单引号
数字 number 42 / 3.14 数量可用整数,例如3条句对;小数可记录长度比,例如0.5
布尔 boolean true / false 表示是或否,例如是否需要复核;JSON用小写true或false
空值 null null 表示没有值,例如暂未取得日期;不等于空白译文已经核对过

2. 嵌套:对象里放数组,数组里放对象

{
    "metadata": {
        "title": "示例标题",
        "date": "2026-09-16"
    },
    "content": [
        { "sentence_english": "Hello.", "sentence_chinese": "你好。" },
        { "sentence_english": "World.", "sentence_chinese": "世界。" }
    ]
}
  • 整份记录是一个对象,也就是按名称组织的信息;里面分别存材料信息和双语内容
  • metadata 的值是另一个对象(文档级材料信息)
  • content是数组,也就是有顺序的多条记录;每条记录可以是一组句子,也可以是一组段落,需标明记录单位。
常见错误:JSON 不允许注释(// 或 #); 键名和字符串必须用双引号;最后一项后不能有尾随逗号。
模

原文、译文与来源的记录结构

记录分为两部分:metadata保存来源、标题、日期等材料信息;content保存原译文。

字段路径 类型 说明
metadata object 文档级材料信息块
metadata.url string 原文来源 URL
metadata.title_english string 英文标题
metadata.title_chinese string 中文标题
metadata.date string 发布日期(ISO 格式 YYYY-MM-DD)
metadata.category string 分类标签,如 china、world
metadata.granularitystring记录单位:sentence表示句级,paragraph表示段落级
content array 句对列表,每项为一个 object
content[].sentence_english string 英文句子(原文)
content[].sentence_chinese string 中文句子(译文)

字段名要反映实际内容:sentence_english/sentence_chinese存句级内容;paragraph_english/paragraph_chinese存段落。约定格式不等于已完成分句和对齐。

约定格式、保存文件与入库

保存文件是把记录写入本地;入库是把记录交给保存或检索系统。例如,已保存的10组段落对仍需核对句子对应关系,才能提供可靠的句级译例。

记录单位要一致

一句原文对应两句中文时,可以把两句中文作为一组保存,不能为凑“一句对一句”丢掉其中一句。记录单位与字段含义应保持一致。

完整示例:NYT 双语新闻(简化版)

{
    "metadata": {
        "url": "https://cn.nytimes.com/china/20260916/china-english-language-education/dual/",
        "title_english": "In the Age of A.I., Some in China Wonder if Learning English Is Worth the Trouble",
        "title_chinese": "人工智能时代,中国人还需要学英语吗?",
        "date": "2026-09-16",
        "category": "china",
        "source": "New York Times Chinese Edition",
        "granularity": "sentence",
        "sentence_count": 3
    },
    "content": [
        {
            "sentence_english": "Should schools cut back on mandatory English class time?",
            "sentence_chinese": "学校是否应该削减英语的必修课时?"
        },
        {
            "sentence_english": "Some parents and teachers found Mr. Tang’s suggestion refreshing.",
            "sentence_chinese": "一些家长和老师认为汤家凤的建议令人耳目一新。"
        },
        {
            "sentence_english": "But for others, making English less of a priority would be a step backward.",
            "sentence_chinese": "但对另一些人来说,降低英语的优先地位无异于倒退。"
        }
    ]
}
码

json.load() 与 json.dump()

读取 JSON 文件 — json.load()

import json

# 从文件读取语料
with open("corpus/china-english-language-education.json", "r", encoding="utf-8") as f:
    corpus = json.load(f)

# 访问 metadata
print(corpus["metadata"]["title_chinese"])
# 人工智能时代,中国人还需要学英语吗?

# 遍历句对
for pair in corpus["content"]:
    en = pair["sentence_english"]
    zh = pair["sentence_chinese"]
    print(f"EN: {en}")
    print(f"ZH: {zh}")
    print("---")
  • json.load(f) 从文件对象解析 JSON 为 Python 字典/列表
  • 本例文件采用UTF-8,读取时也按UTF-8;其他文件需核对实际编码
  • 解析后的corpus是字典,可按字段名取出标题或句对。

写入 JSON 文件 — json.dump()

Python代码
import json

# 构建语料记录(清洗 + 对齐后的句对)
corpus_record = {
    "metadata": {
        "url": "https://cn.nytimes.com/china/20260916/china-english-language-education/dual/",
        "title_english": "In the Age of A.I., Some in China Wonder if Learning English Is Worth the Trouble",
        "title_chinese": "人工智能时代,中国人还需要学英语吗?",
        "date": "2026-09-16",
        "category": "china",
        "sentence_count": len(pairs)
    },
    "content": pairs   # pairs 是 [{"sentence_english": ..., "sentence_chinese": ...}, ...]
}

# 写入文件
with open("output/china-english-language-education.json", "w", encoding="utf-8") as f:
    json.dump(
        corpus_record,
        f,
        ensure_ascii=False,   # 便于直接阅读汉字,不显示为 \uXXXX
        indent=2              # 缩进 2 空格,便于人类阅读
    )

print("语料已保存")

ensure_ascii=False

例如,“跑道”可能写成\u8dd1\u9053。设为ensure_ascii=False会直接显示汉字,方便人工阅读;两种写法都能正确表示中文,并非只有False才保存正确。

indent=2

缩进和换行便于人工查阅,不改变记录内容。例如,同一组句对分行显示,仍是一条记录。

字符串与文件:json.loads() / json.dumps()

import json

# 字符串 → Python 对象
json_str = '{"title": "示例", "count": 42}'
data = json.loads(json_str)       # loads = load string
print(data["title"])              # 示例

# Python 对象 → 字符串
text = json.dumps(data, ensure_ascii=False, indent=2)
print(text)

load/dump 操作文件;loads/dumps 操作字符串(s = string)。

延

从建模到应用

保存成JSON只完成了记录。内容仍需对齐和质检;导入CAT工具还要按工具要求转为TMX等支持的格式,不能假定任意JSON可直接导入。

flowchart LR
    A["清洗文本"] --> B["构建 metadata + content"]
    B --> C["json.dump 写入 .json"]
    C --> D["质检 / 检索 / TM 导入"]
                    

笔译练习:哪些记录适合参考

用途:为采购合同翻译寻找可回查的付款条款译例。

记录原文译文来源与状态
APayment is due within 30 days.款项应在30日内支付。《采购合同》2026版第4条;已核对
B未提供款项应在30日内支付。未提供来源
CPayment is due within 30 days.款项应在60日内支付。《采购合同》2026版第4条;文件格式可读取,内容未核对

请判断:哪条可作为候选译例?另外两条有什么问题?文件可读取能否证明译文正确?

参考答案

A有对应原译文和来源,可结合当前合同参考。B缺原文和来源,无法核对。C把30日译成60日,需回查并修正。文件可读取只说明格式可被程序解析,不能证明内容正确。