TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

▲心くじけず言語処理100本ノック==25~28==※5/27に29追加

f:id:TBT_matsu:20200515145048p:plain
こんにちは!
テービーテックの村松です。

「言語処理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に追加しました!