【Python】形態素解析エンジン MeCabの使い方

Python モジュール 自然言語処理

自然言語処理(NLP)で用いられる日本語の形態素解析エンジンとして、MeCabが知られています。
本記事では、Mecabを使った日本語文章の形態素解析について、

  • Linux(Ubuntu)へのMeCabおよび辞書のインストールと使い方の基本
  • Pythonバインディング(mecab-python3モジュール)の使い方

を具体例を挙げて解説します。
Pythonバインディングのみ確認したい場合はこちらからご参照ください。

MeCabとは

日本語の形態素解析のためのツールです。下記は公式サイトより抜粋

MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 言語, 辞書,コーパスに依存しない汎用的な設計を 基本方針としています。 パラメータの推定に Conditional Random Fields (CRF) を用 いており, ChaSenが採用している 隠れマルコフモデルに比べ性能が向上しています

MeCab公式サイト

UbuntuへのMeCabインストール

インストール

下記のようにapt installコマンドでインストールできます。

$ sudo apt install mecab

依存ファイルもインストールしておきます。

$ sudo apt install libmecab-dev libmecab2 swig
参考)依存ファイルの詳細は下記をご参照ください。

  • libmecab-dev :Header files of Mecab
  • libmecab2 :Libraries of Mecab (※以前はlibmecab1でしたが今はlibmecab2
  • swig :Generate scripting interfaces to C/C++ code

インストールが無事成功したことを確認するため、バージョンを表示してみます。

$ mecab --version
mecab of 0.996

基本的な使い方

簡単な例文で動作確認してみます。
Terminalのコマンドライン上でmecabと入力してEnterキーを押すと文章の入力待ちの状態になりますので、日本語の文章を入力します。

$ mecab
今日の晩御飯は何かな?
今日    名詞,時相名詞,*,*,今日,きょう,代表表記:今日/きょう カテゴリ:時間
の      助詞,接続助詞,*,*,の,の,*
晩      名詞,時相名詞,*,*,晩,ばん,代表表記:晩/ばん 漢字読み:音 カテゴリ:時間
御飯    名詞,普通名詞,*,*,御飯,ごはん,代表表記:御飯/ごはん カテゴリ:人工物-食べ物 ドメイン:料理・食事
は      助詞,副助詞,*,*,は,は,*
何      名詞,数詞,*,*,何,なん,カテゴリ:数量
かな    名詞,普通名詞,*,*,かな,かな,代表表記:仮名/かな カテゴリ:抽象物
?      特殊,記号,*,*,?,?,*
EOS

入力した文章の解析結果が出力されました。
尚、このままだと入力待ちの状態が継続しています。続けて解析したい場合は次の文章を入力します。
終了する場合はCtl+CまたはCtl+Dを入力します。

辞書のインストール

初期状態

辞書は初期状態では下記(juman-utf8)がインストールされています。

/var/lib/mecab/dic$ tree -L 1
.
|-- debian -> /etc/alternatives/mecab-dictionary
`-- juman-utf8

IPA辞書(IPADIC)のインストール

IPA辞書(IPADIC)はMeCab公式サイトが推奨している辞書です。
詳細は割愛しますが、この辞書は形態素解析器ChaSen用辞書として作成されましたが、それをMeCab向けに流用したものです。
こちらもインストールします。

$ apt install mecab-ipadic mecab-ipadic-utf8

無事インストールされたことは下記ディレクトリで確認できます。

$ cd /var/lib/mecab/dic 
/var/lib/mecab/dic$ tree -L 1
.
├── debian -> /etc/alternatives/mecab-dictionary
├── ipadic    ★IPA辞書
├── ipadic-utf8 ★IPA辞書(utf-8)
└── juman-utf8

4 directories, 0 files

尚、この時点でデフォルトのシステム辞書はIPA辞書(utf-8)となっています。
下記コマンドで確認できます。

$ sudo update-alternatives --config mecab-dictionary
There are 3 choices for the alternative mecab-dictionary (providing /var/lib/mecab/dic/debian).

  Selection    Path                            Priority   Status
------------------------------------------------------------
* 0            /var/lib/mecab/dic/ipadic-utf8   80        auto mode
  1            /var/lib/mecab/dic/ipadic        70        manual mode
  2            /var/lib/mecab/dic/ipadic-utf8   80        manual mode
  3            /var/lib/mecab/dic/juman-utf8    40        manual mode

Press  to keep the current choice[*], or type selection number:

また、下記の通り-Ohasenオプションでchasen互換フォーマットも出力できるようになりました。

$ mecab -Ochasen
今日のご飯はなにかな
今日	キョウ	今日	名詞-副詞可能		
の	ノ	の	助詞-連体化		
ご飯	ゴハン	ご飯	名詞-一般		
は	ハ	は	助詞-係助詞		
なに	ナニ	なに	名詞-代名詞-一般		
か	カ	か	助詞-副助詞/並立助詞/終助詞		
な	ナ	な	助詞-終助詞

mecab-ipadic-NEologd辞書のインストール

mecab-ipadic-NEologd はMeCab用のシステム辞書の一つです。
Web上のデータを活用し毎週2回のデータ更新によって新しい単語への対応も早いなどおススメの辞書なのでこちらもインストールします。

まず依存ファイルをインストールしておきます。
※ mecab libmecab-dev mecab-ipadic-utf8を事前にインストールしていない場合はそれらも追加

$ sudo apt install git make curl xz-utils file

GitHubレポジトリから下記をGit Cloneします。

$ sudo git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

上記でgit cloneしたフォルダに移動し、下記コマンドでインストールします。

$ cd mecab-ipadic-neologd
$ sudo ./bin/install-mecab-ipadic-neologd -n

途中で下記のようにインストールしますか?と聞かれるので、”yes”と入力するとインストールが始まります。

 :
 :
[install-mecab-ipadic-NEologd] : Do you want to install mecab-ipadic-NEologd? Type yes or no.
 :

最後に下記のコメントが出てきて、使い方を教えてくれます。
MeCabの-dオプションでシステム辞書を指定していますね。

 :
 :
[install-mecab-ipadic-NEologd] : Usage of mecab-ipadic-NEologd is here.
Usage:
    $ mecab -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd ...
 :
 :

ちなみにこれは忘れても下記で確認出来ます。

$ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd

以上で-mecab-ipadic-NEologdのインストールが完了しました。
早速、今は流行りの単語を使って試してみます。
※2020年10月現在、大ヒット映画の「鬼滅の刃」が既に登録されています!

$ mecab -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
鬼滅の刃の映画を見に行った
鬼滅の刃        名詞,固有名詞,一般,*,*,*,鬼滅の刃,キメツノヤイバ,キメツノヤイバ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
映画    名詞,一般,*,*,*,*,映画,エイガ,エイガ
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
行っ    動詞,自立,*,*,五段・カ行促音便,連用タ接続,行く,イッ,イッ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
EOS

出力フォーマットも各種使えますので、具体例を記載します。

  • wakatiフォーマット
  • $ mecab -Owakati -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
    鬼滅の刃の映画を見に行った
    鬼滅の刃 の 映画 を 見 に 行っ た
    EOS
  • Simpleフォーマット
  • $ mecab -Osimple -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
    鬼滅の刃の映画を見に行った
    鬼滅の刃        名詞-固有名詞-一般
    の      助詞-連体化
    映画    名詞-一般
    を      助詞-格助詞-一般
    見      動詞-自立
    に      助詞-格助詞-一般
    行っ    動詞-自立
    た      助動詞
    EOS
  • ChaSenフォーマット
  • $ mecab -Ochasen -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd
    鬼滅の刃の映画を見に行った
    鬼滅の刃        キメツノヤイバ  鬼滅の刃        名詞-固有名詞-一般
    の      ノ      の      助詞-連体化
    映画    エイガ  映画    名詞-一般
    を      ヲ      を      助詞-格助詞-一般
    見      ミ      見る    動詞-自立       一段    連用形
    に      ニ      に      助詞-格助詞-一般
    行っ    イッ    行く    動詞-自立       五段・カ行促音便        連用タ接続
    た      タ      た      助動詞  特殊・タ        基本形
    EOS

以上、Linux(Ubuntu)上でMeCabと辞書をインストールし動作することを確認できました。
次章よりPythonでの使い方について記載します。

Pythonでの使いかた

Pythonバインディングモジュールのインストール

mecab-python3 モジュールを使います。

インストール

pipコマンドでインストールします。

$ pip install mecab-python3

公式リファレンスにあるように、辞書unidic-liteもインストールしておきます。

$ pip install unidic-lite

基本的な使い方

基本的には下記の手順で実行します。

具体的なコード例を以下に示します。

# MeCabモジュールのインポート
import MeCab

# MeCab::Taggerクラスのインスタンスを作成(ここではデフォルト設定)
m = MeCab.Tagger('')

sentence = '鬼滅の刃の映画を見に行った。'

# 日本語文章の解析処理
ma = m.parse(sentence)

# 解析結果を表示
print(ma)

#出力結果
鬼      オニ    オニ    鬼      名詞-普通名詞-一般                      2
滅      メツ    メツ    メツ    記号-一般                       1
の      ノ      ノ      の      助詞-格助詞
刃      ハ      ハ      刃      名詞-普通名詞-一般                      1
の      ノ      ノ      の      助詞-格助詞
映画    エーガ  エイガ  映画    名詞-普通名詞-一般                      0,1
を      オ      ヲ      を      助詞-格助詞
見      ミ      ミル    見る    動詞-非自立可能 上一段-マ行     連用形-一般     1
に      ニ      ニ      に      助詞-格助詞
行っ    イッ    イク    行く    動詞-非自立可能 五段-カ行       連用形-促音便   0
た      タ      タ      た      助動詞  助動詞-タ       終止形-一般
。                      。      補助記号-句点
EOS

ここで下記エラーが出た場合は、mecabrcの場所が正しく設定されていない可能性があります。

error message: [ifs] no such file or directory: /usr/local/etc/mecabrc

この場合は、例えばos.environ を使って下記のように環境変数でmecabrcの位置を設定すると解決する場合があります。

# mecabrcの格納場所を指定
os.environ['MECABRC'] = "/etc/mecabrc"

システム辞書を指定する

システム辞書を指定するには、Tagger()の引数にMeCabコマンドの-dオプションを設定します。
下記に具体的なコード例と結果を記載します。

  • IPA辞書(mecab-ipadic-utf8)を指定した場合
  • # MeCabの-dオプションで辞書の場所を指定
    m = MeCab.Tagger('-d /etc/alternatives/mecab-dictionary')
    
    sentence = '鬼滅の刃の映画を見に行った。'
    ma = m.parse(sentence)
    print(ma)
    
    #出力結果
    鬼      名詞,一般,*,*,*,*,鬼,オニ,オニ
    滅      名詞,一般,*,*,*,*,滅,メツ,メツ
    の      助詞,連体化,*,*,*,*,の,ノ,ノ
    刃      名詞,一般,*,*,*,*,刃,ハ,ハ
    の      助詞,連体化,*,*,*,*,の,ノ,ノ
    映画    名詞,一般,*,*,*,*,映画,エイガ,エイガ
    を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
    見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
    に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
    行っ    動詞,自立,*,*,五段・カ行促音便,連用タ接続,行く,イッ,イッ
    た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
    。      記号,句点,*,*,*,*,。,。,。
    EOS
  • ipadic-neologd辞書を指定した場合
  • # MeCabの-dオプションで辞書の場所を指定
    m = MeCab.Tagger('-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
    
    sentence = '鬼滅の刃の映画を見に行った。'
    ma = m.parse(sentence)
    print(ma)
    
    #出力結果
    鬼滅の刃        名詞,固有名詞,一般,*,*,*,鬼滅の刃,キメツノヤイバ,キメツノヤイバ
    の      助詞,連体化,*,*,*,*,の,ノ,ノ
    映画    名詞,一般,*,*,*,*,映画,エイガ,エイガ
    を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
    見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
    に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
    行っ    動詞,自立,*,*,五段・カ行促音便,連用タ接続,行く,イッ,イッ
    た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
    。      記号,句点,*,*,*,*,。,。,。
    EOS

出力フォーマットの指定

同様に、MeCabの解析結果の出力フォーマットを指定することもできます。
Tagger()の引数に、-Oオプションで指定します。
下記に具体例を挙げます。(辞書はmecab-ipadic-neologdを指定)

  • Simpleフォーマット
  • m = MeCab.Tagger('-Osimple -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
    sentence = '鬼滅の刃の映画を見に行った。'
    ma = m.parse(sentence)
    print(ma)
    
    # 出力結果
    鬼滅の刃        名詞-固有名詞-一般
    の      助詞-連体化
    映画    名詞-一般
    を      助詞-格助詞-一般
    見      動詞-自立
    に      助詞-格助詞-一般
    行っ    動詞-自立
    た      助動詞
    。      記号-句点
    EOS
  • wakatiフォーマット(分かち書き)
  • m = MeCab.Tagger('-Owakati -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
    sentence = '鬼滅の刃の映画を見に行った。'
    ma = m.parse(sentence)
    print(ma)
    
    #出力結果
    鬼滅の刃 の 映画 を 見 に 行っ た 。
  • ChaSen互換フォーマット
  • m = MeCab.Tagger('-Ochasen -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
    sentence = '鬼滅の刃の映画を見に行った。'
    ma = m.parse(sentence)
    print(ma)
    
    #出力結果
    鬼滅の刃        キメツノヤイバ  鬼滅の刃        名詞-固有名詞-一般
    の      ノ      の      助詞-連体化
    映画    エイガ  映画    名詞-一般
    を      ヲ      を      助詞-格助詞-一般
    見      ミ      見る    動詞-自立       一段    連用形
    に      ニ      に      助詞-格助詞-一般
    行っ    イッ    行く    動詞-自立       五段・カ行促音便        連用タ接続
    た      タ      た      助動詞  特殊・タ        基本形
    。      。      。      記号-句点
    EOS

以上で日本語の文章の解析結果を取得できるようになりました。
これらの結果は文字列で得られるので、split()や正規表現等を使って必要な情報を抽出することが出来ます。
参考記事)【Python】split()を使った文字列の分割方法
参考記事)【Python】正規表現 reモジュールの使いかたの基本

ただ、次に述べるParseToNode()を使うと、もっと簡単に解析データを取得することが出来ます。

parseToNode()メソッドで詳細情報を取得

日本語文章の解析処理のところでparseToNode()を使うと、単語の品詞や詳細情報を簡単に取得することが出来ます。

# MeCab::Nodeクラスのインスタンスを生成
>>> node = m.parseToNode(sentence) 

>>> node
<Swig Object of type 'MeCab::Node *' at 0x7f9b24cbf5f0>

生成されたMeCab::Nodeクラスのインスタンスは、形態素解析された要素の「文頭」として取得されます。
属性nextを使って、次の要素を順次呼び出していきます。

次に、下記属性を指定することで単語や品詞を取得することができます。

  • surface: 分割された単語
  • posid: 品詞 (※)
  • feature: 詳細情報

具体的なコード例を示します。

m = MeCab.Tagger('-Ochasen -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
sentence = '鬼滅の刃の映画を見に行った。'

# MeCab::Nodeインスタンスを作成し、「文頭」の要素を取得
node = m.parseToNode(sentence)

while node:
    # 単語、品詞、詳細情報をタブ区切りで表示
    print(f'{node.surface}\t{node.posid}\t{node.feature}')
    # 次の要素を取得
    node = node.next

出力結果は以下です。文頭と文末はそれぞれBOS/EOSとなります。

        0       BOS/EOS,*,*,*,*,*,*,*,*
鬼滅の刃        41      名詞,固有名詞,一般,*,*,*,鬼滅の刃,キメツノヤイバ,キメツノヤイバ
の      24      助詞,連体化,*,*,*,*,の,ノ,ノ
映画    38      名詞,一般,*,*,*,*,映画,エイガ,エイガ
を      13      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      31      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
に      13      助詞,格助詞,一般,*,*,*,に,ニ,ニ
行っ    31      動詞,自立,*,*,五段・カ行促音便,連用タ接続,行く,イッ,イッ
た      25      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      7       記号,句点,*,*,*,*,。,。,。
        0       BOS/EOS,*,*,*,*,*,*,*,*

ここで、posid属性で出力される値(品詞)はファイルpos-id.defで定義されています。
※)mecab-ipadic-neologd辞書の場合、筆者の環境では下記に格納されていました。
/usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd

下記はpos-id.defの内容の一部抜粋です。

その他,間投,*,* 0
  :
記号,句点,*,* 7
  :
助詞,格助詞,一般,* 13
  :
助動詞,*,*,* 25
  :
動詞,自立,*,* 31
  :
名詞,一般,*,* 38
  :

これを用いると、例えば下記のように名詞のみ抜き出すことが可能です。

m = MeCab.Tagger('-Ochasen -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd')
sentence = '鬼滅の刃の映画を見に行った。'
node = m.parseToNode(sentence)

while node:
    # 名詞のみ表示
    if 36 <= node.posid <=67:
        print(node.surface)
    node = node.next

# 出力結果
鬼滅の刃
映画

環境

  • OS: Ubuntu20.04LTS@Windows10 WSL2
  • Python3.9.0

まとめ

日本語の形態素要素解析として有名な、MeCabの使い方についてまとめました。

  • Linux(Ubuntu)へのインストール方法と基本的な使い方、辞書のインストール方法
  • Pythonバインディング(mecab-python3)を使った形態素解析の方法

参考書籍

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project