言語処理100本ノック2020解いてみた③ 前編

 正規表現は便利だけど難しい!!ということで3章です。NLP100の記事がじわじわアクセスが伸びていてプレッシャーがすごいです…。

20. JSONデータの読み込み

解法
今後の応用を考えてpandasでjsonを読み込んで表示します。

import pandas as pd

df = pd.read_json("data/jawiki-country.json", lines=True)
print(df[df.title=="イギリス"].text.values[0])

21. カテゴリ名を含む行を抽出

解法
正規表現のfindallで"[[Category:●●]]"を探して表示します。

import pandas as pd
import re
df = pd.read_json("data/jawiki-country.json", lines=True)
text = df[df.title=="イギリス"].text.values[0]
for category in re.findall(r"\[\[Category:.*?\]\]",text):
	print(category)

出力

[[Category:イギリス|*]]
[[Category:イギリス連邦加盟国]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国|元]]
[[Category:海洋国家]]
[[Category:現存する君主国]]
[[Category:島国]]
[[Category:1801年に成立した国家・領域]]

22. カテゴリ名の抽出

解法
タイトル部分を(.*)で貪欲マッチします。「|」があったりなかったりで悩んだので、インターネット先人の知恵を借りまくりました。

import pandas as pd
import re
df = pd.read_json("data/jawiki-country.json", lines=True)
text = df[df.title=="イギリス"].text.values[0]
for category in re.findall(r"\[\[Category:(.*?)(?:\|.*)?\]\]",text):
	print(category)

出力

イギリス
イギリス連邦加盟国
英連邦王国
G8加盟国
欧州連合加盟国
海洋国家
現存する君主国
島国
1801年に成立した国家・領域

23. セクション構造

解法
=が2個以上ある区間に挟まれている場所を探します。その後=の長さをカウントすれば良いですね。

import pandas as pd
import re
df = pd.read_json("data/jawiki-country.json", lines=True)
text = df[df.title=="イギリス"].text.values[0]
for sec in re.findall(r"(==+)([^= ]+)(==+)", text)]:
	print((sec[1],len(sec[0])-1))

出力

('国名', 1)
('歴史', 1)
('地理', 1)
('主要都市', 2)
('気候', 2)
略

24. ファイル参照の抽出

解法
"[[ファイル:●●]]"を抽出します。22と同じで、|より前の部分だけ抽出します。

import pandas as pd
import re
df = pd.read_json("data/jawiki-country.json", lines=True)
text = df[df.title=="イギリス"].text.values[0]
for media in re.findall(r'\[\[ファイル:([^]|]+?)(\|.*?)+\]\]', text):
	print(media[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
略

感想

 正規表現苦手なので結構苦労しました。でも自然文やなんらかのルールで構造化されている文章を扱うときには必須になるんだなあ。

 長いので残りは後編にします!!

創作活動及び成果の発信などの形でみなさんにお返しできたらと思います。