言語処理100本ノック(第3章前半)



スポンサードリンク

第2章後半の続きです。どうやらここからが本番のようです。正規表現という初めて触れるので他の方のサイトを参考にしながらゆっくりやっていきたいです。

参考にさせていただいたサイトはこちら

 

Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある.

  • 1行に1記事の情報がJSON形式で格納される
  • 各行には記事名が”title”キーに,記事本文が”text”キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出される
  • ファイル全体はgzipで圧縮される

以下の処理を行うプログラムを作成せよ.


20. JSONデータの読み込み

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

ファイルを読み込み、一行ずつ処理するところはこれまでもやってきたので問題ないと思います。

ファイルがjson形式なので、json.loads()関数を用いてjson形式に変換しています。

問題はarticle_dict[“title”]==[“イギリス”]の部分です。

どうやらこれは記事内で利用されている、htmlタグを指定するときに利用するらしい。htmlファイルには

実際に

みたいな感じでいろいろなタグが使われている。

今回は要するにファイル内の

となっている部分について読むということであろう。

実行結果:

とこんな感じになっていればおっけー。

 

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

『記事中でカテゴリ名を宣言している行を抽出せよ.』

 

特に難しい処理はしていないが、自分的には11行目の”Category” in line:のところが気になった。

lineはlinesの時点で文字列として扱われているので”Category”としていきなりif文の中で宣言して構わないみたいだ。

if の条件文で””を使うことがなかったので、慣れないが自然言語処理なら普通のことなのだろう。

実行結果:

for文を使っているためlineがリスト型になってしまうのは否めない。

 



スポンサードリンク

22. カテゴリ名の抽出

『記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.』

module化しなくてもいけるが、インデントが多くなるのでモジュール化しました。

正規表現を扱うためにreモジュールをインポートします。正規表現とは文字列の並びやパターンを特定するもの。

どんな使い方するのだろうかとかは、こちらの方のサイトを見ていただけるとわかると思います。

ちょっとこれは新しい情報が多すぎて混乱しそうです。そもそもなんでこんなめんどいことしなきゃいけないのか?など聞きたいことは山ほどあります。

compileというコマンドで正規表現パターンを定義してやるぞって意味。

findall()は上で指定した正規表現パターンを()内の引数から抽出するための関数。

正直なところ^とか. とか意味がわからない。おそらく今回のデータが文章構造になっていて一行ごとに読み込み、処理をするようになっているので行頭を指定してやる必要があるのだと思う。

.*で任意の文字0回以上と指定しています。どんな文字でも何回でもおっけーよってことだと思うが、それ指定する必要ねーじゃんって思ってしまう。

独学の限界を少々感じるが、理解できたらおいおい更新していきます。

 

23. セクション構造

『記事中に含まれるセクション名とそのレベル(例えば”== セクション名 ==”なら1)を表示せよ.』

セクションとは記事の見出しです。第1章とか通常の文章部分よりもでかい文字で書いたりする部分のことです。なのでセクション構造とはその文章の章構成とか目次みたいなもんです。

レベルというのはその章とか目次がどの階層にいるかというのを表したものです。一番上の階層が「1」ということです。

正規表現部分は慣れませんが、実際に自分でやった方が早いのでしょう。一発でなんか絶対うまく行かないと思いますが笑

の部分はセクション名が==セクション名==という形式で書かれているため、2個以上という意味で2が入ります。もう一個階層が下がると=== サブセクション名===という感じでしょうか。

これがないと、例えば

==セクション構造== ===サブセクション=== ====サブサブセクション====みたいな階層構造の場合、最後まで一気に読み込んでしまうということだろうか。?は直前の正規表現で指定したパターンの最小回数(1回)でのマッチングを意味するものなので、次に==が出てきた瞬間とこまでしかマッチングしない。

こちらのサイトを参考にすると理解できそうです。

後方参照というものらしく、終わりと開始が同じパターンならそれを利用して\numberで開始を指定してマッチングさせることができるものらしい。

== セクション名 ==みたいな感じで空白があるものがデータに含まれていたため以下のような空白除去が必要らしい

実行結果:

こんな感じ。

 

24. ファイル参照の抽出

『記事から参照されているメディアファイルをすべて抜き出せ.』

メディアファイルが何を意味しているのかわからなかったのですが、jpgとかsvgファイルのことらしいです。そしてそれらのファイルの前にファイルとかfileとか書かれているのでそれを指定する正規表現が上の一行です。

verboseは正規表現を便利に書きやすくするための関数です。公式ドキュメントにも

「パターンの論理的なセクションを視覚的に区切り、コメントも入れることができます。」と書かれています。

今回はこれまでのができていれば簡単にできる問題です。

実行結果:

とこんな感じです。

次は第3章後半です。


スポンサードリンク

 

 

記事が役に立ったらシェア!

投稿者:

中村 俊

中村 俊

1993/09/04生まれ。機械系大学院を休学し、ベンチャーでインターンしている最中。直近では、デカルトの「方法序説」に感銘を受けた。 趣味:読書、web開発の勉強、異分野の論文読んだり、記事書いたり。 最終的には経営者か研究者になりたい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA