为何用 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是数组,也就是有顺序的多条记录;每条记录可以是一组句子,也可以是一组段落,需标明记录单位。
// 或 #);
键名和字符串必须用双引号;最后一项后不能有尾随逗号。
原文、译文与来源的记录结构
记录分为两部分: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.granularity | string | 记录单位: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 导入"]
笔译练习:哪些记录适合参考
用途:为采购合同翻译寻找可回查的付款条款译例。
| 记录 | 原文 | 译文 | 来源与状态 |
|---|---|---|---|
| A | Payment is due within 30 days. | 款项应在30日内支付。 | 《采购合同》2026版第4条;已核对 |
| B | 未提供 | 款项应在30日内支付。 | 未提供来源 |
| C | Payment is due within 30 days. | 款项应在60日内支付。 | 《采购合同》2026版第4条;文件格式可读取,内容未核对 |
请判断:哪条可作为候选译例?另外两条有什么问题?文件可读取能否证明译文正确?
参考答案
A有对应原译文和来源,可结合当前合同参考。B缺原文和来源,无法核对。C把30日译成60日,需回查并修正。文件可读取只说明格式可被程序解析,不能证明内容正确。