前回、Python3で形態素解析を行えるツールの「JUMAN++」のインストールを行なったので比較として「MeCab」の「mecab-ipadic-neologd」を利用した形態素解析を行なってみます。
NEologdは、Web上から得た新語に対応したシステム辞書です。
新語に非常に強く、番組名やタレントなどの情報も更新が早いです。
また、辞書の更新も毎月行われており非常に早いです。
環境はpython3.6をCentOS7の環境で実施しています。
インストールの準備
Groongaリポジトリを設定しておけばyumコマンドで入るので楽チンです。
Groongaリポジトリを導入
1 2 3 4 |
# rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm # yum -y makecache |
Mecab本体+その他諸々のインストール
1 2 3 4 5 |
# yum -y install mecab mecab-ipadic # yum -y install mecab-devel # pip install mecab-python3 |
mecab-ipadic-neologdのインストール
さて、ここからが今回の本番です。
1 2 3 4 5 6 7 8 |
# cd /usr/local/src # git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git # cd mecab-ipadic-neologd # ./bin/install-mecab-ipadic-neologd -n # mecab -d /usr/lib64/mecab/dic/mecab-ipadic-neologd/ |
こちらで無事インストールは完了です。
それではプログラムを作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 |
import MeCab mecab = MeCab.Tagger ('-d /usr/lib64/mecab/dic/mecab-ipadic-neologd/') text1 = '外国人参政権' text2 = '私もあさって日曜最終日' text3 = 'ペンパイナッポーアッポーペン' print(mecab.parse(text1)) print(mecab.parse(text2)) print(mecab.parse(text3)) |
この辺は前回のJUMAN++の比較も兼ねて実施しています。
それでは実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# python3.6 test.py 外国人参政権 名詞,固有名詞,一般,*,*,*,外国人参政権,ガイコクジンサンセイケン,ガイコクジンサンセイケン EOS 私 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ も 助詞,係助詞,*,*,*,*,も,モ,モ あさっ 動詞,自立,*,*,五段・ラ行,連用タ接続,あさる,アサッ,アサッ て 助詞,接続助詞,*,*,*,*,て,テ,テ 日曜 名詞,副詞可能,*,*,*,*,日曜,ニチヨウ,ニチヨー 最終日 名詞,固有名詞,一般,*,*,*,最終日,サイシュウビ,サイシュービ EOS ペンパイナッポーアッポーペン 名詞,固有名詞,一般,*,*,*,Pen-Pineapple-Apple-Pen,ペンパイナッポーアッポーペン,ペンパイナッポーアッポーペン EOS |
最初の二つのtextはJUMAN++の結果と大きく変わっています。
以下がJUMAN++の結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
% cat sample.txt | jumanpp 外国 がいこく 外国 名詞 6 普通名詞 1 * 0 * 0 "代表表記:外国/がいこく カテゴリ:場所-その他 ドメイン:政治" 人 じん 人 名詞 6 普通名詞 1 * 0 * 0 "代表表記:人/じん 漢字読み:音 カテゴリ:人" @ 人 ひと 人 名詞 6 普通名詞 1 * 0 * 0 "代表表記:人/ひと 漢字読み:訓 カテゴリ:人" 参政 さんせい 参政 名詞 6 サ変名詞 2 * 0 * 0 "代表表記:参政/さんせい カテゴリ:抽象物 ドメイン:政治" 権 けん 権 名詞 6 普通名詞 1 * 0 * 0 "代表表記:権/けん 漢字読み:音 カテゴリ:抽象物" EOS 私 わたし 私 名詞 6 普通名詞 1 * 0 * 0 "代表表記:私/わたし 漢字読み:訓 カテゴリ:人" も も も 助詞 9 副助詞 2 * 0 * 0 NIL あさって あさって あさって 名詞 6 時相名詞 10 * 0 * 0 "代表表記:明後日/あさって カテゴリ:時間" 日曜 にちよう 日曜 名詞 6 時相名詞 10 * 0 * 0 "代表表記:日曜/にちよう カテゴリ:時間" 最終 さいしゅう 最終だ 形容詞 3 * 0 ナノ形容詞 22 語幹 1 "代表表記:最終だ/さいしゅうだ 反義:形容詞:最初だ/さいしょだ" 日 ひ 日 名詞 6 時相名詞 10 * 0 * 0 "代表表記:日/ひ 漢字読み:訓 弱時相名詞 カテゴリ:時間" @ 日 にち 日 名詞 6 時相名詞 10 * 0 * 0 "代表表記:日/にち 漢字読み:音 カテゴリ:時間" EOS |
外国人参政権は固有名詞として辞書登録がされているので分割されないようです。
二つ目のテキスト(私もあさって日曜最終日)では「あさって」が分割されているところが特徴でしょうか。
こちらはややJUMAN++の方が文章としては強いっぽいイメージもあります。
ただ、三つ目のテキスト(ペンパイナッポーアッポーペン)が固有名詞として登録されているのはmecab-ipadic-neologdの強さとなります。
完全に使いどころではありますが、比較として確認してみました。
pythonで利用する時のオプション設定
mecabでは出力モードの設定ができます。
ChaSen 互換形式
「-Ochasen」でChaSen 互換形式になります。
サンプルは以下になります。
1 2 3 4 5 6 7 8 9 |
import MeCab mecab = MeCab.Tagger ('-Ochasen -d /usr/lib64/mecab/dic/mecab-ipadic-neologd/') text = '私もあさって日曜最終日' print(mecab.parse(text)) |
結果は以下になります。
1 2 3 4 5 6 7 8 9 10 |
$ python3.6 sample.py 私 ワタシ 私 名詞-代名詞-一般 も モ も 助詞-係助詞 あさっ アサッ あさる 動詞-自立 五段・ラ行 連用タ接続 て テ て 助詞-接続助詞 日曜 ニチヨウ 日曜 名詞-副詞可能 最終日 サイシュウビ 最終日 名詞-固有名詞-一般 EOS |
分かち書きのみを出力
「-Owakati」で分かち書きのみを出力します。
サンプルは以下になります。
1 2 3 4 5 6 7 8 9 |
import MeCab mecab = MeCab.Tagger ('-Owakati -d /usr/lib64/mecab/dic/mecab-ipadic-neologd/') text = '私もあさって日曜最終日' print(mecab.parse(text)) |
結果は以下になります。
1 2 3 4 |
$ python3.6 sample.py 私 も あさっ て 日曜 最終日 |
読みのみを出力
「-Oyomi」で読みのみを出力します。
サンプルは以下になります。
1 2 3 4 5 6 7 8 9 |
import MeCab mecab = MeCab.Tagger ('-Oyomi -d /usr/lib64/mecab/dic/mecab-ipadic-neologd/') text = '私もあさって日曜最終日' print(mecab.parse(text)) |
結果は以下になります。
1 2 3 4 |
$ python3.6 sample.py ワタシモアサッテニチヨウサイシュウビ |
品詞によって分ける
使い方どころは色々あります
品詞など見ながらの抽出などはよくやります。
例えば以下のように記号(句読点なども)を取り除いて文書の解析など実施できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import MeCab mecab = MeCab.Tagger ('-Ochasen -d /usr/lib64/mecab/dic/mecab-ipadic-neologd/') text = '私もあさって、日曜最終日なのに出勤です。' word_list = mecab.parse(text).split('\n') for word in word_list: split_word_list = word.split('\t') if len(split_word_list) > 5 and not "記号" in split_word_list[3]: print(split_word_list) |
結果は以下になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ python3.6 sample.py ['私', 'ワタシ', '私', '名詞-代名詞-一般', '', ''] ['も', 'モ', 'も', '助詞-係助詞', '', ''] ['あさっ', 'アサッ', 'あさる', '動詞-自立', '五段・ラ行', '連用タ接続'] ['て', 'テ', 'て', '助詞-接続助詞', '', ''] ['日曜', 'ニチヨウ', '日曜', '名詞-副詞可能', '', ''] ['最終日', 'サイシュウビ', '最終日', '名詞-固有名詞-一般', '', ''] ['な', 'ナ', 'だ', '助動詞', '特殊・ダ', '体言接続'] ['のに', 'ノニ', 'のに', '助詞-接続助詞', '', ''] ['出勤', 'シュッキン', '出勤', '名詞-サ変接続', '', ''] ['です', 'デス', 'です', '助動詞', '特殊・デス', '基本形'] |
このブログは株式会社CoLabMixによる技術ブログです。
GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。
Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。
開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。
お問い合わせやご依頼・ご相談など