【python】言語処理100本ノック2020を解く(第3章前半)
はじめに
前回の続きで言語処理100本ノック解いていきたいと思います。
今回は第3章の前半です。
それではやっていきましょう
第3章: 正規表現
Wikipediaのページのマークアップ記述に正規表現を適用することで,様々な情報・知識を取り出します.
事前準備
Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある.
- 1行に1記事の情報がJSON形式で格納される
- 各行には記事名が”title”キーに,記事本文が”text”キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出される
- ファイル全体はgzipで圧縮される
以下の処理を行うプログラムを作成せよ.
入力ファイルパスを指定しておきます
file = './input/section3/jawiki-country.json.gz'
20. JSONデータの読み込み
Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.
gzファイルを開くのはgzipモジュールを使用します。
json形式のテキストを読み込むのにjsonモジュールを使用します。
titleキーがイギリスとなっているtextを抜き出します。
import gzip import json with gzip.open(file, 'rt', encoding='utf-8') as f: for rows in f: if json.loads(rows)['title'] == 'イギリス': data = json.loads(rows)['text'] break else: continue print(data)
以下出力です。長いので最初の数行のみ
{{redirect|UK}} {{redirect|英国|春秋時代の諸侯国|英 (春秋)}} {{Otheruses|ヨーロッパの国|長崎県・熊本県の郷土料理|いぎりす}} {{基礎情報 国 |略名 =イギリス |日本語国名 = グレートブリテン及び北アイルランド連合王国 |公式国名 = {{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br /> *{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}([[スコットランド・ゲール語]]) *{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]]) *{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}([[アイルランド語]]) *{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}([[コーンウォール語]]) *{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}([[スコットランド語]]) **{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(アルスター・スコットランド語)</ref>
21. カテゴリ名を含む行を抽出
記事中でカテゴリ名を宣言している行を抽出せよ.
20で出力した文章を見ていると
[ [Category: ~~~ ] ]
みたいな箇所があるのでそれを抜き出すだけですね。
import re pattern = r'\[\[Category:.*?\]\]' res = re.findall(pattern, data) print('\n'.join(res))
[[Category:イギリス|*]] [[Category:イギリス連邦加盟国]] [[Category:英連邦王国|*]] [[Category:G8加盟国]] [[Category:欧州連合加盟国|元]] [[Category:海洋国家]] [[Category:現存する君主国]] [[Category:島国]] [[Category:1801年に成立した国家・領域]]
22. カテゴリ名の抽出
記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.
先ほどの[ [Category: ~~~ ] ]の中の~~~の部分を抜き出します。
正規表現では()で囲むとその場所を抜き出せますね。
[ [Category: ~~~|*** ] ]
みたいなパターンもあるので | 以降は除外しましょう
pattern = r'\[\[Category:(.*?)(?:\|.*?)?\]\]' res = re.findall(pattern, data) print('\n'.join(res))
イギリス イギリス連邦加盟国 英連邦王国 G8加盟国 欧州連合加盟国 海洋国家 現存する君主国 島国 1801年に成立した国家・領域
23. セクション構造
記事中に含まれるセクション名とそのレベル(例えば”== セクション名 ==”なら1)を表示せよ.
=で囲われたものがセクション名っぽいです。
片側の=の数-1がセクションレベルのようなので=の数を数えてレベルとします。
pattern = r'={2,}(.+?)(={2,})' res = re.findall(pattern, data) res = [name + ': ' + str(len(lev) - 1) for name, lev in res] print('\n'.join(res))
国名: 1 歴史: 1 地理: 1 主要都市: 2 気候: 2 政治: 1 元首: 2 法: 2 内政: 2 地方行政区分: 2 外交・軍事: 2 経済: 1 鉱業: 2 農業: 2 貿易: 2 不動産: 2 エネルギー政策: 2 通貨: 2 企業: 2 通信: 3 交通: 1 道路: 2 鉄道: 2 海運: 2 航空: 2 科学技術: 1 国民: 1 言語: 2 宗教: 2 婚姻: 2 移住: 2 教育: 2 医療: 2 文化: 1 食文化: 2 文学: 2 哲学: 2 音楽: 2 ポピュラー音楽: 3 映画: 2 コメディ: 2 国花: 2 世界遺産: 2 祝祭日: 2 スポーツ: 2 サッカー: 3 クリケット: 3 競馬: 3 モータースポーツ: 3 野球: 3 カーリング : 3 自転車競技 : 3 脚注: 1 関連項目: 1 外部リンク: 1
24. ファイル参照の抽出
記事から参照されているメディアファイルをすべて抜き出せ.
メディアファイルは
[ [ ファイル:ファイル名|thumb|説明文 ] ]
のようになっているので、ファイル名のみ抜き出します。
pattern = r'\[\[ファイル:(.+?)\|' result = '\n'.join(re.findall(pattern, data)) print(result)
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 Population density UK 2011 census.png 2019 Greenwich Peninsula & Canary Wharf.jpg Birmingham Skyline from Edgbaston Cricket Ground crop.jpg Leeds CBD at night.jpg Glasgow and the Clyde from the air (geograph 4665720).jpg Palace of Westminster, London - Feb 2007.jpg Scotland Parliament Holyrood.jpg Donald Trump and Theresa May (33998675310) (cropped).jpg Soldiers Trooping the Colour, 16th June 2007.jpg City of London skyline from London City Hall - Oct 2008.jpg Oil platform in the North SeaPros.jpg Eurostar at St Pancras Jan 2008.jpg Heathrow Terminal 5C Iwelumo-1.jpg Airbus A380-841 G-XLEB British Airways (10424102995).jpg UKpop.svg Anglospeak.svg Royal Aberdeen Children's Hospital.jpg CHANDOS3.jpg The Fabs.JPG Wembley Stadium, illuminated.jpg