👩‍💻

言語処理100本ノック 2020 (Rev 2) 第3章: 正規表現 27. 内部リンクの除去

2023/01/10に公開約1,800字

問題

27. 内部リンクの除去

26の処理に加えて,テンプレートの値からMediaWikiの内部リンクマークアップを除去し,テキストに変換せよ(参考: [1]マークアップ早見表).

solution27.py
import pandas as pd
import re

df_j = pd.read_json('chapter03/jawiki-country.json.gz', lines=True, compression='infer')
text_uk = df_j.query('title=="イギリス"')['text'].values[0]

template_text = re.findall(r'\{\{基礎情報 (.+?^}\})', text_uk, re.MULTILINE+re.DOTALL)[0]

template_text = re.sub("'{2,5}","", template_text)
template_text = re.sub("\[\[(?:.[^|]+?\|)??(([^|]+?)|(\{\{.+?\}\}))\]\]", r"\1", template_text)

template = dict(re.findall("\|(.+?) *= *(.+?)\n(?=\||})", template_text, re.MULTILINE+re.DOTALL))

for t in template:
    print(t, template[t])
output
略名 イギリス
日本語国名 グレートブリテン及び北アイルランド連合王国
公式国名 {{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}}(ウェールズ語)
#以下に続きます

この問題では、正規表現を用いて内部リンクマークアップを除去しテキストに変換します。この正規表現では、[[ ]] で文字列を囲むことで、 [[」と「]] で囲まれた文字列を取り出すことができます。 (?:.+?|)?? で、 | を含む任意の文字列が 0 個以上続いていることを表す非貪欲マッチの ? で囲まれた . を使用することで、 | よりも後ろの文字列を取り出すことができます。

元首等肩書 [[イギリスの君主|女王]]
元首等氏名 [[エリザベス2世]]
首相等肩書 [[イギリスの首相|首相]]
首相等氏名 [[ボリス・ジョンソン]]
他元首等肩書1 [[貴族院 (イギリス)|貴族院議長]]

元首等肩書 女王
元首等氏名 エリザベス2世
首相等肩書 首相
首相等氏名 ボリス・ジョンソン
他元首等肩書1 貴族院議長

https://github.com/kurokawa5/nlp100_2020/blob/main/chapter03/solution27.py

参考記事

第3章: 正規表現
re --- 正規表現操作
Python正規表現
regex101
Pythonで文字列を置換(replace, translate, re.sub, re.subn)

脚注
  1. マークアップ早見表 ↩︎

Discussion

ログインするとコメントできます