こんにちは!
テービーテックの村松です。
「言語処理100本ノック2020]」
nlp100.github.io
に挑戦中!
途中でくじけないか見守ってください・・・。
そして、皆さんも一緒に挑戦してみましょう!
本日は第第3章: 正規表現 25~28です!
(※5/27に29を追加しました)
間違い・コード改善点などありましたら教えていただけると嬉しいです。
第3章: 正規表現
「Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzに以下の処理を行うプログラムを作成せよ」
ここからはjawiki-country.json.gzを使用して問題に取り組んでいきます。
仕様は以下の通りです。
・1行に1記事の情報がJSON形式で格納されます。
・各行には記事名が”title”キーに,記事本文が”text”キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出されます。
・ファイル全体はgzipで圧縮されています。
使用データ
以下のデータをベースに進めていきます。
※3章01でやったデータの読み込みと同じ。
#JSONファイルの読み込みread_json() wiki_data = pd.read_json('/content/drive/My Drive/ブログ/言語処理100本ノック/jawiki-country.json.gz', lines=True) united_kingdom = wiki_data[wiki_data['title']=='イギリス'].text.values n_list = united_kingdom[0].split('\n') n_list
##結果 ['{{redirect|UK}}', '{{redirect|英国|春秋時代の諸侯国|英 (春秋)}}', '{{Otheruses|ヨーロッパの国|長崎県・熊本県の郷土料理|いぎりす}}', '{{基礎情報 国', '|略名 =イギリス', '|日本語国名 = グレートブリテン及び北アイルランド連合王国', ・・・以下略
25.テンプレートの抽出
「記事中に含まれる「基礎情報」テンプレートのフィールド名と値を抽出し,辞書オブジェクトとして格納せよ.」
#抽出条件 pattern = re.compile(r'\|(.+?)\s*=\s*(.+)') #空の辞書の用意 d = {} for i in n_list: #「基本情報」のテンプレート適合 a = re.search(pattern, i) if a: #辞書に追加 d[キー]=値 d[a[1]]=a[2] if i == '}}': break d ##結果 {'GDP/人': '36,727<ref name="imf-statistics-gdp" />', 'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />', 'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />', 'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a=IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>', 'GDP統計年': '2012', ・・・以下略
26.強調マークアップの除去
「25の処理時に,テンプレートの値からMediaWikiの強調マークアップ(弱い強調,強調,強い強調のすべて)を除去してテキストに変換せよ」
#条件:「基本情報」のテンプレート pattern = re.compile(r'\|(.+?)\s*=\s*(.+)') #条件:強調マークアップ emphasis = re.compile(r'\'{2,5}') #空の辞書の用意 d = {} for i in n_list: #強調マークアップの除去 _a = re.sub(emphasis, '', i) #「基本情報」のテンプレート適合 a = re.search(pattern, _a) if a: #辞書に追加 d[キー]=値 d[a[1]]=a[2] if i == '}}': break
##変化例 (元)'確立形態4': "現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更", ↓ (今)'確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更',
27.内部リンクの除去
「26の処理に加えて,テンプレートの値からMediaWikiの内部リンクマークアップを除去し,テキストに変換せよ」
#条件:「基本情報」のテンプレート pattern = re.compile(r'\|(.+?)\s*=\s*(.+)') #条件:強調マークアップ emphasis = re.compile(r'\'{2,5}') #条件:内供リンク links = re.compile(r'\[\[(.+?)\]\]') #空の辞書の用意 d = {} for i in n_list: #強調マークアップの除去 _a = re.sub(emphasis, '', i) #内部リンクの削除 _a = re.sub(links, '\\1', _a) #「基本情報」のテンプレート適合 a = re.search(pattern, _a) if a: #辞書に追加 d[キー]=値 d[a[1]]=a[2] if i == '}}': break
##変化例 (元) '公用語': '[[英語]]', ↓ (今) '公用語': '英語',
28.MediaWikiマークアップの除去
「27の処理に加えて,テンプレートの値からMediaWikiマークアップを可能な限り除去し,国の基本情報を整形せよ.」
#条件:「基本情報」のテンプレート pattern = re.compile(r'\|(.+?)\s*=\s*(.+)') #条件:強調マークアップ emphasis = re.compile(r'\'{2,5}') #条件:内供リンク links = re.compile(r'\[\[(.+?)\]\]') #条件:MediaWikiマークアップ m_pattern_1 = re.compile(r'\{\{(.+\||)(.+?)\}\}') # {{○○|××}} m_pattern_2 = re.compile(r'\<(.+?)\>') # <> #空の辞書の用意 d = {} for i in n_list: #強調マークアップの除去 _a = re.sub(emphasis, '', i) #内部リンクの削除 _a = re.sub(links, '\\1', _a) #マークアップをできるだけ削除 _a = re.sub(m_pattern_1, '', _a) _a = re.sub(m_pattern_2, '', _a) #「基本情報」のテンプレート適合 a = re.search(pattern, _a) if a: #辞書に追加 d[キー]=値 d[a[1]]=a[2] if i == '}}': break
##変化例 (元){'GDP/人': '36,727<ref name="imf-statistics-gdp" />', ↓ (今)'GDP/人': '36,727',
29.国旗画像のURLを取得する
「テンプレートの内容を利用し,国旗画像のURLを取得せよ.」
import requests #28の辞書から国旗画像の項目を使用してファイル名を取得 url_file = d['国旗画像'].replace(' ', '_') S = requests.Session() #エンドポイント URL = "https://commons.wikimedia.org/w/api.php" #パラメータの設定 PARAMS = { "action": "query", "format": "json", "titles": "File:" + url_file, "prop": "imageinfo", "iiprop":"url" } R = S.get(url=URL, params=PARAMS) #レスポンス内容をJSONで取得 data = R.json() #画像のURL img_url = data['query']['pages']['347935']['imageinfo'][0]['url'] print(img_url) ##結果 https://upload.wikimedia.org/wikipedia/commons/a/ae/Flag_of_the_United_Kingdom.svg
公式のサンプルコードを参考にやってみました。
ここまでご覧いただきありがとうございます。
以上、第3章25~28でした!
さて、第3章は29までなのですが・・・
ちょっとお待ちくださいませ・・・!
ちょっと理解に時間がかかっていてお勉強中です!
※5/27に追加しました!