用Python构建PDF翻译结果自动校对工具:拼写检查+语法分析+术语一致性三重验证

前言

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翻译、自动化测试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值