薬剤師のプログラミング学習日記

プログラミングやコンピュータに関する記事を書いていきます

MeCabをインストールしてPythonで分かち書きをする

自然言語である文書データを機械学習プログラムで扱えるようにするためには、文を構成する要素である単語に分解(分かち書き)する必要があります。今回はPythonで分かち書きをするために必要なソフトのインストールとその設定について書こうと思います。


分かち書きとは

文を単語に分解し、語と語の間を空白で区切る処理のことをいいます。
日本語は英語とは違い、単語と単語の区切りが明確でないため、プログラム上でこの処理を行うことが簡単ではありません。そこで、形態素解析エンジンというソフトウェアを利用してこの処理を行いますが、MeCab(めかぶ)はこの形態素解析エンジンのひとつです。
f:id:enokisaute:20200517184651p:plain
なお、形態素解析という言葉は単に単語に分解するだけではなく、『自然言語で書かれたテキストデータ(文)から文法や単語の品詞等の情報にもとづき、形態素(意味を持つ最小単位)まで分解して、それぞれの品詞等を判別する作業』(Wikipedia-形態素解析(一部引用))のことをいうようです。

MeCabのインストール

環境はWindows10(64bit), Anaconda(Python3.7)を想定して書いています。

なお、インストールからPythonで使うまでの方法はこちらを参考にしました。
WindowsやmacやLinuxにpipでPython用MeCabバインディングをいれる - Qiita

まずこちらのページ(MeCab 0.996 64bit version)へ行き、『mecab-64-0.996.2.exe』をダウンロードします。
ダウンロードが終わったら、インストーラを起動して選択肢をクリックしていきます。

・インストールする辞書の文字コードは『通常はSHIFT-JIS』と書いてありますが、Pythonから利用するのでここはUTF-8を選択します。
f:id:enokisaute:20200517160305p:plain
・インストール先フォルダはデフォルトのまま
※私の場合はインストール先がC:\Program Filesとなりましたが、C:\Program Files(x86)の場合もあるようです。以下の文章は各自のインストール場所に読み替えてください。

最後に「インストール」をクリックして終了です。

Pythonで使えるようにする

入れたMeCabをPythonで使えるように、ここで参考ページのバインディング(両者の橋渡しをするプログラム)をインストールします。
Anaconda Promptを開き、

pip install mecab

と入力してEnterを押します。
「successfully installed(正常にインストールされました)」と出れば完了です。

・・と、ここでAnacondaを利用しているのであれば、パッケージの管理や操作はcondaを使用して、本来pipを使うのは極力避けるべき(環境が壊れる可能性がある)ですが、ここはお手軽さを優先してpipを使いました。私の場合ですが、今のところ不具合は起こっていません。

PythonでMeCabを使う

では実際に形態素解析のコードを書いてみます。

import MeCab
t = MeCab.Tagger()
sentence = 'すもももももももものうち'
print(t.parse(sentence))

これを実行すると

すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

と表示されます。
ここで、MeCab.Tagger()のところで-Oオプションを使うことで出力フォーマットの指定ができます。例えば、分かち書きをする場合は次のように書きます。

t = MeCab.Tagger('-O wakati')
sentence = 'すもももももももものうち'
print(t.parse(sentence))
# すもも も もも も もも の うち



医療用語辞書を追加する

次のような文を分かち書きしてみます。

sentence = 'PPIとはプロトンポンプ阻害薬のことです'
print(t.parse(sentence))
# PPI と は プロトン ポンプ 阻害 薬 の こと です

「プロトンポンプ阻害薬」が「プロトン / ポンプ / 阻害 / 薬」になってしまっています。
PPIはProton pump inhibitorの略なので、この区切りは間違いとは言えませんが、医療関係の文書を分かち書きする上では、ここは「プロトンポンプ阻害薬」または「プロトンポンプ阻害 / 薬」であってほしいです。
文書データの性質や文脈にもよります(この言葉のように、区切り方の正解は一つとは限らないでしょう)が、医療関係の文書を読む場合において、この区切りは不自然に感じます。「PPI」と「プロトンポンプ阻害薬」は同義であるのに、一方がバラバラに分解されていては、機械学習の手法を試してもうまくいかないだろうということは想像がつきます。

これは、形態素解析を行うMeCabが使用している辞書に原因があります。ただ、単に「プロトンポンプ阻害薬」という単語が辞書に載っているかどうかだけの単純な話でもないようなのですが、ここでは医療用語が登録された辞書をMeCabで使用してみます。

医療用語辞書のダウンロード

ネットで検索したところ、次の2つが候補としてあがりました。後ろの文言は、各ページにあった説明文です。

  • ComeJisyo 『医療記録の分かち書きを支援するための実践医療用語辞書』
  • 万病辞書 『臨床現場で実際に使われる病名を集計・解析するための大規模な病名辞書』

ここでは、上のComeJisyoを使ってみることにします。
こちらのページに行き、ダウンロードのところから文字コードがUTF-8の『ComeJisyoUtf8-2.zip』(Mac版)をダウンロードします。
ComeJisyo プロジェクト日本語トップページ - OSDN

  1. 先にMeCabのインストール場所にあるdicフォルダ、C:\Program Files\MeCab\dicに行き、userdicという名前のフォルダを作っておきます。
  2. ダウンロードが終わったら適当な場所にすべて展開し、中の『ComeJisyoUtf8-2.dic』を作成したuserdicフォルダに入れます。

この2つの作業(フォルダの作成とファイルの移動)をするときに『アクセス権限が~』みたいなことを言われますが、無視して続行ボタンを押せば実行できます。

mecabrcファイルを編集して辞書を反映させる

次は、新しく入れた辞書を設定として反映させる作業です。C:\Program Files\MeCab\etcにあるmecabrcファイルを右クリック→切り取り→一旦デスクトップに貼り付けます。
ここでもう一度ファイルを右クリック→プログラムから開く→メモ帳を選択して編集します。
15行程度の小さなファイルですが、中程にある次の項目を書き換えます。

; userdic = /home/foo/bar/user.dic

のところを

userdic = C:\Program Files\MeCab\dic\userdic\ComeJisyoUtf8-2.dic

と書き換えて(または追加して)上書き保存します。先頭のセミコロン(;)は忘れずに消しておきます。また、先頭はスペースを空けません。

そして、今度はこのファイルをまた元の場所に戻します。
Anaconda Prompt(コマンドプロンプトでも)を右クリック→「管理者として実行」したら次のように入力して、まずファイルのあるデスクトップに移動します。<ユーザ名>のところは各自の環境によります。

>cd C:\Users\<ユーザ名>\Desktop

次に、編集したファイルを元の場所に移動させます。

>move mecabrc "C:\Program Files\MeCab\etc"

「1個のファイルを移動しました」と出ます。ちなみに、次からはファイルを移動させずに編集できるようになるみたいです。
もちろん最初からフォルダのアクセス権を取得してから操作しても良いですし、どんなエディタを使ってもOKです。

これで上の文章を再度試してみます。

sentence = 'PPIとはプロトンポンプ阻害薬のことです'
print(t.parse(sentence))
# PPI と は プロトンポンプ阻害薬 の こと です

うまくいきました。ちゃんと「プロトンポンプ阻害薬」が一単語で区切られています。

自分でユーザ辞書を作る場合

「DPP-4阻害薬」で試してみると、この言葉は上で入れたComeJisyoにも入っていないようで、結果は「DPP / - / 4 / 阻害 / 薬」となりました。
このような場合は自分でユーザ辞書を作成することになります。

ユーザ辞書の作成

まず、次のフォーマットに従ってCSVファイルを作ります。

 
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音

パソコンにエクセルが入っているなら、エクセルを使ってもOKです。
私は「DPP-4阻害薬」を下のように作成しました。
f:id:enokisaute:20200523132757p:plain
左文脈IDと右文脈IDは空白のまま(空白でも自動的に割り振られる)で、コストはとりあえず0としています。コストは、その単語がどれだけ出現しやすいかを示しており、 小さいほど出現しやすいという意味だそうです。
このファイルを適当な作業フォルダ等にCSV形式で保存します。ここではファイル名は「mydic.csv」としました。

ユーザ辞書をコンパイルする

次に、メモ帳を開いて以下のコマンドを貼り付けます。

echo on
"C:/Program Files/MeCab/bin/mecab-dict-index" -d "C:/Program Files/MeCab/dic/ipadic" -u mydic.dic -f sjis -t utf-8 mydic.csv
pause

各オプションの意味については

  • -d DIR: システム辞書があるディレクトリ
  • -u FILE: FILE というユーザファイルを作成
  • -f charset: CSVの文字コード
  • -t charset: バイナリ辞書の文字コード

です。
ファイル名は何でも構いませんが「ファイル名.bat」として先ほどのCSVファイルと同じフォルダに保存します。このようにしておけばバッチファイルとしてダブルクリックで実行することができます。
このバッチファイルを実行して、辞書のコンパイルが成功すれば次のような表示が出てフォルダ内にmydic.dicが作成されます。

>"C:/Program Files/MeCab/bin/mecab-dict-index" 
-d "C:/Program Files/MeCab/dic/ipadic" -u mydic.dic -f sjis -t utf-8 mydic.csv
reading mydic.csv ... 1
emitting double-array: 100% |#########################|

done!

あとは、作成されたdicファイルをC:\Program Files\MeCab\dic\userdicに入れておきます。

最後にmecabrcファイルを編集して、今作成した辞書を追加します。編集の仕方は上のmecabrcファイルを編集して辞書を反映させるで書いた通りですが、ComeJisyoに追加する場合はカンマで区切って、次のように編集します。

 
userdic = C:\Program Files\MeCab\dic\userdic\ComeJisyoUtf8-2.dic, C:\Program Files\MeCab\dic\userdic\mydic.dic

これで次からは「DPP-4阻害薬」が1語で区切られるようになります。