# -*- 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)