#author("2024-11-25T16:35:13+09:00","default:ogiwiki","ogiwiki") #author("2024-11-26T14:31:01+09:00","default:ogiwiki","ogiwiki") [[総研大2024/言語資源学演習1]] **準備 [#p5cef34f] -Pythonのインストール sudo apt install python3 -pip :Pythonのパッケージ管理ツール sudo apt install pip **青空文庫テキストを正規表現を使って整形する [#s0b635f0] -サンプルデータのダウンロード --夏目漱石「こころ」https://www.aozora.gr.jp/cards/000148/card773.html --テキストデータ https://www.aozora.gr.jp/cards/000148/files/773_ruby_5968.zip 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 -[[青空文庫形式>https://www.aozora.gr.jp/aozora-manual/index-input.html?utm_source=chatgpt.com#markup]] -chatGPTに聞いてみる --https://chatgpt.com/share/6743f4eb-a7f8-800f-80ff-cca25fdbd130 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) -実行してみる python3 clean_aozora.py kokoro.txt kokoro_c.txt -問題点を修正させる --最初の注記説明を取る --ふりがなを削除する -UniDic+MeCabで形態素解析してみる mecab -d ~/unidic-cwj/ -Ochamame kokoro_c.txt |code - -他の青空文庫のファイルも整形してみる --芥川龍之介「トロッコ」https://www.aozora.gr.jp/cards/000879/card43016.html --テキストデータ https://www.aozora.gr.jp/cards/000879/files/43016_ruby_16663.zip 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ファイルをライブラリを使って整形する [#i5eee962] -lxml :XMLパーザ(parser)(XMLの構造を解釈してプログラムから利用しやすいようにする) // pip install lxml sudo apt install python3-lxml -Beautiful Soup :HTMLやXMLファイルからデータを抽出・解析する // pip install beautifulsoup4 sudo apt install python3-bs4 //--mecabをpythonから使うモジュール // pip install mecab