GiNZA入門 (3) - ユーザー辞書
「GiNZA」のユーザー辞書を追加する方法をまとめました。
・GiNZA 4.0.5
前回
1. GiNZA のインストール
(1) 「Google Colab」で以下のコマンドを実行。
!pip install -U ginza
(2) メニュー「ランタイム → ランタイムを再起動」で「Google Colab」を再起動。
2. 追加する単語の確認
今回は、「となりのトトロ」という単語をユーザー辞書に追加します。デフォルト辞書では未対応であることを確認します。
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('となりのトトロが好き')
# 形態素分割
for sent in doc.sents:
for token in sent:
print(token)
となり
の
トトロ
が
好き
3. ユーザー辞書の作成
ユーザー辞書のCSVを作成して、「Goolge Colab」にアップロードします。
・/content/user_dic.csv
となりのトトロ,4786,4786,5000,となりのトトロ,名詞,固有名詞,一般,*,*,*,トナリノトトロ,となりのトトロ,*,*,*,*,*
辞書の書式は、次のとおりです。
見出し, 左連接ID, 右連接ID, コスト, 見出し, 品詞1, 品詞2, 品詞3, 品詞4, 品詞 (活用型), 品詞 (活用形), 読み, 正規化表記, 辞書形ID, 分割タイプ, A単位分割情報, B単位分割情報, 未使用
詳しくは、以下で確認できます。「GiNZA」の形態素解析は「SudachiPy」を使っているので、辞書の仕様は「Sudachi」と同じになります。
4. ユーザー辞書のビルド
ユーザー辞書のビルドを行います。
!sudachipy ubuild \
-s /usr/local/lib/python3.7/dist-packages/sudachidict_core/resources/system.dic \
user_dic.csv
Pythonパッケージのパス下の「sudachidict_core/resources/system.dic」を指定します。成功すると、「user.dic」が生成されます。
Pythonパッケージのパスの調べ方は、次のとおり。
import sys
import pprint
pprint.pprint(sys.path)
5. 設定ファイルへのユーザ辞書の追加
SudachiPyの設定ファイルにユーザ辞書の設定を追加します。SudachiPyの設定ファイルは、Pythonパッケージのパス下の「sudachipy/resources/sudachi.json」にあります。
・/usr/local/lib/python3.7/dist-packages/sudachipy/resources/sudachi.json
{
"characterDefinitionFile" : "char.def",
"userDict" : ["/content/user.dic"], ← ユーザー辞書の設定の追加
"inputTextPlugin" : [
:
6. 追加した単語の確認
ユーザー辞書で対応できたことを確認します。
import spacy
nlp = spacy.load('ja_ginza')
doc = nlp('となりのトトロが好き')
# 形態素分割
for sent in doc.sents:
for token in sent:
print(token)
となりのトトロ
が
好き
【おまけ】 ユーザー辞書の設定追加スクリプト
import sys
import os
# システム辞書のパス
sys_dic_path = ''
for path in sys.path:
path = path+'/sudachidict_core/resources/system.dic'
if os.path.exists(path):
sys_dic_path = path
break
print('sys_dic_path:', sys_dic_path)
# ユーザー辞書のパス
user_dic_path = os.getcwd()+'/user.dic'
print('user_dic_path:', user_dic_path)
# sudahci.jsonのパス
sudachi_path = None
for path in sys.path:
path = path+'/sudachipy/resources/sudachi.json'
if os.path.exists(path):
sudachi_path = path
break
print('sudachi_path:', sudachi_path)
# userDictの追加
if sudachi_path != None:
lines = []
with open(sudachi_path) as f:
lines = f.readlines()
for i in range(len(lines)-1):
if lines[i].find('"characterDefinitionFile"') >= 0 and lines[i+1].find('"userDict"') < 0:
lines.insert(i+1,' "userDict" : ["'+user_dic_path+'"],\n')
with open(sudachi_path, 'w', encoding='utf-8', newline='\n') as f:
f.writelines(lines)
print('update')
break