LoginSignup
3
1

More than 1 year has passed since last update.

Janomeが半角記号を「名詞,サ変接続」と認識するのを変更する

Posted at

はじめに

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の中身を書き換えても実現可能なようです

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1