Windows環境でMeCabをpython3で使う

2019年12月28日土曜日

python windows 技術系

t f B! P L

環境

  • Windows10 64bit
  • Python3.8 64bit
  • MeCab 0.996 64bit version
  • 書いた日は2019-12-28

MeCab(64bit)のインストール

MeCab 0.996 64bit version

Pythonから扱うので辞書はUTF-8を使用するように選択
デフォルトだとProgram Filesに入れようとしますが、できればc:\dev\mecab64c:\usr\mecab64などスペースの入らないディレクトリしたほうがいいです

試しに使ってみる

辞書がUTF-8なのでcp932だと文字化けします

コマンドプロンプトからmecabを起動して文字列を入力してみる

chcp 65001

C:\usr\MeCab64>bin\mecab.exe
吾輩は猫である
EOS

だめです

echoを使ってパイプで渡すとコマンドプロンプト環境でも動いた

chcp 65001

C:\usr\MeCab64>echo 吾輩は猫である | bin\mecab.exe
吾輩    名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
猫      名詞,一般,*,*,*,*,猫,ネコ,ネコ
で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
EOS

gitbashなどUTF-8を扱える環境だと普通にmecabを起動して使える

boku@hihi MINGW64 /c/usr/MeCab64
$ bin/mecab
吾輩は猫である
吾輩    名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
猫      名詞,一般,*,*,*,*,猫,ネコ,ネコ
で      助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある    助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル
EOS

PythonからMeCabを使えるようにする

pip install mecab

Pythonから試しに使ってみる

import MeCab

tagger = MeCab.Tagger()

text = 'こんな夢を見た。'
parsed = tagger.parse(text)
print(parsed)

print('----------')

node = tagger.parseToNode(text)
while node:
    print(node.surface, node.feature)
    node = node.next
こんな 連体詞,*,*,*,*,*,こんな,コンナ,コンナ
夢   名詞,一般,*,*,*,*,夢,ユメ,ユメ
を   助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見   動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。   記号,句点,*,*,*,*,。,。,。
EOS

----------
 BOS/EOS,*,*,*,*,*,*,*,*
こんな 連体詞,*,*,*,*,*,こんな,コンナ,コンナ
夢 名詞,一般,*,*,*,*,夢,ユメ,ユメ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見 動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
 BOS/EOS,*,*,*,*,*,*,*,*

mecab-ipadic-NEologd導入

WindowsでNEologd辞書を比較的簡単に入れる方法を参考にUTF-8辞書を作成して適当なディレクトリに配置する

試してみる

-uで使用する辞書を指定する

C:\usr\MeCab64>echo 吾輩は猫である | bin\mecab.exe -u dic\NEologd.20190829-u.dic
吾輩は猫である  名詞,固有名詞,一般,*,*,*,吾輩は猫である,ワガハイハネコデアル,ワ ガハイワネコデアル
EOS

NEologdをPythonから使う

import MeCab


text = '南阿蘇水の生まれる里白水高原駅'

tagger = MeCab.Tagger()
parsed = tagger.parse(text)
print(parsed)

tagger = MeCab.Tagger('-u c:/usr/MeCab64/dic/NEologd.20190829-u.dic')
parsed = tagger.parse(text)
print(parsed)
南   名詞,一般,*,*,*,*,南,ミナミ,ミナミ
阿蘇  名詞,固有名詞,地域,一般,*,*,阿蘇,アソ,アソ
水   名詞,接尾,一般,*,*,*,水,スイ,スイ
の   助詞,格助詞,一般,*,*,*,の,ノ,ノ
生まれる    動詞,自立,*,*,一段,基本形,生まれる,ウマレル,ウマレル
里   名詞,一般,*,*,*,*,里,サト,サト
白水  名詞,一般,*,*,*,*,白水,シロミズ,シロミズ
高原  名詞,固有名詞,地域,一般,*,*,高原,タカハル,タカハル
駅   名詞,接尾,地域,*,*,*,駅,エキ,エキ
EOS

南阿蘇水の生まれる里白水高原駅 名詞,固有名詞,一般,*,*,*,南阿蘇水の生まれる里白水高原駅,ミナミアソミズノウマレルサトハクスイコウゲンエキ,ミナミアソミズノウマレルサトハクスイコウゲンエキ
EOS

前半が普通のMecab
後半がNEologd
有名な駅をちゃんと知っててえらい

詰まった話

Taggerにスペースの入った引数を渡す方法がわからない

tagger = MeCab.Tagger('-u c:/space dir/MeCab/dic/NEologd.20190829-u.dic')
tagger = MeCab.Tagger('-u "c:/space dir/MeCab/dic/NEologd.20190829-u.dic"')

書き方これぐらいしか思いつかないけどどちらもRuntimeErrorと言われて動かない
なのでスペースの入ってないディレクトリを使うようにする

QooQ