😸

Jagger 形態素解析向けにユーザ定義単語を追加するメモ

2024/03/11に公開

背景

高速形態素解析 Jagger の Python binding のメモ
https://zenn.dev/syoyo/articles/9ac920632ba5c9

人類史上最速の形態素解析 Jagger.

Jagger で, 絵文字や顔文字などの単語をうまく形態素解析で扱いたい.
Jagger のデフォで使っている mecab-jumandic 7.0-2013 辞書では, 一応顔文字はあるが,

!(^^)!,1873,1873,4694,特殊,記号,*,*,!(^^)!,!(^^)!,顔文字
!( ̄∇ ̄ ;),1873,1873,4694,特殊,記号,*,*,!( ̄∇ ̄ ;),!( ̄∇ ̄ ;),顔文字
!(∂▼∂)!,1873,1873,4694,特殊,記号,*,*,!(∂▼∂)!,!(∂▼∂)!,顔文字
!Σ( ̄□ ̄;,1873,1873,4694,特殊,記号,*,*,!Σ( ̄□ ̄;,!Σ( ̄□ ̄;,顔文字
!Σ( ̄□ ̄;),1873,1873,4694,特殊,記号,*,*,!Σ( ̄□ ̄;),!Σ( ̄□ ̄;),顔文字

と, 古臭い顔文字(昭和時代?)しかない...

あと, 顔文字は一緒くたに記号(顔文字)となっていて, 分類がない(文章解析で, 顔文字の分類, たとえば笑い, 悲しみ, etc などほしいときがある)

ʕ •ᴥ• ʔ みたいな, ナウでヤングな令和時代の若人さまが使うような, UTF-8 顔文字も対応したい...
(最近の iPhone でも結構ナウい顔文字でてくる!)

ユーザ定義単語を辞書に追加して学習します!

kaomoji

いくつか一覧取得できるのありますが,

https://kaomoji.ru/en/

が分類もあり, とりあえずは楽でしょうか.

emoji

Python emoji module で一覧取得できます.

ユーザ定義単語リスト作成

https://github.com/lighttransport/jagger-python/tree/main/data

にスクリプトとデータがあります.

* ^ ω ^),*,*,*,顔文字,楽しい,Joy,Positive Emotion,*,*,(* ^ ω ^),(* ^ ω ^),顔文字
(´ ∀ ` *),*,*,*,顔文字,楽しい,Joy,Positive Emotion,*,*,(´ ∀ ` *),(´ ∀ ` *),顔文字
٩(◕‿◕。)۶,*,*,*,顔文字,楽しい,Joy,Positive Emotion,*,*,٩(◕‿◕。)۶,٩(◕‿◕。)۶,顔文字
☆*:.。.o(≧▽≦)o.。.:*☆,*,*,*,顔文字,楽しい,Joy,Positive Emotion,*,*,☆*:.。.o(≧▽≦)o.。.:*☆,☆*:.。.o(≧▽≦)o.。.:*☆,顔文>字

のようなユーザ定義単語リスト行データをつくればよいです!

quote

いくつかの顔文字は , を含んでいるので, , を含んでいる顔文字は, CSV のカンマと区別するために " で quote しておきましょう.
(チェックしたかぎりでは, , を使う顔文字は, " を含んではいなかったので, quote を安全にできる)
jagger_train 側で CSV リード時に '"' を考慮した対応がされています.

train

Jagger には, ユーザー定義単語を既存 Jagger 辞書に追加するみたいな機能はありません.
ユーザー定義単語を追加したい場合, Jagger 辞書を作りなおす必要があります
(作りなおし(train)自体は数秒で終わるので, 学習用データが揃っていれば, あまり手間ではない)

train は jagger オリジナルのサイトを参照ください.
(jagger python でも学習できるようにはしようとしているが, python binding はまだ)

https://www.tkl.iis.u-tokyo.ac.jp/~ynaga/jagger/index.ja.html

ユーザ定義単語は dict(辞書(vocab リスト)) にくっつけるだけでよいです.

コーパスは, 今回は jagger デフォの KWDLC を使いました.
コーパス側には, ユーザ定義単語を利用した形態素解析データを追加する必要はありません
(コーパス側で未知の単語になっていてもよい)

結果

我輩は猫であるにゃん🤩
我輩	名詞,普通名詞,*,*,我輩,わがはい,代表表記:我が輩/わがはい カテゴリ:人
は	助詞,副助詞,*,*,は,は,*
猫	名詞,普通名詞,*,*,猫,ねこ,*
である	判定詞,*,判定詞,デアル列基本形,だ,である,*
にゃん	名詞,普通名詞,*,*,にゃん,にゃん,自動獲得:テキスト 意味分類:普通名詞その他:0.512;人:0.488
🤩	絵文字,*,*,*,*,*,🤩,🤩,絵文字
EOS
ฅ(•ㅅ•❀)ฅ
ฅ(•ㅅ•❀)ฅ	顔文字,猫,Cat,Animals,*,*,ฅ(•ㅅ•❀)ฅ,ฅ(•ㅅ•❀)ฅ,顔文字
EOS
ʕ •ᴥ• ʔ
ʕ •ᴥ• ʔ	顔文字,熊,Bear,Animals,*,*,ʕ •ᴥ• ʔ,ʕ •ᴥ• ʔ,顔文字
EOS
我輩はʕ •ᴥ• ʔである
我輩	名詞,普通名詞,*,*,我輩,わがはい,代表表記:我が輩/わがはい カテゴリ:人
は	助詞,副助詞,*,*,は,は,*
ʕ •ᴥ• ʔ	顔文字,熊,Bear,Animals,*,*,ʕ •ᴥ• ʔ,ʕ •ᴥ• ʔ,顔文字
である	判定詞,*,判定詞,デアル列基本形,だ,である,*
EOS

Voila~!

英字記号,数字

元の mecab-juman 辞書にないため, ,., 2024 などの英字記号(ASCII)はうまくいきません.

,       名詞,普通名詞,*,*,*.*,*
(       名詞,普通名詞,*,*,*.*,*
2024    名詞,普通名詞,*,*,*,*,*

必要に応じて, 全角カッコや全角数字に置き換えたり, 英字の辞書を追加してあげるとよいでしょう.

追記

TODO

  • Emoji の分類情報を付与する(python emoji で分類できたはず...)

Discussion