Open4

形態素解析関連

schnellschnell

形態素解析ツール一覧

  • mecab
    処理が早い

  • janome
    遅いがpythonのみで書かれた辞書内包の形態素解析器なのでインストールが楽

  • juman++
    処理が遅いが分割がかなり正確、口語的な表現に強い印象

schnellschnell

Mecab + NEologdのインストール

macの場合

mecab本体と辞書をインストール

brew install mecab
brew install mecab-ipadic

pythonラッパーをインストール

pip install mecab-python3

NEologdをインストール
-n は辞書の更新用コマンドなので定期的に実行して更新してください(週2回更新しているらしい)

git clone --depth 1 git@github.com:neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n

出力が沢山出てきますが、最後の方は以下のようになると思いますので、インストール先のパスを確認してください。

[install-mecab-ipadic-NEologd] : Install completed.
[install-mecab-ipadic-NEologd] : When you use MeCab, you can set '/opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd' as a value of '-d' option of MeCab.
[install-mecab-ipadic-NEologd] : Usage of mecab-ipadic-NEologd is here.
Usage:
    $ mecab -d /opt/homebrew/lib/mecab/dic/mecab-ipadic-neologd ...

[install-mecab-ipadic-NEologd] : Finish..
[install-mecab-ipadic-NEologd] : Finish..

NEologdを利用するには-d /usr/local/lib/mecab/dic/mecab-ipadic-neologdをオプションに指定する必要あり。パスは環境によって変わります。

NEologdを使用することで新語をまとまりとして捉えることが可能になる

echo "鬼滅の刃" | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
鬼滅の刃        名詞,固有名詞,一般,*,*,*,鬼滅の刃,キメツノヤイバ,キメツノヤイバ
EOS

echo "鬼滅の刃" | mecab                                                 
鬼      名詞,一般,*,*,*,*,鬼,オニ,オニ
滅      名詞,一般,*,*,*,*,滅,メツ,メツ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
刃      名詞,一般,*,*,*,*,刃,ハ,ハ
EOS

Pythonからの呼び出し方法

import MeCab

m_t = MeCab.Tagger('-Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
def tokenizer_mecab_neologd(text):
  text = m_t.parse(text)
  return text.strip().split()

result = tokenizer_mecab_neologd("今日は鬼滅の刃の映画を見に行きました。")
print(result)

----------出力結果----------
['今日', 'は', '鬼滅の刃', 'の', '映画', 'を', '見', 'に', '行き', 'まし', 'た', '。']

大規模コーパスの前処理の際はpythonの実行速度がボトルネックになると思われるので、シェルスクリプトを書いてgnu parallelあたりで並列処理してしまうのがおすすめ

schnellschnell

Juman++のインストール

JUMANの後継
辞書がipadic系とは異なるjuman辞書を採用しており、所謂学校文法とは少し異なる単語の区分分けがされている。

macの場合

パッケージ管理ツールでのインストールができないのでソースコードをダウンロードして手元の環境でビルドするという戦略になります。

ビルド用のツールをインストール

brew install zlib
brew install cmake
brew install wget

ソースをダウンロードしてビルド
-DCMAKE_INSTALL_PREFIXにはインストール先を指定する。デフォルトだと/usr/localだと思うけど他のツールとの兼ね合いでアンインストールが面倒になるのでjuman++用のディレクトリを作ってシンボリックリンクを貼るのがおすすめ。
getconf _NPROCESSORS_ONLNはプロセスが使用可能なコアの数を調べるコマンド、Linux系OSのnprocの代替です。-j フラグ指定された数分の並列ビルドが行われます。
最後のブロックで/usr/local/jumanppいかに保存されたファイルに/usr/local以下へシンボリックリンクを貼っています。

wget "https://github.com/ku-nlp/jumanpp/releases/download/v2.0.0-rc3/jumanpp-2.0.0-rc3.tar.xz"
tar xvJf jumanpp-2.0.0-rc3.tar.xz

cd jumanpp-2.0.0-rc3
mkdir bld && cd bld
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/jumanpp
sudo make install -j $(getconf _NPROCESSORS_ONLN)

# 作成した3つのファイルのリンクをパスの通った環境へ配置します
find /usr/local/jumanpp -type d | sed -e "s/\/usr\/local\/jumanpp/\/usr\/local/" | xargs -I{} sudo mkdir {}
src=(`find /usr/local/jumanpp -type f`)
tgt=(`find /usr/local/jumanpp -type f | sed -e "s/\/usr\/local\/jumanpp/\/usr\/local/"`)
for i in {1..${#tgt[@]}}; do
  sudo ln -s ${src[i]} ${tgt[i]}
done

アンインストールするときは

sudo rm -rf /usr/local/jumanpp
find -L /usr/local -type l | xargs -I{} sudo unlink {}

ただこれだと/usr/local以下の壊れたリンクを全て削除してしまうので少し余計。。。

knpのインストール

ビルド用ツールをインストール

brew install libtool automake autoconf
# libtoolizeがglibtoolizeとしてインストールされるのでパスを通す
ln -s /usr/local/bin/glibtoolize /usr/local/bin/libtoolize
git clone git@github.com:ku-nlp/knp.git
cd knp
./autogen.sh

# 辞書をインストール
wget http://lotus.kuee.kyoto-u.ac.jp/nl-resource/knp/dict/latest/knp-dict-latest-bin.zip
unzip knp-dict-latest-bin.zip
ln -s `pwd`/dict-bin/* dict/
ln -s `pwd`/dict-bin/auto/* dict/auto/
ln -s `pwd`/dict-bin/distsim/* dict/distsim/
ln -s `pwd`/dict-bin/ebcf/* dict/ebcf/

./configure # --prefix="インストール先"

schnellschnell

janome

インストール

pythonのみで辞書も同梱されているのでpipで一発インストール可能

pip install janome

使い方

分かち書きの場合について記します。

import janome.tokenizer

j_t = janome.tokenizer.Tokenizer()
def tokenizer_janome(text):
  return [tok for tok in j_t.tokenize(text, wakati=True)]

result = tokenizer_janome("今日は鬼滅の刃の映画を見に行きました。")
print(result)

----------出力結果----------
['今日', 'は', '鬼', '滅', 'の', '刃', 'の', '映画', 'を', '見', 'に', '行き', 'まし', 'た', '。']