前言
PDF翻译完成后,如何保证翻译质量?人工校对成本高、速度慢,对于批量翻译场景完全不现实。本文分享一个用Python构建的自动校对工具,通过拼写检查、语法分析和术语一致性三重验证,快速筛查翻译结果中的常见问题。
环境准备
pip install pymupdf language-tool-python pyspellchecker openpyxl
- PyMuPDF:读取PDF文本内容
- language-tool-python:语法检查(基于LanguageTool)
- pyspellchecker:拼写检查
- openpyxl:导出校对报告
实现步骤
Step 1: 提取PDF翻译文本
import fitz # PyMuPDF
def extract_pdf_text(pdf_path: str) -> dict:
"""提取PDF每页文本,返回 {页码: 文本} 字典"""
pages = {}
doc = fitz.open(pdf_path)
for page_num, page in enumerate(doc, 1):
text = page.get_text("text")
if text.strip():
pages[page_num] = text.strip()
doc.close()
return pages
这个函数逐页提取PDF文本,保留页码信息。后续校对发现的问题可以精确定位到页码。
Step 2: 拼写检查
from spellchecker import SpellChecker
def check_spelling(text: str, lang: str = "en") -> list:
"""检查文本拼写错误
Args:
text: 待检查文本
lang: 语言代码(en/zh等)
Returns:
错误列表,每个元素为 {word, position, suggestions}
"""
spell = SpellChecker(language=lang)
words = text.split()
errors = []
misspelled = spell.unknown(words)
for word in misspelled:
# 排除数字、纯标点和短词
if len(word) < 2 or word.isdigit():
continue
suggestions = list(spell.candidates(word))[:3]
errors.append({
"word": word,
"suggestions": suggestions,
"type": "spelling"
})
return errors
拼写检查使用pyspellchecker,支持多语言。对于中文翻译结果,拼写检查主要针对混入的英文单词。
Step 3: 语法分析
import language_tool_python
def check_grammar(text: str, lang: str = "en-US") -> list:
"""使用LanguageTool检查语法错误
Args:
text: 待检查文本
lang: 语言代码
Returns:
语法错误列表
"""
tool = language_tool_python.LanguageTool(lang)
matches = tool.check(text)
errors = []
for match in matches:
errors.append({
"rule_id": match.ruleId,
"message": match.message,
"context": match.context,
"replacements": match.replacements[:3],
"type": "grammar",
"offset": match.offset,
"length": match.errorLength
})
tool.close()
return errors
LanguageTool支持30+语言,能检测语法错误、标点问题、风格建议等。对于中文翻译结果,使用 zh 语言代码。
Step 4: 术语一致性检查
import re
from collections import defaultdict
def check_terminology_consistency(pages: dict) -> list:
"""检查全文术语翻译一致性
通过对比同一原文术语在不同页面的翻译结果,
检测是否存在同一术语被翻译成不同表述的问题。
Args:
pages: {页码: 文本} 字典
Returns:
不一致术语列表
"""
# 术语映射表(示例:原文 -> 期望统一译文)
# 实际使用时可根据文档类型预置术语表
terminology_map = {
"specification": ["规格", "规范", "说明书"],
"component": ["组件", "部件", "元件"],
"assembly": ["组件", "总成", "装配体"],
"tolerance": ["公差", "容差"],
"calibration": ["校准", "标定"],
}
inconsistencies = []
# 统计每个原文术语在译文中出现的不同翻译
for source_term, possible_translations in terminology_map.items():
found_translations = defaultdict(list)
for page_num, text in pages.items():
for translation in possible_translations:
if translation in text:
found_translations[translation].append(page_num)
# 如果同一原文术语有多个不同翻译,标记为不一致
if len(found_translations) > 1:
inconsistencies.append({
"source_term": source_term,
"translations": dict(found_translations),
"type": "terminology_inconsistency"
})
return inconsistencies
术语一致性检查是翻译质量的核心指标。这段代码通过预置术语表,扫描全文检测同一原文术语是否被翻译成不同表述。
Step 5: 综合校对入口
def run_full_proofread(pdf_path: str, lang: str = "en") -> dict:
"""对翻译后的PDF执行完整校对流程
三重验证:拼写检查 + 语法分析 + 术语一致性
Args:
pdf_path: PDF文件路径
lang: 目标语言
Returns:
校对报告字典
"""
# Step 1: 提取文本
pages = extract_pdf_text(pdf_path)
all_text = "\n".join(pages.values())
# Step 2: 拼写检查
spelling_errors = check_spelling(all_text, lang)
# Step 3: 语法检查
grammar_errors = check_grammar(all_text, lang.replace("-", "-") if "-" in lang else f"{lang}-US")
# Step 4: 术语一致性检查
terminology_issues = check_terminology_consistency(pages)
# 生成报告
report = {
"file": pdf_path,
"total_pages": len(pages),
"total_chars": len(all_text),
"spelling_errors": spelling_errors,
"grammar_errors": grammar_errors,
"terminology_issues": terminology_issues,
"summary": {
"spelling_count": len(spelling_errors),
"grammar_count": len(grammar_errors),
"terminology_count": len(terminology_issues),
"total_issues": len(spelling_errors) + len(grammar_errors) + len(terminology_issues)
}
}
return report
Step 6: 导出Excel报告
import openpyxl
from openpyxl.styles import Font, PatternFill
def export_report(report: dict, output_path: str = "proofread_report.xlsx"):
"""将校对报告导出为Excel文件"""
wb = openpyxl.Workbook()
# Sheet1: 汇总
ws_summary = wb.active
ws_summary.title = "校对汇总"
ws_summary.append(["文件", report["file"]])
ws_summary.append(["总页数", report["total_pages"]])
ws_summary.append(["总字符数", report["total_chars"]])
ws_summary.append(["拼写错误数", report["summary"]["spelling_count"]])
ws_summary.append(["语法错误数", report["summary"]["grammar_count"]])
ws_summary.append(["术语不一致数", report["summary"]["terminology_count"]])
ws_summary.append(["总问题数", report["summary"]["total_issues"]])
# Sheet2: 拼写错误详情
ws_spelling = wb.create_sheet("拼写错误")
ws_spelling.append(["错误单词", "建议修正"])
for err in report["spelling_errors"]:
ws_spelling.append([err["word"], ", ".join(err["suggestions"])])
# Sheet3: 语法错误详情
ws_grammar = wb.create_sheet("语法错误")
ws_grammar.append(["规则ID", "错误信息", "上下文", "建议修正"])
for err in report["grammar_errors"]:
ws_grammar.append([
err["rule_id"],
err["message"],
err["context"],
", ".join(err["replacements"])
])
# Sheet4: 术语不一致详情
ws_term = wb.create_sheet("术语不一致")
ws_term.append(["原文术语", "发现的翻译", "对应页码"])
for issue in report["terminology_issues"]:
for trans, pages in issue["translations"].items():
ws_term.append([
issue["source_term"],
trans,
", ".join(str(p) for p in pages)
])
wb.save(output_path)
print(f"报告已保存至: {output_path}")
完整运行示例
if __name__ == "__main__":
# 校对翻译后的PDF文件
pdf_file = "translated_manual.pdf"
print("开始校对...")
report = run_full_proofread(pdf_file, lang="zh")
print(f"\n=== 校对结果 ===")
print(f"总页数: {report['total_pages']}")
print(f"拼写错误: {report['summary']['spelling_count']} 处")
print(f"语法错误: {report['summary']['grammar_count']} 处")
print(f"术语不一致: {report['summary']['terminology_count']} 处")
print(f"总问题数: {report['summary']['total_issues']} 处")
# 导出Excel报告
export_report(report, "校对报告.xlsx")
运行效果
对一份50页的机械工程手册翻译件执行校对,典型输出:
开始校对...
=== 校对结果 ===
总页数: 50
拼写错误: 3 处
语法错误: 12 处
术语不一致: 2 处
总问题数: 17 处
报告已保存至: 校对报告.xlsx
Excel报告中,拼写错误Sheet列出了错误单词和修正建议;语法错误Sheet包含规则ID、错误描述和上下文;术语不一致Sheet显示了"calibration"被翻译成"校准"(第3、15、28页)和"标定"(第42页)的问题。
总结
这个三重校对工具的核心价值不在于完全替代人工校对,而在于快速筛查——在人工校对前先过滤掉明显的拼写错误、语法问题和术语不一致,让人工校对聚焦在语义准确性和表达流畅度上。
实际使用中,结合PDFTranslator这类支持格式保留的翻译工具,先翻译再用本工具校对,可以将翻译质量控制效率提升3-5倍。术语一致性检查特别适合技术文档、产品手册等对术语统一性要求高的场景。
标签:Python、PDF翻译、AI翻译、自动化测试

463

被折叠的 条评论
为什么被折叠?



