正規表現(NLP100本ノック2020)
執筆年月日:2024/10/31~
経緯
B3勉強会で言語処理100本ノックを題材として学習したが、ただやっただけではすぐに忘れてしまうため
自分の中で曖昧に獲得した知識を自分のものにするため
扱うデータセット
Wikipedia イギリス
以下、問題別で意識したこと、解けるようになったカギを記しておく。
問 20
やること: JSONデータをロードして、タイトルがイギリスのものだけ取り出す
with openでファイルを展開して中身を見てみると改行文字(\n)が大量に存在する文字列を確認できる
1行ずつreadlinesしてリストに格納していく
for文でリストを見ていく。
ここでリストの各要素は記事
タイトルがイギリスのものを抽出する
見つかったらbreakでfor文を抜ける
問 21
やること: カテゴリだけ抽出
カテゴリは[Category:~]と書いてあるもの
「[[]](大括弧)」にはエスケープシーケンス(\)をつける
~の部分は何か文字が入っていればいいので、~には「.*?」が入る
「~」の部分:何文字か文字が入って最小一致(0文字も可)
table:ここで使用する正規表現
. 何か文字
* 0回以上繰り返し
? 最小マッチ(できるだけ短いところで一致しているもの)
問 22
やること: カテゴリの名前だけを抽出する
特定の部分だけを抽出したいときは()を使う
問 21の~の部分にはパターン「(.*?)(?:\|.*?|)」が入る
基本的に[[Category ~]]で囲まれたところ
Category: ~|~のような形になっている場合、最初の~だけ抽出したい
(~)で抽出する箇所を指定、(?: ~|~)でその後に何が続くのかを指定
どちらも()で書かれるため紛らわしいが、後の方の()は抽出する箇所というよりかはCategoryと同じイメージ
table:ここで使用する正規表現
() そこが抽出される
(?: A|B) AかBのパターン(抽出されるわけではない)
問 23
やること: セクションの部分を抽出する
ここでいうセクションは==~==のこと
=の数によってレベルが異なる
出力は{セクション名: そのセクションのレベル}の辞書
=の数は分からないためここまでの解き方では解けない
=が2~4回あって、その間に何か文字があるものを検出する
パターン:(={2,4}.*?={2,4})
table:ここで使用する正規表現
{min, max} min以上max以下の繰り返し
問 24
やること: 記事に入っているメディアファイルを抽出する
メディアファイル:ビデオファイル、画像、オーディオ等
メディアファイルは[[ファイル: 「ファイル名」| 「何かメタ情報」というフォーマット
パターン:\[\[ファイル:(.*?)\|
ここまで扱った解法で解ける
(ここまで来ると何が正解なのかが分からなくなってくるため、正解かどうかも分からない)
--- 以降は適宜追加する ---