総研大2024/言語資源学演習1

準備

青空文庫テキストを正規表現を使って整形する

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

青空文庫XHTMLファイルをライブラリを使って整形する


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS