総研大2024/言語資源学演習1
- Pythonのインストール
sudo apt install python3
- pip :Pythonのパッケージ管理ツール
sudo apt install pip
青空文庫テキストを正規表現を使って整形する†
wget https://www.aozora.gr.jp/cards/000148/files/773_ruby_5968.zip
unzip 773_ruby_5968.zip
nkf -w kokoro.txt |less
nkf -w --overwrite kokoro.txt
import re # 正規表現を使うためのモジュール
import argparse # コマンドライン引数を扱うためのモジュール
# ファイルを読み込む関数
def read_aozora_file(file_path):
"""
青空文庫形式のテキストファイルを読み込む関数。
:param file_path: 読み込むファイルのパス
:return: ファイルの内容を1行ずつリストにして返す
"""
with open(file_path, 'r', encoding='utf-8') as file:
lines = file.readlines() # ファイルの各行をリストとして取得
return lines
# ヘッダーとフッターを削除する関数
def remove_metadata(lines):
"""
青空文庫形式のテキストの中からヘッダーとフッター部分を削除する。
:param lines: テキストデータ(リスト形式)
:return: ヘッダーとフッターを除去したテキストデータ
"""
start = 0 # 本文が始まる行のインデックス
end = len(lines) # 本文が終わる行のインデックス(初期値は最後まで)
# ヘッダーの終了を示す「-------」を探す
for i, line in enumerate(lines):
if line.startswith('-------'):
start = i + 1 # ヘッダー終了後の行から本文が始まる
break
# フッターの開始を示す「底本:」を探す
for i, line in reversed(list(enumerate(lines))): # リストを逆順に走査
if line.startswith('底本:'):
end = i # フッターの手前で本文が終わる
break
# 本文の部分だけを切り出して返す
return lines[start:end]
# ルビや注釈を削除する関数
def clean_annotations(lines):
"""
青空文庫形式のテキストからルビや注釈を削除して整形する。
:param lines: 整形前のテキストデータ(リスト形式)
:return: 整形後のテキストデータ
"""
cleaned_lines = [] # 整形後の各行を格納するリスト
for line in lines:
# ルビ(例:|小説《しょうせつ》)を削除
line = re.sub(r'|.*?《.*?》', '', line)
# 外字(例:※[#「言+青」、第3水準1-2-3])を削除
line = re.sub(r'※[#.*?]', '', line)
# 傍点(例:[#傍点]強調[#傍点終わり])を削除
line = re.sub(r'[#.*?]', '', line)
# 整形した行をリストに追加
cleaned_lines.append(line)
return cleaned_lines
# 整形したテキストをファイルに保存する関数
def save_cleaned_text(cleaned_lines, output_file):
"""
整形後のテキストを新しいファイルに保存する。
:param cleaned_lines: 整形後のテキストデータ(リスト形式)
:param output_file: 保存するファイルのパス
"""
with open(output_file, 'w', encoding='utf-8') as file:
file.writelines(cleaned_lines) # 各行をファイルに書き込む
# プログラム全体を動かすメイン関数
def main(input_file, output_file):
"""
青空文庫形式のテキストファイルを整形するメインの処理。
:param input_file: 整形前のファイルのパス
:param output_file: 整形後のファイルのパス
"""
lines = read_aozora_file(input_file) # ファイルを読み込む
lines = remove_metadata(lines) # ヘッダーとフッターを削除
lines = clean_annotations(lines) # ルビや注釈を削除
save_cleaned_text(lines, output_file) # 整形後のテキストを保存
# プログラムのエントリーポイント
if __name__ == "__main__":
# コマンドライン引数を処理するための準備
parser = argparse.ArgumentParser(description="青空文庫形式のテキストを整形するプログラム")
parser.add_argument("input_file", help="入力ファイルのパス(青空文庫形式のテキストファイル)")
parser.add_argument("output_file", help="出力ファイルのパス(整形後のテキストファイル)")
# 引数を解析
args = parser.parse_args()
# メイン関数を実行
main(args.input_file, args.output_file)
wget https://www.aozora.gr.jp/cards/000879/files/43016_ruby_16663.zip
unzip 43016_ruby_16663.zip
nkf -w --overwrite torokko.txt
python3 clean_aozora.py torokko.txt torokko_c.txt