# -*- coding: utf-8 -*- """ Created on Thu Sep 19 10:47:14 2024 @author: Arnd Helmut Hafner """ #簡牘の基礎的釈読情報をTEI規格に準拠してエンコーディングする import sys # for sys.exit after error import re from re import compile, search #Tools(copied from tools.py in Liye database) def searchpreparation(string,sufflate,prefix = '',suffix = ''): ''' Inserts regex into strings in order to suppress interference of irregular symbols during search Parameters ---------- string : str searched string sufflate : str Regex inserted between the constituent characters of the string prefix : str, optional Regex inserted before the string. The default is ''. suffix : str, optional Regex inserted behind the string. The default is ''. Returns ------- string: str ''' #記号交じりの原文から文字列を検索するために、文字列を正規表現に置き換える #string = 検索したい文字列 #prefex = 原文では検索したい文字列の前にあり得る記号のリストの正規表現 #sufflate = 検索したい文字列の間に出現しうる記号のリストの正規表現 #suffix = 検索したい文字列の後ろに出現しうる記号のリストの正規表現 string = re.findall('.',string) tempstring = prefix + string[0] for c in range(1,len(string)): tempstring += sufflate + string[c] string = tempstring + suffix return(string) #Input/Output def readtext(filename): """ 釈文をファイルから読み込む Parameters ---------- filename : str Returns ------- textori : dict {slipno:shakumon} 簡番号をキーに釈文を記憶する辞書 titles : dict {titelno:title} 編者によって付けられた標題行を、原文と区別して保存するための辞書 kiis : list textoriとtitlesのキーを出現順に記憶するリスト。 テキスト構築に当たりこの情報は必要になる """ textori = {} slipn = "" titles = {} kiis = [] datafile = open(filename, 'r', encoding='utf-8-sig') for line in datafile: line = re.sub('\n','',line) #空白行を排除 if line == '':continue #タイトル行を識別 m = re.search('^([〇一二三四五六七八九]+) (.+)$',line) if m: kii, title = m.group(1),m.group(2) titles[kii] = kii + ' ' + title kiis.append(kii) continue #本文行を識別 m = re.search('^([^\t]+)\t([^\t]+)$',line) if m: slipn,shakumon = m.group(1),m.group(2) textori[slipn] = slipn + '\t' + shakumon kiis.append(slipn) else:sys.exit('Mismatchi readtext. Line is:\n{}'.format(line)) datafile.close() return(textori,titles,kiis) def outputtext(filename,textori,titles,kiis,divstart,divend): """ チェック用にデータを出力する Parameters ---------- filename : str textori : dic {slipn:shakumon} titles : dic {titelno:title} kiis : list divstart : str 事案ごとに付ける空行やヘッダーをテキスト形式で提供する divend : str 事案ごとにフッターをテキスト形式で提供する Returns ------- None. """ outputfile = open(filename, 'w', encoding='utf-8-sig') for n in range(len(kiis)): #標題行を識別 if len(kiis[n]) == 2: outputfile.write('{}{}\n'.format(divstart,titles[kiis[n]])) continue #本文簡の処理 outputfile.write('{}\n'.format(textori[kiis[n]])) #最終行を検出 if n == len(kiis)-1: outputfile.write('{}\n'.format(divend)) outputfile.close() return def outputdic(dic,filename,kiiname,valuename): outputfile = open(filename, 'w', encoding='utf-8-sig') for kii in dic.keys(): for n in range (len(dic[kii])): outputfile.write('{}:{}\n{}:{}\n'.format(kiiname,kii,valuename,dic[kii][n])) outputfile.close() return #encoding def titleencoding(titles): return(titles) def suppliedillegchar(char): """ Parameters ---------- char : str 一文字 Returns ------- char : str '' """ char = suppliedillegb + char + suppliede return(char) def hatenashori1(kakkomae,kakkonai): """ 読み換え等において、 釈読に対する疑問を現わす疑問符が読み換えの注記に混じっている時に、 疑問のエンコーディングをした上で、 疑問符を削除する Parameters ---------- kakkomae : str 釈読字 kakkonai : str 疑問符が混じっている読み換え等の注記 Returns ------- kakkomae : str kakkonai : str """ m1 = re.search('^(?(.+))$', kakkonai) if m1: kakkomae += certaintyreading kakkonai = re.sub(m1.group(1),m1.group(2),kakkonai) return(kakkomae,kakkonai) def hatenashori2(kakkonai): """ 読み換え等において、 読み換えに対する疑問を現わす疑問符が読み換え注記に含まれている時に、 疑問のエンコーディングをした上で、 疑問符を削除する Parameters ---------- kakkonai : str 疑問符が混じっている読み換え等の注記 Returns ------- kakkonai : str """ m2 = re.search('^((.+)?)$',kakkonai) if m2: kakkonai = re.sub(m2.group(1),m2.group(2) + certaintyreading,kakkonai) return(kakkonai) def hyphenjokyo(string,tag1b,tag1e,tag2b ='',tag2e = ''): """ 字1(字2-字3)における"字2-字3"の部分にタグを付ける Parameters ---------- string : str タグ付け対象文字列 tag1b : str 字2を記述するタグ(始め) tag1e : str 字2を表現するタグ(終り) tag2b : str, optional 字3を記述するタグ(始め). The default is ''. tag2e : str, optional 字3を記述するタグ(終り). The default is ''. Returns ------- string = str """ okikae = compile('(.)\-(.)') string = okikae.sub('{}{}\g<1>{}{}\g<2>{}{}'.format(choiceb,tag1b,tag1e,tag2b,tag2e,choicee),string) return(string) def abbrkako(abbr,expand,okikaemae): """ 省略表現("=")やその拡張形にタグをつける Parameters ---------- abbr : str "盜﹦","男﹦子﹦","夫﹦","粟﹦"等 expand : str "盜盜","男子。男子","大夫", "粟米"等 okikaemae : str "盜﹦(盜盜)", "男﹦子﹦(男子。男子)","夫﹦(大夫)","粟﹦(粟米)" Returns ------- okikaego : str 一例 爲秦。爲秦 """ #省略形のタグ付け okikaego = choiceb + abbrb abbrbunkai = re.findall('(?:{[^\-}]+}|[^()&﹦])(?:(?))?&?﹦&?',abbr) for p in range(len(abbrbunkai)): kashira = re.findall('^(?:{[^}]+}|.)',abbrbunkai[p]) if re.search('^(?:{[^\-}]+}|[^﹦])&',abbrbunkai[p]): kashira[0] = suppliedillegchar(kashira[0]) elif re.search('^(?:{[^\-}]+}|[^﹦])(?)',abbrbunkai[p]): kashira[0] += certaintyreading okikaego += kashira[0] if re.search('﹦&',abbrbunkai[p]): okikaego += amb +suppliedillegchar(Zhubun) + ame else:okikaego += amb +Zhubun + ame okikaego += abbre + expanb abbr = re.sub('[&﹦]','',abbr) abbr = re.sub('(?)','',abbr) #拡張形のタグ付け if re.search('^(?:{[^\-}]+}|[^{]){2,}$',abbr) and '-' not in expand:#'肆﹦室﹦(肆、室。肆、室)'等に対応する #re.search('^(?:{[^\-}]+}|.){2,}$',abbr) = len(abbr) > 1 abbr2 = searchpreparation(abbr,'[。,、?!:;]?') elif '-' in expand:#'气﹦鞫﹦(气-乞鞫,气-乞鞫)'等に対応する abbr2 = searchpreparation(abbr,'(?:\-.)?','','(?:\-.)?') else:abbr2 = abbr regex = compile('(' + abbr2 + '[。,、?!:;]?)') m1 = re.search(regex,expand) if m1: expandichiji = m1.group(1) ex = re.sub(regex,'',expand,1) else:sys.exit('Mismatch for {}\nabbr is {}\nexpand is {}\nresult of previous okikae is {}'. format(okikaemae,abbr,expand,okikaego)) if '-' in expand: #"字-字"の処理 expandichiji = hyphenjokyo(expandichiji,origb,orige) ex = hyphenjokyo(ex,exb,exe) # if re.search('^[^<]',ex):okikae = compile('^([^<])') else:okikae = compile('([^>])$') ex = okikae.sub('{}\g<1>{}'.format(exb,exe),ex) else: ex = exb + ex + exe if abbr[0] == expand[0]: okikaego += expandichiji + ex + expane + choicee else:#'夫=(大夫)' okikaego += ex + expandichiji + expane + choicee if re.search('[^<]+[。,、?!:;]',okikaego): regex = compile('([^<]+)([。,、?!:;])') okikaego = regex.sub('\g<1>\g<2>',okikaego) return(okikaego) def abbrencoding(line,abbrsoran): """ 重文記号を含む文字列を検出し、 文字列を分解した上でエンコーディング・加工を行うファンクションに 渡し、 釈文において置換を実施する。 Parameters ---------- line : str 要注意:簡番号を含む! abbrsoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str abbrsoran : dic """ #要注意:A=&(AA)およびA&=(AA)およびA(?)=(AA) #対象文字列の検出 hit = re.findall('((?:(?:{[^\-}]+}|[^()&﹦])(?:(?))?&?﹦&?)+)(([^)]+))', line) """ 捕捉される語などには次のような例がある [('盜﹦', '盜盜'), ('盜﹦', '盜盜')] [('男﹦子﹦', '男子。男子')] [('夫﹦', '大夫')] など """ for m in range(len(hit)): #対象文字列の分解 abbr = hit[m][0] expand = hit[m][1] okikaemae = abbr + '(' +expand + ')' #文字列加工 okikaego = abbrkako(abbr,expand,okikaemae) #文字列置換 line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in abbrsoran.keys(): abbrsoran[okikaemae] =[okikaego] elif okikaego not in abbrsoran[okikaemae]: abbrsoran[okikaemae].append(okikaego) return(line,abbrsoran) def hyotenoriencoding(line,hyotenorisoran): """ ●と┘の原文標点記号を検出し、 エンコーディングした上で、 釈文において置換を実施する。 Parameters ---------- line : str hyotenorisoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str hyotenorisoran : dic """ #対象文字列の検出 while re.search('([^<>])([●┘])(&?(???[^<>])?)', line): #各要素および置換前文字列の認識 m = re.search('([^<>])([●┘])(&?(???[^<>])?)', line) hyotenmae = m.group(1) if m.group(2) == '●' : hyoten = bokuten hyotengenbun = '●' else : hyoten = eluji hyotengenbun = '┘' hyotengo = m.group(3) okikaemae = m.group(0) #文字列加工 if re.search('^&', hyotengo): hyoten = suppliedillegchar(hyoten) hyotengo = re.sub('&','',hyotengo) if re.search('^(?[。,、?!:;]', hyotengo):#'┘(?,)'等 hyoten += certaintyreading hyotengo = re.sub('^(?','',hyotengo) elif hyoten == bokuten and re.search('^(?)', hyotengo):#'●(?)' # '┘'後の'(?)'は多くの場合現代句読点の疑問符。墨点の後ろは釈読の不確実性を表す #ことがおおい。 しかし、 曖昧性が残るから手作業による確認が必要 hyoten += certaintyreading hyotengo = re.sub('^(?)','',hyotengo) if re.search('[。,、?!:;]', hyotengo):#'┘(,)'等 okikaego = hyotenmae + choiceb + origb + hyoten + orige + regb + re.sub('[()]', '', hyotengo) + rege + choicee elif hyotenmae not in '。,、?!:;\t[[【': #'字┘字'等 okikaego = hyotenmae + surplusreg + hyoten + surpluse elif hyotenmae == '[': #衍字 okikaego = surplusred + hyoten + surpluse else:#行頭の墨点等 okikaego = hyotenmae + choiceb + origb + hyoten + orige + regb + hyotengenbun + rege + choicee + hyotengo #文字列置換 line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in hyotenorisoran.keys(): hyotenorisoran[okikaemae] =[okikaego] elif okikaego not in hyotenorisoran[okikaemae]: hyotenorisoran[okikaemae].append(okikaego) return(line,hyotenorisoran) def kutoencoding(line,kutosoran): """ 句読点("[。,、?!:;]")を検出し、 エンコーディングする。 重文記号の展開文字列における句読もエンコーディングの対象 残欠を補った釈文(" 【字】 ")における句読はketsujiencodingにおいて重複してエンコーディングされること になるから、 処理後削除すべし(最初から避けたいが、技術的に検出し難い) 原文の句読("●┘")の後ろの句読は、 最初からエンコーディングを避けるべし(→"[^>]") Parameters ---------- line : str kutosoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str kutosoran : dic """ m1 = re.search('(([^(>])([。,、?!:;])([^)]))',line) m2 = re.search('(([^(>])([。,、?!:;]))$',line) while m1 or m2: if m1: okikaemae = m1.group(1) kutomae = m1.group(2) kuto = m1.group(3) kutogo = m1.group(4) elif m2: okikaemae = m2.group(1) kutomae = m2.group(2) kuto = m2.group(3) kutogo = '' #置換後文字列の生成と置換 okikaego = kutomae + suppliedregb + kuto + suppliede + kutogo line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in kutosoran.keys(): kutosoran[okikaemae] =[okikaego] elif okikaego not in kutosoran[okikaemae]: kutosoran[okikaemae].append(okikaego) m1 = re.search('(([^(>])([。,、?!:;])([^)]))',line) m2 = re.search('(([^(>])([。,、?!:;]))$',line) """ #残欠部分のエンコーディングは必ずしも重複とも言えない。  残欠= 句読点= 故に、以下のスクリプト処理は停止する。 regex = compile('((【[^】]+)' + suppliedregb + '([。,、?!:;])' + suppliede + ')') m3 = re.search(regex,line) while m3: okikaemae = m3.group(1) okikaego = m3.group(2) + m3.group(3) line = re.sub(okikaemae,okikaego,line,1) m3 = re.search(regex,line) #置換戻し情報の蓄積 if okikaemae not in sakujosoran.keys(): sakujosoran[okikaemae] =[okikaego] elif okikaego not in sakujosoran[okikaemae]: sakujosoran[okikaemae].append(okikaego) """ return(line,kutosoran) def enjiencoding(line,enjisoran): """ 衍字を検出し、 エンコーディングを行う。 Parameters ---------- line : str enjisoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str enjisoran : dic """ #対象文字列の検出 hit = re.findall('([([^]]+)])', line) for m in range(len(hit)): #文字列の認識 okikaemae = hit[m][0] enji = hit[m][1] #文字列の加工 if len(enji) == 1: okikaego = surplusred + enji + surpluse elif re.search('^.?<[^>]+>$',enji): okikaego = surplusred + enji + surpluse else: sys.exit('Mismatch in Enji-encoding:{}\nenji is {}'.format(okikaemae,enji)) #文字列置換 line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in enjisoran.keys(): enjisoran[okikaemae] =[okikaego] elif okikaego not in enjisoran[okikaemae]: enjisoran[okikaemae].append(okikaego) return(line, enjisoran) def yomikaeencoding(line,yomikaesoran): """ 読み換え("字(字)"等)を検出し、 エンコーディングを行う。 Parameters ---------- line : str yomikaesoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str yomikaesoran : dic """ hit = re.findall('(((?:{[^\-}]+}|.)&?)(([^)]+)))', line) for m in range(len(hit)): #対象文字列の分解 okikaemae = hit[m][0] yomikaemae = hit[m][1] yomikaego = hit[m][2] #文字列の加工 #?の処理 yomikaemae,yomikaego = hatenashori1(yomikaemae,yomikaego) yomikaego = hatenashori2(yomikaego) #&の処理 m3 = re.search('^(((?:{[^\-}]+}|.))&)$',yomikaemae) if m3: yomikaemae = re.sub(m3.group(1),suppliedillegchar(m3.group(2)),yomikaemae) #置換後文字列の生成 m4 = re.search('^(.??)\-(.(?:<[^>]+>)?)$',yomikaego) if len(yomikaego) == 1 or re.search('^[二三四]十(?:<[^>]+>)?$',yomikaego) or re.search('^.(?:<[^>]+>)?$',yomikaego): okikaego = choiceb + origb + yomikaemae + orige + regb + yomikaego +rege + choicee elif m4: okikaego = choiceb + origb + choiceb + sicb + yomikaemae + sice + regb + hatenashori2(m4.group(1)) + rege + choicee + orige + regb + m4.group(2) + rege + choicee else:sys.exit('Mismatch in yomikae-encoding for {}'.format(okikaemae)) #文字列置換 line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in yomikaesoran.keys(): yomikaesoran[okikaemae] =[okikaego] elif okikaego not in yomikaesoran[okikaemae]: yomikaesoran[okikaemae].append(okikaego) return(line,yomikaesoran) def gojiencoding(line,gojisoran): """ 誤字("字 〔字〕 "等)を検出し、 エンコーディングを行う。 Parameters ---------- line : str gojisoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str gojisoran : dic """ hit = re.findall('((.)〔([^〕]+)〕)', line) for m in range(len(hit)): #対象文字列の分解 okikaemae = hit[m][0] goji = hit[m][1] teiseiji = hit[m][2] #文字列の加工 #?の処理 goji,teiseiji = hatenashori1(goji,teiseiji) teiseiji = hatenashori2(teiseiji) #置換後文字列の生成 m4 = re.search('^(.??)\-(.(?:<[^>]+>)?)$',teiseiji) if len(teiseiji) == 1 or re.search('^.(?:<[^>]+>)?$',teiseiji): okikaego = choiceb + sicb + goji + sice + corrb + teiseiji + corre + choicee elif m4: okikaego = choiceb + origb + choiceb + sicb + goji + sice + corrb + hatenashori2(m4.group(1)) + corre + choicee + orige + regb + m4.group(2) + rege + choicee else:sys.exit('Mismatch in goji-encoding for {}'.format(okikaemae)) #文字列置換 line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in gojisoran.keys(): gojisoran[okikaemae] =[okikaego] elif okikaego not in gojisoran[okikaemae]: gojisoran[okikaemae].append(okikaego) return(line,gojisoran) def mishakudokujiencoding1(line,mishakudokujisoran1): """ 未釈読字("□")を検出し、 エンコーディングする Parameters ---------- line : str mishakudokujisoran1 : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str mishakudokujisoran1 : dic """ m = re.search('([^□{](□+)[^□}])', line) while m: #対象文字列の分解 okikaemae = m.group(0) mishakudokuji = m.group(2) #置換後文字列の生成と置き換え gapichiji = re.sub ('0',str(len(mishakudokuji)),gap1) okikaego = re.sub(mishakudokuji,gapichiji,okikaemae) line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in mishakudokujisoran1.keys(): mishakudokujisoran1[okikaemae] =[okikaego] elif okikaego not in mishakudokujisoran1[okikaemae]: mishakudokujisoran1[okikaemae].append(okikaego) m = re.search('([^□{](□+)[^□}])', line) return(line,mishakudokujisoran1) def mishakudokujiencoding2(line,mishakudokujisoran2): """ 未釈読字("□")を検出し、 エンコーディングする Parameters ---------- line : str mishakudokujisoran2 : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str mishakudokujisoran2 : dic """ hit = re.findall('([^…](……)[^…])', line) for m in range(len(hit)): #対象文字列の分解 okikaemae = hit[m][0] mishakudokuji = hit[m][1] #置換後文字列の生成と置き換え okikaego = re.sub(mishakudokuji,gap2,okikaemae) line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in mishakudokujisoran2.keys(): mishakudokujisoran2[okikaemae] =[okikaego] elif okikaego not in mishakudokujisoran2[okikaemae]: mishakudokujisoran2[okikaemae].append(okikaego) return(line,mishakudokujisoran2) def datsujiencoding(line,datsujisoran): """ 脱字("〖字〗")を検出し、 エンコーディングする。 Parameters ---------- line : str datsujisoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str datsujisoran : dic """ hit = re.findall('(〖([^〗]+)〗)', line) for m in range(len(hit)): #対象文字列の分解 okikaemae = hit[m][0] datsuji = hit[m][1] #脱字の文字列には"?"は釈読に対する疑問を現わす場合も、 句読点の疑問符の場合もあるので、 ?の自動的処理は不可能。 #置換後文字列の生成と置き換え okikaego = suppliedomb + datsuji + suppliede line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in datsujisoran.keys(): datsujisoran[okikaemae] =[okikaego] elif okikaego not in datsujisoran[okikaemae]: datsujisoran[okikaemae].append(okikaego) return(line,datsujisoran) def ketsujiencoding(line,ketsujisoran): """ 欠字(" 【字】 "," 【□】 "," 【……】 ")を検出し、 エンコーディングする Parameters ---------- line : str ketsujisoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str datsujisoran : dic """ hit = re.findall('(【([^】]+)】)', line) for m in range(len(hit)): #対象文字列の分解 okikaemae = hit[m][0] ketsuji = hit[m][1] #"□"や"……"は、 以前に処理済みである。 #置換後文字列の生成と置き換え okikaego = supplieddamb + ketsuji + suppliede line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in ketsujisoran.keys(): ketsujisoran[okikaemae] =[okikaego] elif okikaego not in ketsujisoran[okikaemae]: ketsujisoran[okikaemae].append(okikaego) return(line,ketsujisoran) def suppliedcharencoding(line,suppliedcharsoran): """ 文脈によって補釈した文字を検出し、 エンコーディングする。 Parameters ---------- line : str suppliedcharsoran : dic {okikaemae:[okikaego]} 置換情報を蓄積するための辞書 Returns ------- line : str suppliedcharsoran : dic """ hit = re.findall('(([^>])&)', line) for m in range(len(hit)): #対象文字列の分解 okikaemae = hit[m][0] okikaego = suppliedillegchar(hit[m][1]) line = re.sub(okikaemae,okikaego,line,1) #置換情報の蓄積 if okikaemae not in suppliedcharsoran.keys(): suppliedcharsoran[okikaemae] =[okikaego] elif okikaego not in suppliedcharsoran[okikaemae]: suppliedcharsoran[okikaemae].append(okikaego) return(line,suppliedcharsoran) def textencoding(textori): abbrsoran = {} kutosoran = {} # sakujosoran = {} hyotenorisoran = {} enjisoran = {} yomikaesoran = {} gojisoran = {} mishakudokujisoran1 = {} mishakudokujisoran2 = {} datsujisoran = {} ketsujisoran = {} suppliedcharsoran = {} for slipn in textori.keys(): line = textori[slipn] if '﹦' in line: line,abbrsoran = abbrencoding(line,abbrsoran) if '●' in line or '┘' in line: line,hyotenorisoran = hyotenoriencoding(line,hyotenorisoran) line,kutosoran = kutoencoding(line,kutosoran) if '(?)' in line : line = re.sub('(?)',certaintyreading,line) if '[' in line: line, enjisoran = enjiencoding(line,enjisoran) if '(' in line: line, yomikaesoran = yomikaeencoding(line,yomikaesoran) if '〔' in line: line, gojisoran = gojiencoding(line,gojisoran) if '□' in line: line, mishakudokujisoran1 = mishakudokujiencoding1(line,mishakudokujisoran1) if '……' in line: line, mishakudokujisoran2 = mishakudokujiencoding2(line,mishakudokujisoran2) if '〖' in line: line, datsujisoran = datsujiencoding(line,datsujisoran) if '【' in line: line, ketsujisoran = ketsujiencoding(line,ketsujisoran) if '&' in line: line, suppliedcharsoran = suppliedcharencoding(line,suppliedcharsoran) textori[slipn] = line outputdic(abbrsoran,'logfile(EncoderAbbr).txt','置換前','置換後') """#abbrsoran出力ファイルの検証結果: ●置換は概ね正確に行われている。 ●置換が正確に行われていないのは, 他の未定義のエレメントが介在するためである.具体的には "秦﹦(爲秦。爲秦)"は"爲﹦秦﹦(爲秦。爲秦)"の誤認である. 二つの簡に跨るためである.(手動による訂正が必要) "詣(?)﹦(詣,詣)"の"(?)"は, 便宜的に""と表現した. "}﹦({交+于}。{交+于})"などは, 外字未処理のためである。(スクリプト中対応済み) """ outputdic(kutosoran,'logfile(EncoderKuto).txt','置換前','置換後') # outputdic(sakujosoran,'logfile(EncoderKutosakujo).txt','置換前','置換後') outputdic(hyotenorisoran,'logfile(EncoderHyotenori).txt','置換前','置換後') """hyotenorisoran出力ファイルの検証結果: ●置換は概ね正確に行われている。 ●")┘(?,)"や"┘&(、)"は考慮しなかった。文字列加工の下の最初のif-clauseにそれをチェックする"if '?' in hyotengo:"等を加えた。 ●その他に置換が正確に行われていないのは, 他の未定義のエレメントが介在するためである.具体的には "[●]"は誤って"["に変換された。 "●(?)"誤って""に変換された。 "【●(?)"も同上 後二者については、 便宜的対応として if '(' in hyotengo:  に  and hyotengo != '(?)' elif hyotenmae not in '。,、?!:;\t': に  【[ を加えた。 それで、 最後のelse-clauseで標点のエンコーディングのみが行われ、 他に必要な対応はその後のスクリプト処理に委ねられる。 "[●]"は、 最後のesle-clauseに回すと、衍字処理と矛盾する処理がなされるから、 衍字処理を行った。 """ outputdic(enjisoran,'logfile(EncoderEnji).txt','置換前','置換後') outputdic(yomikaesoran,'logfile(EncoderYomikae).txt','置換前','置換後') outputdic(gojisoran, 'logfile(EncoderGoji).txt','置換前','置換後') outputdic(mishakudokujisoran1, 'logfile(EncoderMishakudokuji1).txt','置換前','置換後') outputdic(mishakudokujisoran2, 'logfile(EncoderMishakudokuji2).txt','置換前','置換後') outputdic(datsujisoran, 'logfile(EncoderDatsuji).txt','置換前','置換後') outputdic(ketsujisoran, 'logfile(EncoderKetsuji).txt','置換前','置換後') outputdic(suppliedcharsoran, 'logfile(EncoderSuppliedchar).txt','置換前','置換後') return(textori) if __name__ == "__main__": #global variables abbrb = '' abbre = '' amb = '' ame = '' bokuten = '' certaintyreading = '' choiceb = '' choicee = '' corrb = '' corre = '' eluji = '' exb = '' exe = '' expanb = '' expane = '' gap1 = '' gap2 = '' origb = '' orige = '' regb = '' rege = '' sicb = '' sice = '' supplieddamb = '' suppliedillegb = '' suppliedomb = '' suppliedregb = '' suppliede = '' surplusreg = '' surplusred = '' surpluse = '' Zhubun = '' #データ読み込み textori,titles,kiis = readtext('Igokutojo(Zenjoho).txt') #標題のエンコーディング titles = titleencoding(titles) #本文行のエンコーディング textori = textencoding(textori) divstart,divend = "\n","\n" outputtext('output01.txt',textori,titles,kiis,divstart,divend)