TPTブログ

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

▲心くじけず言語処理100本ノック==20~24==

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

「言語処理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| 参照方法 = 20118月\n| 独自研究 = 201210月\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でした!