こんにちは!
テービーテックの村松です。
「言語処理100本ノック2020]」
nlp100.github.io
に挑戦中!
途中でくじけないか見守ってください・・・。
そして、皆さんも一緒に挑戦してみましょう!
本日は第第3章: 正規表現 20~24です!
間違い・コード改善点などありましたら教えていただけると嬉しいです。
第3章: 正規表現
「Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzに以下の処理を行うプログラムを作成せよ」
ここからはjawiki-country.json.gzを使用して問題に取り組んでいきます。
仕様は以下の通りです。
・1行に1記事の情報がJSON形式で格納されます。
・各行には記事名が”title”キーに,記事本文が”text”キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出されます。
・ファイル全体はgzipで圧縮されています。
20.JSONデータの読み込み
「Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.」
import pandas as pd #JSONファイルの読み込みread_json() wiki_data = pd.read_json('jawiki-country.json.gz', lines=True) print(wiki_data) ##結果(ファイルの中身) title text 0 エジプト {{otheruses|主に現代のエジプト・アラブ共和国|古代|古代エジプト}}\n{{基礎... 1 オーストリア {{基礎情報 国\n|略名 = オーストリア\n|日本語国名 = オーストリア共和国\n|公... 2 インドネシア {{基礎情報 国\n| 略名 =インドネシア\n| 日本語国名 =インドネシア共和国\n| ... 3 イラク {{複数の問題\n| 参照方法 = 2011年8月\n| 独自研究 = 2012年10月\n... ・・・以下略
#イギリスに関する記事本文を表示します。query()で条件を指定。 united_kingdom = wiki_data.query('title=="イギリス"')['text'].values[0] print(united_kingdom) ##結果 {{redirect|UK}} {{redirect|英国|春秋時代の諸侯国|英 (春秋)}} {{Otheruses|ヨーロッパの国|長崎県・熊本県の郷土料理|いぎりす}} {{基礎情報 国 |略名 =イギリス |日本語国名 = グレートブリテン及び北アイルランド連合王国 |公式国名 = {{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br /> ・・・以下略
以降の問題には今作った「united_kingdom」に色々手を加えていきます。
21.カテゴリ名を含む行を抽出
「記事中でカテゴリ名を宣言している行を抽出せよ.」
#united_kingdomを行で区切ります。split('\n') n_list = united_kingdom.split('\n') #'Category:'を含む行を抽出します。 category_list = [i for i in n_list if 'Category:' in i] category_list ##結果 ['{{Sisterlinks|commons=United Kingdom|commonscat=United Kingdom|s=Category:イギリス|n=Category:イギリス|voy=United Kingdom}}', '[[Category:イギリス|*]]', '[[Category:イギリス連邦加盟国]]', '[[Category:英連邦王国|*]]', '[[Category:G8加盟国]]', '[[Category:欧州連合加盟国|元]]', '[[Category:海洋国家]]', '[[Category:現存する君主国]]', '[[Category:島国]]', '[[Category:1801年に成立した国家・領域]]']
22.カテゴリ名の抽出
「記事のカテゴリ名を(行単位ではなく名前で)抽出せよ」
#21で作成したcategory_listを使用します。 #余分なところをreplace()で置換します。 ans = [a.replace('[[Category:', '').replace('|*', '').replace(']]', '') for a in category_list] ans ##結果 ['{{Sisterlinks|commons=United Kingdom|commonscat=United Kingdom|s=Category:イギリス|n=Category:イギリス|voy=United Kingdom}}', 'イギリス', 'イギリス連邦加盟国', '英連邦王国', 'G8加盟国', '欧州連合加盟国|元', '海洋国家', '現存する君主国', '島国', '1801年に成立した国家・領域']
23.セクション構造
「記事中に含まれるセクション名とそのレベル(例えば”== セクション名 ==”なら1)を表示せよ.」
#21で作成したn_listを使用します。 import re for i in n_list: #正規表現r'^=+.+=+$'に該当する行をre.findall((正規表現, 対象オブジェクト)で抽出します。 match = re.findall(r'^=+.+=+$', i) if not match: pass else: #レベルを数えてセクション名と一緒に表示する level = i.count('=') // 2 - 1 print('レベル:' + str(level), ', セクション名:' + i.replace('=', '')) ##結果 レベル:1 , セクション名:国名 レベル:1 , セクション名:歴史 レベル:1 , セクション名:地理 レベル:2 , セクション名:主要都市 レベル:2 , セクション名:気候 レベル:1 , セクション名:政治 ・・・以下略
24.ファイル参照の抽出
「記事から参照されているメディアファイルをすべて抜き出せ.」
#ファイル名を含む行を抽出して該当箇所のみを表示します。 file_n = [] for i in n_list: match = re.findall(r'File|ファイル:(.+?)\|', i) if not match: pass else: print(match[0]) ##結果 Royal Coat of Arms of the United Kingdom.svg Descriptio Prime Tabulae Europae.jpg Lenepveu, Jeanne d'Arc au siège d'Orléans.jpg London.bankofengland.arp.jpg Battle of Waterloo 1815.PNG Uk topo en.jpg BenNevis2005.jpg ・・・以下略
ここまでご覧いただきありがとうございます。
以上、第3章20~24でした!