はじめに
MeCabと同様、Janomeでも半角文字を形態素解析すると「名詞,サ変接続」と予測される(ややこしい)仕様が存在します。
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
for t in tokenizer.tokenize("/"):
print(t.surface, t.part_of_speech)
#=> / 名詞,サ変接続,*,*
MeCabの場合は辞書を書き換えてインストールし直す必要があります。
しかし、JanomeはPythonだけで書かれているのでPythonのコード上でなんとかすることができます。
# バージョン
janome==0.4.2
Pythonのコード上で変更する方法
tokenizerを呼び出した後、以下のように未知語に対する辞書の設定を呼び出すことができます。
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
tokenizer.sys_dic.unknowns
#=>
{'DEFAULT': [(5, 5, 4769, '記号,一般,*,*')],
'SPACE': [(9, 9, 8903, '記号,空白,*,*')],
'KANJI': [(1285, 1285, 11426, '名詞,一般,*,*'),
(1283, 1283, 17290, '名詞,サ変接続,*,*'),
(1293, 1293, 17611, '名詞,固有名詞,地域,一般'),
(1292, 1292, 12649, '名詞,固有名詞,組織,*'),
(1289, 1289, 17340, '名詞,固有名詞,人名,一般'),
(1288, 1288, 15295, '名詞,固有名詞,一般,*')],
'SYMBOL': [(1283, 1283, 17585, '名詞,サ変接続,*,*')],
'NUMERIC': [(1295, 1295, 27386, '名詞,数,*,*')],
'ALPHA': [(1285, 1285, 13398, '名詞,一般,*,*'),
(1293, 1293, 18706, '名詞,固有名詞,地域,一般'),
(1292, 1292, 13835, '名詞,固有名詞,組織,*'),
(1289, 1289, 18188, '名詞,固有名詞,人名,一般'),
(1288, 1288, 15673, '名詞,固有名詞,一般,*'),
(3, 3, 15235, '感動詞,*,*,*')],
'HIRAGANA': [(1285, 1285, 13069, '名詞,一般,*,*'),
(1283, 1283, 20223, '名詞,サ変接続,*,*'),
(1293, 1293, 17882, '名詞,固有名詞,地域,一般'),
(1292, 1292, 14761, '名詞,固有名詞,組織,*'),
(1289, 1289, 18060, '名詞,固有名詞,人名,一般'),
(1288, 1288, 14787, '名詞,固有名詞,一般,*'),
(3, 3, 16989, '感動詞,*,*,*')],
'KATAKANA': [(1285, 1285, 9461, '名詞,一般,*,*'),
(1293, 1293, 13661, '名詞,固有名詞,地域,一般'),
(1292, 1292, 10922, '名詞,固有名詞,組織,*'),
(1289, 1289, 13581, '名詞,固有名詞,人名,一般'),
(1288, 1288, 10521, '名詞,固有名詞,一般,*'),
(3, 3, 14138, '感動詞,*,*,*')],
'KANJINUMERIC': [(1295, 1295, 27473, '名詞,数,*,*')],
'GREEK': [(1285, 1285, 7884, '名詞,一般,*,*'),
(1293, 1293, 12681, '名詞,固有名詞,地域,一般'),
(1292, 1292, 8573, '名詞,固有名詞,組織,*'),
(1289, 1289, 12697, '名詞,固有名詞,人名,一般'),
(1288, 1288, 10029, '名詞,固有名詞,一般,*')],
'CYRILLIC': [(1285, 1285, 7966, '名詞,一般,*,*'),
(1293, 1293, 12600, '名詞,固有名詞,地域,一般'),
(1292, 1292, 8492, '名詞,固有名詞,組織,*'),
(1289, 1289, 12615, '名詞,固有名詞,人名,一般'),
(1288, 1288, 9866, '名詞,固有名詞,一般,*')]}
この'SYMBOL': [(1283, 1283, 17585, '名詞,サ変接続,*,*')]
の部分を書き換えてしまえば目的は達成です。
symbol_settings = list(tokenizer.sys_dic.unknowns["SYMBOL"][0])
symbol_settings[3] = "記号,一般,*,*"
tokenizer.sys_dic.unknowns["SYMBOL"][0] = symbol_settings
この結果、形態素解析の結果が変更されます。
tokenizer = Tokenizer()
for t in tokenizer.tokenize("/"):
print(t.surface, t.part_of_speech)
#=> / 記号,一般,*,*
ちなみにunknowns
の定義場所は以下
辞書のファイルを変更する方法
のイシューで言及されているように、以下のzipファイルを解凍してsysdic/unknowns.py
の中身を書き換えても実現可能なようです