#!/usr/bin/env python3
"""
用上下文修復 OCR 錯字
策略：找出常見 OCR 錯誤模式，用上下文修正
"""
import re

# 已知的 OCR 錯誤對照表（從分析結果整理）
KNOWN_ERRORS = {
    # 書名/人名相關（簡體→繁體 + 修正 OCR 錯誤）
    '行動中的佈紫': '行動中的組織',
    '行动中的组织': '行動中的組織',
    '行政理垃': '行政管理',
    '社金科學基砲': '社會科學基礎',
    '社会科学基础': '社會科學基礎',
    '组純社金': '組織社會',
    '组织社会学': '組織社會學',
    '敦炮': '叢書',
    '敦又嘉連': '敬又嘉',
    '敬又嘉連': '敬又嘉',
    '敬义嘉': '敬又嘉',
    '詹妻斯': '詹姆斯',
    '詹姆斯': '詹姆斯',
    '洛普橫': '湯普森',
    '敬又嘉洪': '敬又嘉',
    '組紉': '組織',
    '組紗': '組織',
    '组织': '組織',
    '社金': '社會',
    '社八': '社會',
    '社会': '社會',
    '行勉': '行政',
    '行政理沭': '行政管理',
    '行政理论': '行政理論',
    '田夜': '田納西',
    '塞伐茲尼克': '塞爾茲尼克',
    '塞尔兹尼克': '塞爾茲尼克',
    '理垃': '管理',
    '基砲': '基礎',
    '基砷': '基礎',
    '洪炮': '叢書',
    '洪者': '譯者',
    '洪普': '湯普',
    '江普森': '湯普森',
    '普森': '湯普森',
    '湯暑森': '湯普森',
    '湯智森': '湯普森',
    '湯葛淵': '湯普森',
    '迅普淵': '湯普森',
    '汤普森': '湯普森',
    '汤 湯普森': '湯普森',
    '冕仪': '敬又嘉',
    '人灭乃成赳': '人民出版社',
    '上海人滅': '上海人民',
    '上海人灭': '上海人民',
    '译妞': '譯叢',
    '译仰': '譯叢',
    '羡': '美',
    '译者': '譯者',
    '译名': '譯名',
    
    # 學術術語（簡體→繁體）
    '不确定性': '不確定性',
    '确定性': '確定性',
    '决定性': '決定性',
    '封闭性': '封閉性',
    '开放性': '開放性',
    '理性模型': '理性模型',
    '自然系统': '自然系統',
    '封闭系统': '封閉系統',
    '开放系统': '開放系統',
    '组织行为': '組織行為',
    '组织结构': '組織結構',
    '组织理论': '組織理論',
    '技术理性': '技術理性',
    '任务环境': '任務環境',
    '行政管理': '行政管理',
    '官僚制': '官僚制',
    '科学管理': '科學管理',
    '生产': '生產',
    '技术': '技術',
    '环境': '環境',
    '系统': '系統',
    '组织': '組織',
    '结构': '結構',
    '理论': '理論',
    '行为': '行為',
    '理性': '理性',
    '效率': '效率',
    '权力': '權力',
    '目标': '目標',
    '决策': '決策',
    '过程': '過程',
    '变化': '變化',
    '组织间': '組織間',
    '组织内': '組織內',
    '复杂': '複雜',
    '复杂组织': '複雜組織',
    '相互依赖': '相互依賴',
    '相互依存': '相互依存',
    '适应': '適應',
    '进化': '進化',
    '组织成员': '組織成員',
    '个人': '個人',
    '信息': '資訊',
    '资源': '資源',
    '协调': '協調',
    '控制': '控制',
    '评估': '評估',
    
    # 常見錯字
    '的組織一一': '的組織——',
    '一一行政理論': '——行政理論',
    '紛典': '經典',
    '紡典': '經典',
    '官僚個性': '官僚個性',
    '古爾德納': '古爾德納',
    '古尔德纳': '古爾德納',
    '塞爾茲尼克': '塞爾茲尼克',
    '韋伯': '韋伯',
    '韦伯': '韋伯',
    '泰勒': '泰勒',
    '泰勤': '泰勒',
    '西蒙': '西蒙',
    '马奇': '馬奇',
    '馬奇': '馬奇',
    '伯纳德': '伯納德',
    '伯納德': '伯納德',
    '帕森斯': '帕森斯',
    '帕淼斯': '帕森斯',
    '帕淼斯': '帕森斯',
    '劳伦斯': '勞倫斯',
    '勞倫斯': '勞倫斯',
    '罗斯奇': '羅斯奇',
    '布劳': '布勞',
    '布勞': '布勞',
    
    # 英文人名修復
    'Tompson': 'Thompson',
    'Gulick and Urwick, 盼37': 'Gulick and Urwick, 1937',
    'Weber, 1947': 'Weber, 1947',
    'Dill,': 'Dill,',
    'Barnard': 'Barnard',
    'Selznick': 'Selznick',
    'March': 'March',
    'Simon': 'Simon',
    'Cyert': 'Cyert',
    'Gouldner': 'Gouldner',
    'Woodward': 'Woodward',
    'Lawrence': 'Lawrence',
    'Lorsch': 'Lorsch',
    'Pfeffer': 'Pfeffer',
    'Salancik': 'Salancik',
    'Galbraith': 'Galbraith',
    'Donaldson': 'Donaldson',
    'Parsons': 'Parsons',
    'Katz': 'Katz',
    'Kahn': 'Kahn',
    'Whyte': 'Whyte',
    'Mayo': 'Mayo',
    'Taylor': 'Taylor',
    'Scott': 'Scott',
    'Crozier': 'Crozier',
    'Bartlett': 'Bartlett',
    'Ashby': 'Ashby',
    'Weiner': 'Wiener',
    'Boulding': 'Boulding',
    'Hannan': 'Hannan',
    'Freeman': 'Freeman',
    'Pugh': 'Pugh',
    'Hickson': 'Hickson',
    'Hinings': 'Hinings',
    'Turner': 'Turner',
    'Meyer': 'Meyer',
    'Tsui': 'Tsui',
    'Blau': 'Blau',
    'Schoenherr': 'Schoenherr',
    'Calahan': 'Calahan',
    'Kanigel': 'Kanigel',
    'Roethlisberger': 'Roethlisberger',
    'Dickson': 'Dickson',
    'Clark': 'Clark',
    'Downs': 'Downs',
    'Cummings': 'Cummings',
    'Litchfield': 'Litchfield',
    'Odum': 'Odum',
    'Avery': 'Avery',
    'Bates': 'Bates',
    'Carlson': 'Carlson',
    'Hammond': 'Hammond',
    'Hawkes': 'Hawkes',
    'McEwen': 'McEwen',
    'Tuden': 'Tuden',
    'Demerath': 'Demerath',
    'Beck': 'Beck',
    'Ogul': 'Ogul',
    'Weber': 'Weber',
    'Stinchcombe': 'Stinchcombe',
    'Wilson': 'Wilson',
    'Kamps': 'Kamps',
    'Polos': 'Polos',
    'Hannan and Freeman, 1989': 'Hannan and Freeman, 1989',
    'Frederick': 'Frederick',
    'Elton': 'Elton',
    'William': 'William',
    'Robert': 'Robert',
    'Peter': 'Peter',
    'Edward': 'Edward',
    'Richard': 'Richard',
    'Philip': 'Philip',
    'Chester': 'Chester',
    'Alvin': 'Alvin',
    'James': 'James',
    'Herbert': 'Herbert',
    'George': 'George',
    'Tom': 'Tom',
    'John': 'John',
    'Kenneth': 'Kenneth',
    'Jeffrey': 'Jeffrey',
    'Gerald': 'Gerald',
    'Jay': 'Jay',
    'Lex': 'Lex',
    'Talcott': 'Talcott',
    'Daniel': 'Daniel',
    'Joan': 'Joan',
    'Alan': 'Alan',
    'Anne': 'Anne',
    'C.': 'C.',
    'D.': 'D.',
    'E.': 'E.',
    'F.': 'F.',
    'G.': 'G.',
    'H.': 'H.',
    'I.': 'I.',
    'J.': 'J.',
    'K.': 'K.',
    'L.': 'L.',
    'M.': 'M.',
    'N.': 'N.',
    'O.': 'O.',
    'P.': 'P.',
    'R.': 'R.',
    'S.': 'S.',
    'T.': 'T.',
    'V.': 'V.',
    'W.': 'W.',
    
    # 數字和頁碼
    '1949': '1949',
    '1950': '1950',
    '1954': '1954',
    '1957': '1957',
    '1958': '1958',
    '1959': '1959',
    '1962': '1962',
    '1963': '1963',
    '1964': '1964',
    '1965': '1965',
    '1967': '1967',
    '1968': '1968',
    '1971': '1971',
    '1973': '1973',
    '1976': '1976',
    '1977': '1977',
    '1978': '1978',
    '1989': '1989',
    '1992': '1992',
    '1993': '1993',
    '1997': '1997',
    '1999': '1999',
    '2001': '2001',
    '2003': '2003',
    '2007': '2007',
}

def fix_ocr_text(text):
    """修正 OCR 文字"""
    # 1. 應用已知修正
    for wrong, correct in KNOWN_ERRORS.items():
        text = text.replace(wrong, correct)
    
    # 2. 修正常見的字符錯誤
    # 一一 → ——
    text = re.sub(r'(?<=[\u4e00-\u9fff])一一(?=[\u4e00-\u9fff])', '——', text)
    
    # 3. 清理多餘空白
    text = re.sub(r'  +', ' ', text)
    text = re.sub(r'\n\s*\n', '\n\n', text)
    
    return text

if __name__ == '__main__':
    import sys
    
    input_file = sys.argv[1] if len(sys.argv) > 1 else '/Users/lingochen/Desktop/ocr_sim_raw.txt'
    output_file = sys.argv[2] if len(sys.argv) > 2 else '/Users/lingochen/Desktop/ocr_fixed.txt'
    
    with open(input_file, 'r', encoding='utf-8') as f:
        text = f.read()
    
    fixed = fix_ocr_text(text)
    
    with open(output_file, 'w', encoding='utf-8') as f:
        f.write(fixed)
    
    print(f'已修正：{len(text)} → {len(fixed)} 字')
    print(f'儲存至：{output_file}')
