青空文庫からPythonで本文を取得したい(分かち書き)
青空文庫からPythonで本文を取得し、分かち書きに変換するコードです。分かち書きに変更した文章は「wakati_text.txt」として保存されます。
別記事「青空文庫からPythonで本文を取得したい」をベースとして作成しています。こちらの記事も合わせて確認してください。
青空文庫URL:https://www.aozora.gr.jp/
サンプルとして青空文庫の三国志をダウンロードしてみます。
※使用する際には青空文庫の利用規約に基づき使用してください。
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
from janome.tokenizer import Tokenizer import re import zipfile import urllib.request import os.path,glob #ダウンロードしたいURLを入力する URL = 'https://www.aozora.gr.jp/cards/001562/files/52410_ruby_51060.zip' #分かち書き作成ファイル WAKATI = 'wakachi_text.txt' def main(): download_text = download(URL) text = convert(download_text) #分かち書き作成 write_wakachi_text(word_analyze(text)) def write_wakachi_text(results): write_file = WAKATI with open(write_file, 'w', encoding='utf-8') as fp: fp.write("\n".join(results)) def word_analyze(text): t = Tokenizer() results = [] lines = text.split("\r\n") for line in lines: tokens = t.tokenize(line) r = [] for token in tokens: w = token.surface ps = token.part_of_speech hinshi = ps.split(',')[0] r.append(w) rl = (" ".join(r)).strip() print(rl) results.append(rl) return results def convert(download_text): binarydata = open(download_text, 'rb').read() text = binarydata.decode('shift_jis') # ルビ、注釈などの除去 text = re.split(r'\-{5,}', text)[2] text = re.split(r'底本:', text)[0] text = re.sub(r'《.+?》', '', text) text = re.sub(r'[#.+?]', '', text) text = text.strip() return text def download(url): # データファイルをダウンロードする zip_file = re.split(r'/', url)[-1] if not os.path.exists(zip_file): print('Download URL') print('URL:',url) urllib.request.urlretrieve(url, zip_file) else: print('Download File exists') # フォルダの生成 dir, ext = os.path.splitext(zip_file) if not os.path.exists(dir): os.makedirs(dir) # zipファイルの展開 zip_obj = zipfile.ZipFile(zip_file, 'r') zip_obj.extractall(dir) zip_obj.close() # zipファイルの削除 os.remove(zip_file) # テキストファイルの抽出 path = os.path.join(dir,'*.txt') list = glob.glob(path) return list[0] if __name__ == "__main__": main() |