NEologd の辞書には、映画のタイトルや人名、トレンドのキーワードなど、様々な固有名詞が登録され、日々更新されています。
そこで、それを GiNZAの形態素解析で使ってみようと思い、変換用のプログラムを作りました。
もし私と同じことを考えている方がいらっしゃったら、この記事がお役に立つと思います。
前提知識
この記事を読まれている方は当然、NEologd と GiNZAについて既にご存じだと思いますが、過去の記事でダウンロード方法や使い方などを詳しく紹介していますので、必要に応じてご一読ください。
NEologdとGiNZAにおける辞書項目の対応
両者の辞書フォーマットを比較したところ、以下のように対応付けが出来ました。

単純に NEologdの辞書を1行ずつ読み込んで、GiNAZ(実際はSudachi)の辞書形式に変えて出力してあげれば事が足りそうです。
ただ、少し問題となるのが左接続ID,右接続ID、コストの3点です。
sudachi の 公式ページ では、以下のように推奨されています。

あくまでも推奨なので、NEologdの左文脈ID、右文脈ID、コストをそのまま代入してもよいのですが、一応考慮することにしました。
作成したクラスの解説
今回は、NeoToSudach という名前でクラスを作成しています。
関数にしようかと思ったのですが、左右の接続IDの算出を入れるとメインのソースコードが長くなりそうなので、クラスにしました。
したがって、クラス丸ごとコピペしていただければ使えます。
使い方
クラスのインスタンスを生成し、convメソッドに NEologdの辞書CSVファイルのパスと、変換後のCSVのパスをひきすうとして渡すだけです。
nts = NeoToSudach()
nts.conv('p:/test.csv','p:/res.csv')
ソースコード
以下はクラスのソースコードになります。
左右の接続IDを求めるメソッド(get_lid,get_rid)は、品詞から推奨値を算出してはいますが、NEologdとGiNZAでは微妙に品詞の表現(NEeologdだと「左辺接続」だが、GiNZAでは「左辺可能」と表現)が異なるため、気休め程度に考えておいてください。
もしかすると、わざわざ算出せずそのまま入れた方がよいのかもしれません。
class NeoToSudach:
'''
==================================================
NEologd 辞書CSV⇒ GiNZA(sudachi)辞書CSV変換クラス
==================================================
'''
def conv(self,input_csv,output_csv):
'''
辞書ファイル変換
Parameters
----------
input_csv str: 変換元CSVのパス
output_csv str: 出力先CSVのパス
'''
#出力先の項目を格納するための箱(リスト)を準備
res = ['*' for x in range(18)]
#出力先を書き込みモードでオープン
with open(output_csv,'w',encoding='utf-8') as wf:
#変換元ファイルを参照モードでオープン
with open(input_csv,'r',encoding='utf-8') as rf:
#1行取得
for line in rf:
#処理中の行を表示
print(line)
#カンマで分解
items = line.replace('\n','').split(',')
#出力先の箱に変換元の項目を移送
res[0] = items[0] #見出し(TRIE 用)
res[1] = self.get_lid(items) #左接続ID
res[2] = self.get_rid(items) #右接続ID
res[3] = items[3] #コスト
res[4] = items[0] #見出し(解析結果表示用)
res[5] = items[4] #品詞1
res[6] = items[5] #品詞2
res[7] = items[6] #品詞3
res[8] = '*' #品詞4
res[9] = '*' #品詞(活用型)
res[10] = '*' #品詞(活用形)
res[11] = items[11] #読み
res[12] = items[12] #正規化表現
res[13] = '*' #辞書形ID
res[14] = '*' #分割タイプ
res[15] = '*' #A単位分割情報
res[16] = '*' #B単位分割情報
res[17] = '*' #未使用
#出力先に1行書き込み
wf.write(','.join(res) + '\n')
def get_lid(self,items):
'''
左接続IDを算出する
Parameters:
------------
imte [str] : 項目のリスト
'''
if(items[4] == '名詞' and items[5] == '普通名詞' and items[6] == '一般'):
return '5146'
if(items[4] == '名詞' and items[5][:2] == 'サ変'):
return '5133'
return items[1]
def get_rid(self,items):
'''
右接続IDを算出する
Parameters:
------------
imte [str] : 項目のリスト
'''
if(items[4] == '名詞' and items[5] == '固有名詞' and items[6] == '一般'):
return '4786'
if(items[4] == '名詞' and items[5] == '固有名詞' and items[6] == '人名'):
return '4789'
return items[2]
変換結果のサンプル
変換した結果は次のようになります。

まとめ
NEologd の辞書に登録されている固有名詞はMeCab用なので、GiNZAの形態素解析で使う場合はsudachi の辞書形式に変換しなければなりません。
今回は、NEologd の辞書CSVを sudachi 用の辞書にフォーマット変換するための方法と、自作クラスについて紹介いたしました。
ソースコードにはコメントを入れていますので、あとは皆さんのお好きなように修正していただければと思います。

