自然言語処理100本ノック第3章を解く(前編)

  • 自然言語処理100本ノック2020の第3章をやる。前編なので20から24まで。
  • 今回は正規表現の回。
  • 正規表現は便利なので簡単なのものはよく書くけれど、やっぱり難しい。プログラム合成で正規表現を合成してほしい。

実施した内容

20

  • コード
import json

with open('jawiki-country.json', mode='r', encoding='utf-8') as f:
    for i in f:
        article = json.loads(i)
        if 'イギリス' == article['title']:
            print(article['text'])
  • openした後にcloseするのをよく忘れる人はwithを使うようにって大学のときに聞いた気がする。

  • これは以後の課題でも使うので、以下のようにモジュールにしておく。

ch3_func.py

import json

def extract_uk_text():
    with open('jawiki-country.json', mode='r', encoding='utf-8') as f:
        for i in f:
            article = json.loads(i)
            if 'イギリス' == article['title']:
                return article['text']

21

  • コード
from modules import ch3_func

import re

text = ch3_func.extract_uk_text()
pattern = '\[\[Category:.*?\]\]'
results = re.findall(pattern,text)

for i in results:
  print(i)
  • 出力
[[Category:イギリス|*]]
[[Category:イギリス連邦加盟国]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国|]]
[[Category:海洋国家]]
[[Category:現存する君主国]]
[[Category:島国]]
[[Category:1801年に成立した国家・領域]]
  • 正規表現登場。
  • findallは便利だ。

22

  • コード
from modules import ch3_func

import re

text = ch3_func.extract_uk_text()
pattern = '\[\[Category:(.*?)(?:\|.*)?\]\]'
results = re.findall(pattern,text)

for i in results:
  print(i)
  • 出力
イギリス
イギリス連邦加盟国
英連邦王国
G8加盟国
欧州連合加盟国
海洋国家
現存する君主国
島国
1801年に成立した国家・領域
  • ‘|*‘みたいなのが付いているのを正規表現の’?:‘で外した。

23

  • コード
from modules import ch3_func

import re

text = ch3_func.extract_uk_text()
pattern = '(==+)(.*?)==+'
results = re.findall(pattern, text)

for i in results:
    level = i[0].count('=') - 1
    section_name = i[1]
    print('%d: %s' % (level, section_name))

24

  • コード
from modules import ch3_func

import re

text = ch3_func.extract_uk_text()
pattern = '\[\[ファイル:(.*?)(?:\|.*)?\]\]'
results = re.findall(pattern,text)

for i in results:
  print(i)
  • 22とやってることは同じ

感想

  • 正規表現は正直難しい。今のところはそこまで複雑じゃないが、複雑になればなるほど人間には解読不能になると思っている…

  • まだ『詳説 正規表現』を読んだことがないので、これを機会に読みたいと思う。

  • もっと良いやり方があったらコメントで教えてください。


comments powered by Disqus