見出し画像

自然言語処理③~MeCabを使う~

前回はn-gramのみでしたが、今回からMeCabを使っていこうと思います

セットアップはローカルですると大変ですが、colaboratoryで全てコピペで行けるようにしているので、とにかくハンズオンでできるようにします。

また、理論の部分があれば適宜差し込みますが、「読むだけでも理解できるように努めている」ので、是非一緒にマスターしていきましょう。

(MeCabを使って形態素解析してるサイトなんて山ほどあるので、解説はほどほどにします。)

・MeCabを爆速でセットアップ

MeCabのセットアップでつまづいて本題の学習が進まない!のはもったいない(わりとpythonにおいて環境設定とかセットアップが難関な場合はかなりある)ので、コピペで爆速でセットアップしましょう

(※)前回も書きましたが、今回はjupyterではなくcolaboratoryですので、ご注意ください。

!apt install mecab
!apt install libmecab-dev
!pip install mecab-python3
!pip install unidic-lite

スクリーンショット 2021-08-25 23.33.41

おそらくapt実行時、いろんな文章が下にブワァって出ますが、全て終われば使えるようになります!

爆速ですね!

困ったら公式の方を参照したりとかで十分ですし、そもそもMeCabじゃなくてもjanomeとかcabocha、ginzaとかでも形態素解析はできます。

janomeは、pip install とかですぐできますし、MeCabより確か処理が早かったはずです(その分精度とか辞書とかはそこそこのレベル)

私自身がMeCabのインストールに手こずった経験があり、その時にjanomeにはめちゃくちゃ助けられたので、個人的にはjanomeの方が愛着があります。。。

今回とかもしかしたら今後も、MeCabじゃなくてもいい時はjanome使うかもしれません。

セットアップできたら、上記を真似して

m.parse('解析したい文章')でも入れてみて、どうなるか試すのも楽しいです

・MeCabの簡単な理論背景

実装だけしたい方とかコード重視をされているかたは読み飛ばしてください

MeCabの実装はそんなにすることがないので、軽く理論背景を説明します。

MeCabの裏では「隠れマルコフモデル(HMM)」という理論が使われていて、この隠れマルコフモデルは簡単に言えば、「時系列を加味したクラスタリング」のようなものです。

隠れマルコフモデルの説明はしないですが、ある状況間での確率を考え、将来的な状態が現在でどのくらい予測できるのかを考えた確率モデルです。

ちなみに、英語ですが視覚的に理解しやすかったので紹介しておきます。

・MeCabで工夫していく

では、簡単にMeCabのセットアップができたところで、少し色々探ってみます

先程のコードをもう一度見てみます。

import MeCab

m = MeCab.Tagger('')
print(m.parse('私の出身は東京です'))

MeCabにあるTaggerというクラスは形態素解析する際の辞書や方法を設定するものになります。

後ほど紹介するipadicの辞書を利用する時は、

 '-d (辞書のあるpath)'を指定したり、
分かち書き(形態素の品詞などの情報はいらず単にぶんかつされたものだけにする)が欲しい時は'-Owakati'などと書きます。

実際に見ていきます。

スクリーンショット 2021-08-26 10.25.08

スクリーンショット 2021-08-26 10.25.33

スクリーンショット 2021-08-26 10.42.00

(このChasen形式はおそらく'-Ochasen'だけではエラーが出ます。neologdの辞書を入れてから、上記のようにコードを打てば出てきます。)

・neologdについて

MeCab-neologdとは「流行語とか新語を追加した辞書」のことです。

定期的な更新がされていて、今まで分割されてしまっていた単語なども正しく認識してくれる確率が上がります。(かなり特有な単語の場合は直接辞書に追加するのが良い時もあります。)

これを使ってみていきましょう

まずはセットアップから。

ここでつまづくのは勿体無いので、コピペだけで行けるようにしています。

# 形態素分析ライブラリーMeCab と 辞書(mecab-ipadic-NEologd)のインストール 
!apt-get -q -y install sudo file mecab libmecab-dev mecab-ipadic-utf8 git curl python-mecab > /dev/null
!git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git > /dev/null 
!echo yes | mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n > /dev/null 2>&1
!pip install mecab-python3 > /dev/null

# シンボリックリンクによるエラー回避
!ln -s /etc/mecabrc /usr/local/etc/mecabrc

では、実際の使い方を見てみます。

path = "-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd"
m = MeCab.Tagger(path)

m_normal = MeCab.Tagger()

print('普通に使う時')
print(m_normal.parse('五条悟は今日京都から東京まで10分で移動しました・'))
print('-'*10)
print('Neologd使う時')
print(m.parse('五条悟は今日京都から東京まで10分で移動しました・'))

スクリーンショット 2021-08-26 10.49.44

Neologdを使うと「五条悟」を正しく固有名詞として認識していることがわかります。

企業のアンケート解析のような「新しく、かなり特有の固有名詞」を判断しないといけないみたいな状況でない限りは、基本的にneologdでいいと思います。

・Stopwordの除去

文章にはほとんど意味のない(また解析する必要性のない)単語があり、それらの単語ほど頻繁に出てきてしまいます(英語で言えば、the, like have とか。日本語なら「私は」の「は」とか)

これらをいちいち分析するのではなく、形態素解析してそれらの単語が出てきたら自動的に除くなどのアプローチが必要になります。

今回は下記にあるstopwordをあつめたファイルを参照していくことにします。

http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt

まずファイルのダウンロードをwgetでしておきます

!wget http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt

では、簡単に例を見ていきます。

path = './Japanese.txt'

with open(path, 'r') as file:
 stopwords = file.readlines()

print(stopwords[:3])

# このまま使うと'\n'が混在しているのでstripで削除
stopwords = [string.strip() for string in stopwords if string.strip()]

print(stopwords[:3])

m = MeCab.Tagger('-Owakati')

text = '昨日、花子は傘を忘れたから、土砂降りの中家に帰りました'

parse = m.parse(text).split()

list_without_stopword = []
for word in parse:
 if word not in stopwords:
   list_without_stopword.append(word)

list_without_stopword

スクリーンショット 2021-08-26 11.09.04

先程のURLを読み込むと改行コードが混在してしまうので、str.strip()で不要なコードを削除することに注意しながら文章を解析してみました。

(今回品詞情報は不要なため、簡易的な分かち書きを採用しました。)

stopwordの言葉(今回で言えば「忘れたから」の「から」、「帰りました」の「まし」)を弾くことができましたね!

実際はもう少し改善の余地があったり、除く方法もいくつかある(tf-idfのようなものなど)ので、次回以降使う時がきましたら解説していきます。

・100本ノック(第2章)

それでは今回は2章へ。

UNIXコマンドなので、特に特筆して書くことはないかなと。。

とは言え、colabではwgetなどでデータをコマンドひとつで取得できたりとローカル依存な体質改善にもつながるので大事な章だとは思います。

・終わり​

今回は簡単にMeCabの解説にとどめまして、次回でWord2Vec、Doc2Vecに進もうと思います。

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