NLP100本ノックを(途中まで)やった感想など

この記事は ISer Advent Calendar 2020 の9日目として書かれました。

皆様はじめまして。IS20erのトモと申します。毎日虚無を摂取して生きています。ふとアドカレを眺めたら空欄がたくさんあって寂しかったので、埋めることにしました。ちなみに、ブログを書くのは初めてなので(というか、140文字以上の文章を書くのすら久しぶりなので)、以下乱文となることをご容赦ください。

さて、今日はタイトル通りNLP100本ノックをやった感想などを書こうと思います。ちなみに言語はpythonです。空欄を埋めるためにテーマを必死に捻り出したので、出がらしのお茶より薄い内容となる可能性があります。あくまで初心者がやってみてどうだったか、という趣旨の記事ですので、技術的な何かを期待している方にとっては期待外れの内容となることをあらかじめご了承ください。

(NLP)100本ノックとは?

前置き(保険)はこれくらいにして、本題に入ろうと思います。NLP100本ノックとは「言語処理100本ノック」のことで、自然言語処理に関する課題が演習形式で100問(10ジャンル各10問)載っている問題集です。ISの人は2Aの情報科学基礎実験みたいな雰囲気をイメージしていただければ良いと思います。100本ノックは他にも画像処理のものやデータサイエンスのものとかもあるっぽいので、ここでは詳しく触れませんが、興味のある人は調べてみてください。

NLP100本ノック: 目次

NLP100本ノックは以下のように構成されています。

第1章: 準備運動
第2章: UNIXコマンド
第3章: 正規表現
第4章: 形態素解析
第5章: 係り受け解析
第6章: 機械学習
第7章: 単語ベクトル
第8章: ニューラルネット
第9章: RNNとCNN
第10章: 機械翻訳

本記事では、以下で各章について軽く紹介し、やってみた感想とか得た知見とかを書いていこうかなと思います。ネタバレとかはあまりしないように書こうと思うので、気になった方は自分でやってみてね。

第1章: 準備運動

この章は主に文字列に関する簡単な処理をする問題で構成されています。文字列を逆順にする問題とかがあって、大学の課題とかでよく見るタイプの問題だなあという気持ちになります。言語によっては少しめんどくさそうですが、自分はpythonでやったので特に難しくはなかったです。ただ、n-gramなどの言語処理っぽい概念も登場し、これが自然言語処理かあみたいな気分になれます。

第2章: UNIXコマンド

基本的なUNIXコマンドの確認です。3Sのシスプロ実験で触るようなものと大差ないと思います。ただ、テキスト処理系のコマンド(wcとかcutとか)が多めです。自分は鳥よりも記憶力がないので、3Sでやったものについてもググる羽目になりました。ちなみに今はもう忘れています。

第3章: 正規表現

ここらへんから自然言語処理っぽい雰囲気が出てきます。概要としては、Wikipediaの記事をJSONフォーマットで格納したテキストを正規表現で処理するという感じです。正規表現ってよく聞くけどあんま使ったことないなって人も多いと思うので(自分もそうでした)、良い練習になると思います。ちなみに自分はここで得た知識がCPU実験で書いたシミュレータ(アセンブリのパース)とかに役立ちました。どの言語にも大体あると思いますが、各言語でちょっと仕様が違うのでちゃんと調べましょう。あと、正規表現を知ると何でもかんでも正規表現にマッチさせたくなるのですが(自分だけかも)、例えばpythonとかだとsplit関数を使った方が圧倒的に楽なことも多いので、あくまで1つのツールとしてみることが大事な気がします。

第4章: 形態素解析

この章は「形態素解析の実装」ではなく「形態素解析結果の解析」がメインです。形態素解析器としてはMecabを使います。余談ですが、この辺のツールはMecabとかCabochaとかMozcとか美味しそうでいいですよね。それは置いといて、解析というのは「頻出単語」とか「共起頻度が高い単語」とかそういうのです。この辺は日本語が好きなら結構面白いと思います。実装的には、Mecabの出力をパースするプログラムを作るところが9割って感じなので、そんなに難しくはないと思います。あとはグラフを出したりするのでMatplotlibとかを使います。

第5章: 係り受け解析

今度は先ほども述べたCabochaとかを使って係り受け解析をします。係り受け解析ってのは文節間の修飾関係を見るやつです。この辺から結構実装がめんどくさくなったりします。解析結果の係り受け木はグラフとして持ち、そこから情報を抽出するのですが、ほしい情報の条件が複雑なので愚直に書くとバケモノコードになります(なりました)。今見返しても読めません。読者の中でやる方がいたら是非きれいに書くことを意識してみてください。ちなみに、この中でGraphizというグラフ可視化ライブラリを用いたのですが、結構きれいにできて面白かったのでpythonでグラフ可視化をする時は使ってみると良いと思います。

第6章: 機械学習

みんな大好き、機械学習のセクションです。pythonには便利なライブラリがたくさんあるので、好きなのを選んでエイヤって投げることになります。ただ、学習に用いる特徴量は自分で選ぶことになるので、例えばtf-idfとか、n-gramとか、そういう言語処理っぽいやつを選んできて好きに設計します。自分は全然知らなかったのでその辺りしか使ってませんが、面白い特徴量とかがあれば是非カスタマイズしてみると良いと思います。こういうすごいライブラリを使う系の課題は「なんか動いたからヨシ!w」となりがち(というかなった)なので、最低限の知識がないとあまり得るものがない気がして「うげ〜〜」って言いながらやってました。ただ、その時は何がなんだか分からなくても、後にちゃんと勉強した時に頭の隅の記憶と結びつくこともあるので、やる意味はなくはないのかなあって思ってます。

第7章: 単語ベクトル

単語ベクトルは文字通り単語をベクトルに変換したものです。天下のGoogle様が作ってくださったデータセットがあるので、この章ではそれを使います。300万単語*300次元なので読み込むだけでもめちゃくちゃ重くてキレそうになるのですが、温厚な心で進めましょう。前半ではこの単語ベクトルがちゃんとベクトルっぽい振る舞いをするのか見ます(似た単語のベクトルが似ているかどうかなど)。結構面白いのでいろいろ遊んでみるといいと思います。後半ではそれをクラスタリングしたりして、「確かにそれっぽいベクトルになってるんだなあ」みたいな感慨を得ます。ここでもpythonのライブラリが大活躍するので、「難しいことはpythonにやらせよう」の気持ちで乗り切りました。やる気がある人は是非全部1から実装してみてください。

第8章: ニューラルネット

第6章と同じモデルをニューラルネットでやろうという章です。ここでは特徴量として第7章の単語ベクトルを使います。この辺の章をやっている時はpythonが賢すぎて悲しい気持ちになっていました。やっていることは確率的勾配降下法とかミニバッチ化とかクロスエントロピー損失まあ聞いたことあるようなことなので、「俺はpythonより賢いんだ!」っていう気概のある人は是非自分で書きましょう。多分圧倒的実力を得ることができます。

残念ながら自分はここで力尽きたのですが、残りの2章も一応紹介しておきます。

第9章: RNN, CNN/第10章: 機械翻訳

第9章はRecurrent Neural Network(RNN)およびConvolutional Neural Network(CNN)を使う章です。モデルが異なるだけで、やることは第8章と似た感じだと思います。

第10章は機械翻訳モデルを実装しようという内容で、今までの総まとめ(何でも使って良い)という感じになっています。挙げ句の果てには

ユーザが翻訳したい文を入力すると,その翻訳結果がウェブブラウザ上で表示されるデモシステムを構築せよ.

とかいう課題まで出ます。強い人は是非頑張ってください。

終わりに

以上がNLP100本ノックの全体像です。とりあえず、ひどい文章になっていてすみません......... 雰囲気だけでも伝わっていればなあと思います。自分の感想としては、「途中から難易度上がりすぎでは?????」って感じですかね... 課題だけ出て丸投げなところは理情の実験と似ているので、ISerには向いているかもしれません。まあ、そうでなくとも、そこら中に解説記事とか上がってるので、詰まないのが良いところだと思います(後半の解説はあまり落ちてないですが)。興味がある方は春休みとかに是非やってみてください。

ここまで読んでくださった方、もしいらっしゃれば本当にありがとうございました。なんか初手からゆるふわ記事書くのも違う気がして真面目な記事を書いてしまいましたが、次は自分の趣味の自炊のこととか、FPU係とシミュレータ係を兼任したCPU実験の感想とか書けたらいいなあと思っています。ではまた。

この記事が気に入ったらサポートをしてみませんか?