第 2 章 · Python 基础

Python 读懂语料脚本

概

为什么语料工作常用 Python?

Python是一种编程语言;用Python写的脚本是一组按顺序执行的程序指令。例如,把100份双语文件的标题汇总成一张表,可以交给脚本重复处理。Python负责执行指令;文件是否选对、译文是否可用,仍需核对。

Python 的优势

  • 语法较简洁,可结合示例认识常见写法
  • 有现成的“库”,分别负责下载网页、提取正文等工作
  • 跨平台:Windows / Mac / Linux 均可运行
  • AI可起草脚本,结果仍需用已知材料检验
技

常见写法

1. 变量:给数据贴标签

变量是程序中保存数据时使用的名字。corpus_name = "NYT 双语新闻库"表示把这个名称保存下来,后面可用corpus_name引用。等号在这里表示赋值。

corpus_name = "NYT 双语新闻库"
pair_count = 1250
is_bilingual = True

读法:corpus_name保存语料库名称;pair_count保存数量1250;is_bilingual表示是否为双语材料。

2. 字符串:文本数据

语料处理的对象几乎都是字符串(str)。用单引号或双引号包裹;中文字符与英文字符一样,都是字符串的一部分。

source = "The flight was delayed due to weather."
target = "航班因天气原因延误。"
# len() 返回字符串的字符个数
print(len(source))   # 输出: 38

3. 列表:有序的数据集合

列表用方括号 [] 表示,可存放多个句对、多个文件名等。索引从 0 开始:items[0] 是第一个元素。

字典怎样保存一组原译文

{"source": "Hello.", "target": "你好。"}是一条字典记录;source和target是名称,也叫“键”,后面的文字是“值”。pair["source"]表示取出这条记录的原文。

pairs = [
    {"source": "Hello.", "target": "你好。"},
    {"source": "Goodbye.", "target": "再见。"}
]
first_pair = pairs[0]
print(first_pair["source"])   # 输出: Hello.

4. for 循环:逐条处理

当需要对列表中每一项做相同操作时,用 for ... in ... 循环。注意缩进(通常 4 个空格)表示「属于循环体内的语句」。

for pair in pairs:
    src = pair["source"]
    tgt = pair["target"]
    print(f"原文: {src} | 译文: {tgt}")

读法:对于 pairs 中的每一个 pair,取出原文与译文并打印。语料脚本中最常见的结构就是 for 循环遍历句对。

5. 函数:可反复使用的操作

函数把一项操作写成可反复使用的步骤。def定义步骤,return交回结果。示例函数接收一段文字,返回字符数;len()是Python自带的计数函数。

函数和库各做什么

库是一组现成工具:requests获取网页,BeautifulSoup提取网页内容,json读写记录。

使用现成工具的写法

import让脚本使用一个库,例如import json。json随Python自带;其他库可能需要安装。pip是安装Python库的工具,例如pip install requests。安装不会自动处理翻译材料。

def count_chars(text):
    """返回文本的字符数(含空格与标点)"""
    return len(text)

n = count_chars("Parallel corpus")
print(n)   # 输出: 15

6. 文件读写与 encoding='utf-8'

编码规定文字如何存成文件、再被读出。示例采用UTF-8。例如,“跑道”应读成原来的两个汉字;若显示为乱码,要先核对文件编码,不能直接当作缺字删除。

# 读取文本文件
with open("corpus.txt", "r", encoding="utf-8") as f:
    content = f.read()

# 写入文本文件
with open("output.txt", "w", encoding="utf-8") as f:
    f.write("清洗后的语料内容")

with open(...) as f: 是固定写法:打开文件、用完自动关闭。 "r" 表示只读,"w" 表示写入(会覆盖原文件)。

技术示例中的常见写法

if表示“符合条件才做”,例如译文为空时提示回查;raise ValueError表示报错并停止当前处理;#后是供人阅读的注释,不会执行。None表示没有结果,True/False表示真或假。

景

读懂两个典型脚本

JSON是一种保存记录的文本格式:metadata记录材料信息,content保存三条句对。把文件读取成程序能使用的记录,称为解析;显示几条供人查看,称为预览。读取和预览都不会自动校对译文。

{
  "metadata": { "title": "示例新闻句对", "lang_pair": "en-zh" },
  "content": [
    { "source": "Markets opened higher on Monday.", "target": "周一市场高开。" },
    { "source": "Analysts remain cautious.", "target": "分析师仍持谨慎态度。" },
    { "source": "Oil prices fell sharply.", "target": "油价大幅下挫。" }
  ]
}

示例 A:读取 JSON 并打印前 3 个句对

import json

# ① 打开并读取 JSON 文件(UTF-8 编码)
with open("corpus.json", "r", encoding="utf-8") as f:
    data = json.load(f)

# ② 从 data 中取出 content 列表(所有句对)
pairs = data["content"]

# ③ 只查看前 3 条:列表切片 [0:3] 表示索引 0 到 2
for pair in pairs[0:3]:
    print("—" * 40)
    print("原文:", pair["source"])
    print("译文:", pair["target"])

示例说明:

  • import json — 引入 Python 标准库,用于解析 JSON 文件
  • json.load(f) — 把文件内容解析为 Python 字典 data
  • data["content"] — 用键名 "content" 取出句对列表
  • pairs[0:3] — 切片,只循环前 3 条(预览大文件时常用)
  • pair["source"] — 每条句对是字典,用键取原文或译文

示例 B:遍历全部句对,统计总字符数

import json

with open("corpus.json", "r", encoding="utf-8") as f:
    data = json.load(f)

pairs = data["content"]

# 累加器:初始为 0
total_chars = 0

for pair in pairs:
    total_chars += len(pair["source"])
    total_chars += len(pair["target"])

print(f"句对数量: {len(pairs)}")
print(f"原文+译文总字符数: {total_chars}")

示例说明:

  • total_chars = 0:先把总数设为0,再把每条句对的字符数加进去
  • += — 等价于 total_chars = total_chars + len(...)
  • 字符数可说明文本规模,不能直接说明译文质量。例如,“Do not open.”漏译成“打开。”,统计仍可正常完成。字符数也不等于英文词数或翻译报价字数。
  • f"...":把计算结果放进显示文字中,例如“共3条句对”

笔译练习:整理结果能否用来核对

用途:为财经报道翻译挑选译例。

材料共有3条原译文,结果A列出如下:

原文译文
Markets opened higher on Monday.周一市场高开。
Analysts remain cautious.分析师仍持谨慎态度。
Oil prices fell sharply.油价大幅下挫。

结果B只有统计说明:“共3条;已统计原文和译文的字符数。”

请判断:哪份结果便于核对译文?仅凭结果B,能否确认材料完整、译文准确?

参考答案

结果A提供原文和译文,便于逐条核对。结果B只能说明程序报告的数量和统计状态;没有具体内容,无法确认是否漏掉信息、配错原译文或译错意思。结果A也需结合语境判断能否采用。