HIROBIRO

HIROBIRO

精神的自由を目指すブログ。最近はプログラミングの記事多め。

【4章・自然言語処理】PythonによるAI・機械学習・深層学習アプリのつくり方

「PythonによるAI・機械学習・深層学習アプリのつくり方」の4章の内容について勉強したことをまとめます。

4章のテーマは自然言語処理で、文章の分析・分類やSNSや掲示板のスパム投稿判定の方法について書かれています。

 

この本に載っているコードは全てgithubで公開されているため、この記事では具体的なコードは書きません。以下を参照してください。

https://github.com/kujirahand/book-mlearn-gyomu

 

 

また4章を実行するにあたって、私が環境構築で苦労した点を以下の記事にまとめています。

 

www.hirobiro-life.com

 

 

4-1 言語判定をしてみよう

「言語判定」とは与えられた文章が何語で書かれているかを判定する技術です。言語判定には以下のような方法があります。

 

 

・使われている文字の種類による判定

(例)ひらがなと漢字 ⇒ 日本語

   ハングル文字  ⇒ 韓国語

 

 

・文字の利用頻度による判定

 英語とスペイン語など同じアルファベットの文字を使う場合の判定です。

 利用されている文字が同じ場合は文字の利用頻度をある程度明確にするため、大きめのデータ必要です。

 (例)英語で最も使われるのは「E」、最も使われないのは「Z」

 

 

与えられた文章で使われている文字の違いや利用頻度を調べるために、Unicodeのコードポイントを利用します。

コードポイントとは個々の文字に割り当てられる数字のことで、コードポイントをアドレスとする配列を用意します。

各文字が登場するたびに対応するアドレスの要素をインクリメントします。

 

 

言語判定以外の応用例として、記述者判定があります。同じ日本語でも人によって利用する単語や文字種類の割合が異なるため、句読点やひらがな・カタカナ・漢字の種類や出現率から判定できます。

 

 

4-2 文章を単語に分割してみよう

形態素解析は文章を単語に分割する技術であり、自然言語処理に欠かせない技術です。

形態素解析の定番ツールが「MeCab」です。

 

 

MeCabの特徴

・パラメータ推定にCRF(Conditional Random Fields)を用いる

・解析精度、実行速度が速い

・Java, C#, Pythonから利用可能

 

MeCabによる形態素解析の例

f:id:hirokun1735:20181119231135j:plain

 

 

MeCabは形態素解析を行うのに単語辞書を用いています。単語辞書の一つに「mecab-ipadic-NEologd」があり、これを使えば新しい単語に対応した解析が行えます。 

 

 

mecab-ipadic-NEologdの特徴

・辞書の更新を毎週2回以上実施

・はてなキーワードのダンプデータやニュース記事など、Web上の新しい単語を抽出して辞書を作成

 

 

日本語の場合、助詞や助動詞(「が」「の」「です」「ます」など)の利用頻度が多く、こういった単語は文章の判定に利用できません。

このような単語を「ストップワード」と呼び、除外すると判定制度が向上します。

 

 

また動詞や形容詞の場合は送り仮名に揺れがでるため、原形を取得することで正規化します。これも判定制度の向上に役立ちます。

(例)踊っ ⇒ 踊る

           送り ⇒ 送る

 

 

4-3 単語の意味をベクトル化してみよう

形態素解析によって文章を各単語に分割した後は各単語をベクトル化します。

ベクトル化によって単語の意味や類似度の計算が可能になります。

(例)「王」-「男」+「女」=「女王」

 

 

単語のベクトル化で単語間や文章の意味的な関係を表現できます。単語ベクトルは通常100~200次元くらいあるため、それだけ複雑な情報を表現できます。

 

 

単語のベクトル化には「Word2Vec」という手法を用います。

また誰にでも無料で手に入る大量のテキストとしてWikipediaのデータをダウンロードして用います。

Wikipediaのデータを形態素解析して分かち書きデータを用意し、Word2Vecで学習します。

「モデルを作成するための大量の分かち書きデータ」、「コンピューターによる検索が可能な大量の言語データ」をコーパスと呼びます。

 

 

モデルの作成は以下のコードで実行します。

 

f:id:hirokun1735:20181120214456j:plain

https://github.com/kujirahand/book-mlearn-gyomu/blob/master/src/ch4/Word2Vec/Word2Vec.py

 

 

本書には「このプログラムは実行に数時間かかります。なかなか終わらなくても異常ではないので中断したりせず、気長にお待ちください。」と書かれていました。

 

 

私はそれを信用して待ち続け、結局1週間待っても終わりませんでした。

原因はVirtualBoxの仮想環境で実行していたためです。

仮想環境で実行すること自体は良いのですが、仮想環境でのメモリ割り当てを確認すると458MBしかありませんでした。

 

 

下記のページを参考にして4GBのメモリを割り当てると確かに数時間程度で終わりました。

d.hatena.ne.jp

 

 

また本書209ページにコーパス作成のコードがありますが、最後のコードが間違いで、以下が正しいです。

 

$ mecab -b 100000 -Owakati wiki.wp2txt -o wiki_wakati.txt

 

 

PythonでWord2Vecを実行するには自然言語処理ライブラリのgensimを利用します。

単語のベクトル化の他にも文章をジャンル分けするトピック分析にも使用できます。

 

 

それでは実際にWord2Vecを使った例を紹介します。以下の式から何を連想するでしょうか。

 

「スポーツ」+「ボール」-「足」=?

 

私は「野球」を想定してこの式を考えましたが、結果は以下になりました。

 

 

f:id:hirokun1735:20181120213548j:plain

 

 

確かにボウリングもスカッシュも足を使わない球技ですね。

足を使わない競技はたくさんあるので、もっと絞り込んで考えないとダメなようです。

 

 

4-4 文章を分類してみよう

文章の分類にはDoc2Vecを用います。

Doc2VecはWord2Vecを発展させたもので、任意の長さの文章をベクトル化できます。

Doc2VecもWord2Vecと同様にgensimで利用できます。

 

 

本書では「青空文庫」にあるテキストを用いて「ある文章は誰の作品である」ということを分類するプログラムを紹介しています。

文章の類似度を測ることの応用として、「類似した論文や特許が既に存在しないか」という活用も既にされているそうです。

 

 

4-5 自動作文に挑戦しよう

マルコフ連鎖という手法を用いて文章を作成します。

マルコフ連鎖とは、未来の状態が現在の状態のみで決まるという性質を持つ確率過程のことです。

これを利用することで既存の文章を利用し、自動で文章を生成することができます。

 

 

マルコフ連鎖についての詳細な解説はネットにたくさんあるので割愛します。

この手法では入力された単語の品詞に注目し、その単語を始点に応答文を作成します。

文章の意図まで考えるわけではなく、オウム返しのような返答が多くなります。

 

 

f:id:hirokun1735:20181123175014j:plain

 

 

 犬や熊について少し会話してみましたが、オウム返しの返答が多いです。

もっと人間らしい会話をするには作文のアルゴリズムを見直す必要があるでしょう。

 

 

4-6 SNSや掲示板へのスパム投稿を判定しよう

簡単に読み流しただけなので省略します。

 

 

まとめ

第4章の自然言語処理では文章の分析や自動作文の手法を学びました。

元データとしてはWikipediaや青空文庫などを利用できます。

自動作文は単純な応答しかできませんでしたが、アルゴリズムを工夫することでもっと面白い応答ができることが期待できます。

 

第6章の内容を以下の記事にまとめました。

 

www.hirobiro-life.com

 

 

 

すぐに使える! 業務で実践できる! Pythonによる AI・機械学習・深層学習アプリのつくり方