#はじめに
数週間前から自然言語処理に携わっており、これまでRとMeCabを用いることが多かったが、最近pythonのGiNZAが自然言語処理の優れたツールだと聞いて移行中。
まずは辞書にない単語を追加する必要があったので流れをまとめてみました。
#環境
- Ubuntu 16.04
- Python 3.6 (pyenv/anacondaの仮想環境)
- GiNZA 2.2.0
#0. GiNZAのインストール
pipコマンドで簡単にインストール出来ます。
$ pip install "https://github.com/megagonlabs/ginza/releases/download/latest/ginza-latest.tar.gz"
#1. 辞書を用意する
GiNZAの形態素解析には「SudachiPy」を動かしているようです。よって単語の追加は、基本的には「Sudachi」のユーザ辞書への追加方法と同じです。
まずはじめにcsvファイルで辞書を用意します。辞書のフォーマットは
見出し,左連接ID,右連接ID,コスト,見出し,品詞1,2,3,4,品詞(活用型),品詞(活用形),読み,正規化表記,辞書形ID,分割タイプ,A単位分割情報,B単位分割情報,未使用
の順で並べます。
$ vim add_term.csv
アナと雪の女王,4786,4786,5000,アナと雪の女王,名詞,固有名詞,一般,*,*,*,アナトユキノジョオウ,アナと雪の女王,*,*,*,*,*
各項目についてはこちらに詳しく書いてありますが、今回は推奨されているIDとコストを割り当てました。不要な項目は「*」を入力してください。上記サイトに例が掲載されているのでそちらから近いものを選択すれば良いと思います。
※csvファイルは「UTF-8」で作成します。
#2. 辞書を作成する
GiNZAをインストールした際にSudachiPyもインストールされているので、sudachipyコマンドを用いて辞書をビルドします。コマンドはsudachipy ubuild -s [システム辞書のパス] [作成したcsvファイルのパス]
です。
$ sudachipy ubuild \
-s .pyenv/versions/anaconda3-5.2.0/envs/ginza/lib/python3.6/site-packages/sudachidict/resources/system.dic \
add_term.csv
筆者はpyenvで環境構築しているためパスが長いですが、自分の環境にあわせて変更してください。実行すると以下のようなメッセージが表示されます。
reading the source file...2 words
writing the POS table...2 bytes
writing the connection matrix...4 bytes
building the trie...done
writing the trie...1028 bytes
writing the word-ID table...14 bytes
writing the word parameters...16 bytes
writing the word_infos...96 bytes
writing word_info offsets...8 bytes
成功するとカレントディレクトリに「user.dic」が追加されます。
#3. SudachiPyの設定ファイルに作成したユーザ辞書を追加する
生成されたuser.dicのパスを追加します。設定ファイルの以下の箇所にパスを追記してください。
$ vim ./pyenv/versions/anaconda3-5.2.0/envs/ginza/lib/python3.6/site-packages/sudachipy/resources/sudachi.json
{
"characterDefinitionFile" : "char.def"
"userDict" : ["user.dicのパス"] #ここにuser.dicのパスを追記してください
"inputTextPlugin" : [
...
...
#動作確認
- コマンドラインから確認する
GiNZAインストール時にSudachiPyがインストールされているので、それを利用します。
$ sudachipy
#追加前
アナと雪の女王
アナ 名詞,普通名詞,一般,*,*,* アナ
と 助詞,格助詞,*,*,*,* と
雪 名詞,普通名詞,一般,*,*,* 雪
の 助詞,格助詞,*,*,*,* の
女王 名詞,普通名詞,一般,*,*,* 女王
EOS
#追加後
アナと雪の女王
アナと雪の女王 名詞,固有名詞,一般,*,*,* アナと雪の女王
EOS
- pythonのGiNZAで使用する
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('アナと雪の女王を観に行きたい')
for sent in doc.sents:
for token in sent:
print(token.orth_)
実行結果
アナと雪の女王
を
観
に
行き
たい
正しく形態素に分割できました!
#結論
GiNZAの形態素解析には中でSudachiPyを使っているということもあり、筆者としてはMeCabの単語追加よりも簡単だった気がします。もし間違っている点などありましたらご指摘をいただけますと幸いです。
#参考サイト