2018年03月21日

言語処理100本ノックでPython入門 #28 - いろいろな正規表現

  

今日は、言語処理100本ノック 2015の問題28です。

■ 問題

問題20で作成したファイルを入力として、以下の問題を解きます。
28. MediaWikiマークアップの除去 27の処理に加えて,テンプレートの値からMediaWikiマークアップを可能な限り除去し,国の基本情報を整形せよ.

■ Pythonのコード
import re

def readArticle(filename):
    with open(filename, 'r', encoding='utf8') as fin:
        return fin.read()

def getBasicInfo(article):
    basicInfo = re.search(r'\{\{基礎情報(.+?)\}\}\n', article, re.DOTALL).group(1)
    pat = r'^\|(.+?)\s*=\s*(.+?)(?<!<br/>)\n'
    reg = re.compile(pat, re.MULTILINE | re.DOTALL)
    wdict = {}
    for k, v in reg.findall(basicInfo):
        v = re.sub(r"''('|''')([^']+?)''+", r"\2", v)
        v = re.sub(r"\[\[(?:[^\]]+\|)?([^:]+?)\]\]", r"\1", v)
        v = re.sub(r"\[http(?:[^\]]+? )?(.+?)\]", r"\1", v)
        v = re.sub(r"#REDIRECT \[\[([^\[]+?)\]\]", r"\1", v)
        v = re.sub(r"^===*\s*(.+)\s*=", r"\1", v)
        v = re.sub(r"^(?:\*|#|;)+\s*([^\n]+?)$", r"\1", v, flags=re.MULTILINE)
        v = re.sub(r"{{(?:[^\{]+\|)?([^\|]+?)}}", r"\1", v)
        v = re.sub(r"<[^>]+>", r" ", v)
        wdict[k] = v

    return wdict


def main():
    # england-article.txtは、問題20(nlp20.py)で作成したファイル
    article = readArticle('england-article.txt')    
    dic = getBasicInfo(article)
    dic = sorted(dic.items(), key=lambda x: x[0])
    for item, v in dic:
        print(item, ':', v)

if __name__ == '__main__':
    main()


■ コードについて一言

「可能な限り除去し」ということで、わかる範囲で除去してみました。これまでの、正規表現の総復習みたいなコードですね。かなり力業的なコードです。 ひとつ一つの説明は省きますが、一つだけ、flags=re.MULTILINEを付けているものがあります。これは、記事の中にある箇条書きに対応するためです。
 v = re.sub(r"^(?:\*|#|;)+\s*([^\n]+?)$", r"\1", v, flags=re.MULTILINE)
compileしないで、 MULTILINEオプションを指定しています。


■ 結果
GDP/人 : 36,727 
GDP値 : 2兆3162億 
GDP値MER : 2兆4337億 
GDP値元 : 1兆5478億 IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom 
GDP統計年 : 2012
GDP統計年MER : 2012
GDP統計年元 : 2012
GDP順位 : 6
GDP順位MER : 5
ISO 3166-1 : GB / GBR
ccTLD : .uk / .gb 使用は.ukに比べ圧倒的少数。 
人口値 : 63,181,775 United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population 
人口大きさ : 1 E7
人口密度値 : 246
人口統計年 : 2011
人口順位 : 22
位置画像 : Location_UK_EU_Europe_001.svg
元首等氏名 : エリザベス2世
元首等肩書 : 女王
公式国名 : United Kingdom of Great Britain and Northern Ireland 英語以外での正式国名: 
An Rioghachd Aonaichte na Breatainn Mhor agus Eirinn mu Thuath(スコットランド・ゲール語) 
Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon(ウェールズ語) 
Riocht Aontaithe na Breataine Moire agus Tuaisceart na hEireann(アイルランド語) 
An Rywvaneth Unys a Vreten Veur hag Iwerdhon Gledh(コーンウォール語) 
Unitit Kinrick o Great Breetain an Northren Ireland(スコットランド語) 
Claught Kangrick o Docht Bratain an Norlin Airlann、Unitet Kangdom o Great Brittain an Norlin Airlann(アルスター・スコットランド語) 
公用語 : 英語(事実上)
国旗画像 : Flag of the United Kingdom.svg
国歌 : 神よ女王陛下を守り給え
国章リンク : (国章)
国章画像 : イギリスの国章
国際電話番号 : 44
夏時間 : +1
建国形態 : 建国
日本語国名 : グレートブリテン及び北アイルランド連合王国
時間帯 : ±0
最大都市 : ロンドン
標語 : Dieu et mon droit (フランス語:神と私の権利)
水面積率 : 1.3%
注記 :  
略名 : イギリス
確立年月日1 : 927年/843年
確立年月日2 : 1707年
確立年月日3 : 1801年
確立年月日4 : 1927年
確立形態1 : イングランド王国/スコットランド王国 (両国とも1707年連合法まで)
確立形態2 : グレートブリテン王国建国 (1707年連合法)
確立形態3 : グレートブリテン及びアイルランド連合王国建国 (1800年連合法)
確立形態4 : 現在の国号「グレートブリテン及び北アイルランド連合王国」に変更
通貨 : UKポンド (&pound;)
通貨コード : GBP
面積値 : 244,820
面積大きさ : 1 E11
面積順位 : 76
首相等氏名 : デーヴィッド・キャメロン
首相等肩書 : 首相
首都 : ロンドン