Motivation
色々と理由があって東北大学の github repository などを見ることが多いのだが、もはや mecab-python3 や IPA 辞書は誰も使ってはおらず、fugashi や unidic-py, unidic-lite を使っているようだ。私の認識はかなり古かった。
なので今一度、MeCab とその辞書について考え直そう。
(MeCab じゃなくて JUMAN++, janome, nltk, spaCy, GiNZA じゃね?という話は置いておく)
まずは mecab-python3 なのか fugashi なのかという問題だが
- mecab-python3 は MeCab 本体が必要
- fugashi は MeCab 本体すら必要無い
- しかも fugashi は Cython で高速化している
fugashi を使うという選択肢しか無い。
そして MeCab 辞書だが、興味深い記事を見つけた。現時点でメンテナンスされているのは UniDic だけだから、UniDic 使うしか選択肢が無いということだそうだ。
実は fugashi も unidic-py も unidic-lite も ipadic-py も上の記事も、全部同じ人(Paul O'Leary McCann さん)が作ったり書いたりしてる。日本人なのに勉強不足で全く申し訳ない。
じゃあ UniDic をちゃんと見てみようと、国立国語研究所(NINJAL)を見に行く。するともう major version が上がっている 3.1.1 が作られている(unidic-py に収録されているのは 3.1.0)。しかも書き言葉用の UniDic-cwj と話し言葉用の UniDic-csj の2種類があるじゃないか。(もっと言えば、古文用の UniDicS もあり、これはさらに時代別にかなりのバージョンがある)
(かなり余談だけど、NINJAL って外国の方に人気が出そうな名前だな!)
じゃあこれらも使えるようにしようじゃないか。しかも unidic-py みたいに、ローカルにインストールするんじゃなくて Python のライブラリとしてインストールするだけで使えるようにしたら面白いんじゃないか。
もっと欲をかけば、UniDic 用の NEologd である mecab-unidic-neologd もあるし、IPA も mecab-ipadic-neologd も比較して使ってみたいし、unidic-neologd の README と mecab-neologd の README には「併用すると便利です」と書いてあるから、併用するのも作ってみたい。また JUMAN は形態素の切り出し方が独特だから、やっぱり比較してみたい。ついでに、もしもの時のために自分で作ったユーザー辞書を追加できるようにしたい。
欲望丸出しである。
で、上で「形態素」という言葉を使ったが、NINJALの用語集 に明確な(専門的な)説明があった。「形態素」「短単位」などが気になる人は見たほうが良いと思う。
用語の定義はそちらの専門家に任せるとして、私は実際の使い分けに興味がある。
どの辞書を使うかは、結局の所、どの程度の粗さの単語(めんどくさいから「単語」と言ってしまう)に文章を区切るのかに拠るのだろう(もちろん語彙の豊富さもあるだろうけど)。英語で表現するところの、"coarse-grained"(粗く区切る)と、"fine-grained"(細かく区切る)に相当するもの(もちろん Paul さんの表現)。考えに考え抜いた結果、以下のような使い分けがベストなんじゃないかと。(あくまで個人的意見)
- fine-grained:UniDic, IPA
- 単語分散表現(単語のベクトル埋め込み)のために単語解析する場合
- 名詞が coarse-grained:(UniDic +) unidic-neologd, (IPA +) ipa-neologd
- テキストマイニングでキーワード抽出する場合
- 動詞などの変化形が coarse-grained:JUMAN
- 単語分散表現にて変化形毎に違うベクトルに埋め込みたい場合
で、私はもっぱら単語のベクトル埋め込みばかりしているのだが、それにはやはり UniDic だろうと。それに最新のバージョンを使いたいし、書き言葉・話し言葉も両方とも使ってみたい。
ということで、いつものように前置きだけでかなり長くなってしまったが、以下に UniDic を使う場合に知るべきことと、実際の利用方法をまとめる。
UniDic の品詞体系
UniDic を使って一番困るのが、品詞体系がどこにもまとめられていないことである。
JUMAN, IPA だったら ここ にまとめられているのだが。
そこで UniDic から引っこ抜いて作ってみた。
品詞大分類 | 品詞中分類 | 品詞小分類 | 品詞細分類 | 例(明らかな品詞は省略) |
---|---|---|---|---|
代名詞 | 私、あなた、何時、どこ | |||
副詞 | ふと、ビリビリ、一際 | |||
助動詞 | れる、られる、やがる | |||
助詞 | 係助詞 | ぜ、ぞ、もー | ||
助詞 | 副助詞 | だけ、まで、ほど | ||
助詞 | 接続助詞 | けれど、ながら、など | ||
助詞 | 格助詞 | をば、とて、じゃ | ||
助詞 | 終助詞 | じゃん、ぜ、かも | ||
動詞 | 一般 | |||
動詞 | 非自立可能 | もらう、やれる | ||
名詞 | 助動詞語幹 | さふ、そう、そ〜(3つだけ) | ||
名詞 | 固有名詞 | 一般 | ||
名詞 | 固有名詞 | 人名 | 一般 | |
名詞 | 固有名詞 | 人名 | 名 | |
名詞 | 固有名詞 | 人名 | 姓 | |
名詞 | 固有名詞 | 地名 | 一般 | |
名詞 | 固有名詞 | 地名 | 国 | |
名詞 | 数詞 | |||
名詞 | 普通名詞 | サ変可能 | 通話、徴収(するをつけて動詞) | |
名詞 | 普通名詞 | サ変形状詞可能 | 連続、直接(するをつけて形状詞) | |
名詞 | 普通名詞 | 一般 | ||
名詞 | 普通名詞 | 副詞可能 | 翌朝、通常(な・のをつけて副詞) | |
名詞 | 普通名詞 | 助数詞可能 | リットル、メートル | |
名詞 | 普通名詞 | 形状詞可能 | 名誉、未知(な・のをつけて形状詞) | |
形容詞 | 一般 | |||
形容詞 | 非自立可能 | 良い、欲しい、無い | ||
形状詞 | タリ | 朗々、瞭然、悶々(「〜たり」の形) | ||
形状詞 | 一般 | 私好み、割安、猛烈(「〜な」の形) | ||
形状詞 | 助動詞語幹 | みたい、よう、そう | ||
感動詞 | フィラー | あの、あー | ||
感動詞 | 一般 | いえーい、ウゲッ | ||
接尾辞 | 動詞的 | 掛かる、ぶる | ||
接尾辞 | 名詞的 | サ変可能 | 化、視、飼い | |
接尾辞 | 名詞的 | 一般 | かぶれ、外、型 | |
接尾辞 | 名詞的 | 副詞可能 | がてら、後、ごと | |
接尾辞 | 名詞的 | 助数詞 | 匹、枚、本 | |
接尾辞 | 形容詞的 | っぽい、やすい、らしい | ||
接尾辞 | 形状詞的 | 思い、がち、すぎ | ||
接続詞 | ||||
接頭辞 | 全、総、続 | |||
連体詞 | 単なる、とある、どの | |||
空白 | ||||
補助記号 | 一般 | |||
補助記号 | 句点 | |||
補助記号 | 括弧閉 | |||
補助記号 | 括弧開 | |||
補助記号 | 読点 | |||
補助記号 | AA | 一般 | ||
補助記号 | AA | 顔文字 | ||
記号 | 一般 | |||
記号 | 文字 |
「そう言えば助詞ってなんだっけ?」って改めて分からなくなることも多いので、老婆心ながらまとめておく。(Wikipedia からの受け売り)
-
副詞
- 自立語で活用がなく、主語にならない語のうち、おもに用言(動詞、形容詞、形容動詞)を修飾することば(連用修飾語)。名詞や他の副詞を修飾することもある。
-
助動詞
- 動詞と同じような形態を持つが、他の動詞と結びついて相、法などの文法機能を表す語である。日本語の「-ている」や「-ておく」など、英語の can や will などがある。
-
助詞
- 単語に付加し自立語同士の関係を表したり、対象を表したりする語句の総称。付属語。活用しない。俗に「てにをは」と呼ばれる。
- 助詞.係助詞
- ついた語に意味を添えて強調するもの。述語と呼応することもある。
- 助詞.副助詞
- 体言や副詞、格助詞の後などにつき全体として副詞的に働く。
- 助詞.接続助詞
- 文と文の意味関係を表して接続するもの。 主に活用語に付く。
- 助詞.格助詞
- 主に体言に付いて、文の中での意味関係(格)を表す。
- 助詞.終助詞
- 文や句の末尾について疑問・禁止・感動などの意味を付け加えるもの。
- 形状詞
- 形状詞とは UniDic によって導入された品詞であり、マニュアルによれば「「静か」「健やか」など、い わゆる形容動詞の語幹部分」であるとされている。(出典)
- IPA 品詞体系では、名詞.形容動詞語幹
-
接続詞
- 文と文、節と節、句と句、語と語など文の構成要素同士の関係を示す役割を担う品詞のひとつ。
-
連体詞
- 体言のみを修飾することば(連体修飾語)。自立語、活用はしない。ほとんど修飾を受けないが、ごく一部が、副詞や体言の連用形に修飾される。
- (ちなみに)体言と用言
- 体言と用言は、日本語や朝鮮語の品詞に関する文法用語。体言は「自立語で、活用がなく、主語となる語」つまり名詞を主に指す。用言は「自立語で、活用があり、述語や連体修飾語となる語」つまり動詞・形容詞・形容動詞を主に指す。
UniDic の素性
素性とは(私の理解では)MeCab が解析して出力する単語の属性。品詞とか、活用形とか。もちろん UniDic にも説明があるのだが、バージョン2の情報と混ざったりしていて分かりにくい。そこで以下に綺麗にまとめてみた。
以下の表で、辞書csv って言ってるのは、いわゆる MeCab 辞書の CSV ファイルでその素性が記載されているカラム数(Pythonist なので 0 始まり)。dicrc は設定ファイル(MeCab コマンドだと mecabrc に相当)での出力フォーマット。(MeCab の詳細な出力フォーマットの指定はここを参照)
辞書csv | dicrc | 英語名 | 日本語名 | 名詞の例 | 動詞の例 |
---|---|---|---|---|---|
0 | surface | 表層形 | 桃太郎 | 走れ | |
1 | left-id | 左文脈ID | 61 | 129 | |
2 | right-id | 右文脈ID | 14217 | 429 | |
3 | cost | コスト | 6530 | 9636 | |
4 | %f[0] | pos1 | 品詞大分類 | 名詞 | 動詞 |
5 | %f[1] | pos2 | 品詞中分類 | 固有名詞 | 一般 |
6 | %f[2] | pos3 | 品詞小分類 | 人名 | * |
7 | %f[3] | pos4 | 品詞細分類 | 名 | * |
8 | %f[4] | cType | 活用型 | * | 下一段-ラ行 |
9 | %f[5] | cForm | 活用形 | * | 未然形-一般 |
10 | %f[6] | lForm | 語彙素読み | モモタロウ | ハシル |
11 | %f[7] | lemma | 語彙素 | モモタロウ | 走る |
12 | %f[8] | orth | 書字形出現形 | 桃太郎 | 走れ |
13 | %f[9] | pron | 発音形出現形 | モモタロー | ハシレ |
14 | %f[10] | orthBase | 書字形基本形 | 桃太郎 | 走れる |
15 | %f[11] | pronBase | 発音形基本形 | モモタロー | ハシレル |
16 | %f[12] | goshu | 語種 | 固 | 和 |
17 | %f[13] | iType | 語頭変化型 | * | * |
18 | %f[14] | iForm | 語頭変化形 | * | * |
19 | %f[15] | fType | 語末変化型 | * | * |
20 | %f[16] | fForm | 語末変化形 | * | * |
21 | %f[17] | iConType | 語頭変化結合形 | * | * |
22 | %f[18] | fConType | 語末変化結合形 | * | * |
23 | %f[19] | type | 名 | 用 | |
24 | %f[20] | kana | 仮名形出現形 | モモタロウ | ハシレ |
25 | %f[21] | kanaBase | 仮名形基本形 | モモタロウ | ハシレル |
26 | %f[22] | form | 語形出現形 | モモタロウ | ハシレ |
27 | %f[23] | formBase | 語形基本形 | モモタロウ | ハシレル |
28 | %f[24] | aType | 2 | 3 | |
29 | %f[25] | aConType | * | C1 | |
30 | %f[26] | aModType | * | M4@1 | |
31 | %f[27] | lid | 語彙表ID | 2018... | 8167... |
32 | %f[28] | lemmaID | 語彙素ID | 73439 | 29712 |
原形としてどれを採用すべきか
私はベクトル埋め込みばかりやる。その際に、単語を表層形(表層文字列:文章中に出てきた文字列そのまま)で分かち書きして学習するよりも、いわゆる原形(base form)に直した方が良いと考えている。(ベクトル埋め込みは共起を学習するので、同じ意味の単語はちゃんと同じ言葉に揃えるべきだし、なるべく多く出てきたほうが良く学習できる)
その際に、上記のどの素性を「原形」として採用すべきかは、素性がいっぱいあるので迷ってしまう。私は以下のように考えた。
- 「走れる」というのは、日本語して必ずしも正しくない
- 本来は「走ることが出来る」(able to run)であり、「走る」(run)に "able" の意味がくっつている
- なので上記「走れ」(いっぱいある「走れ」のバリエーションのうち、ひとつ)は、語彙素が「走る」になっている
- ただ、いまや「走れる」という言葉は慣用的にかなり認められている(と思う)
- 「走れる」って言ったからといって「お前の日本語は乱れている」と怒られやしない
- 原形に直したい意図としては、活用形の違いを吸収したいだけであって、「走る」と「走れる」はもはや違う単語として学習するべきではないか
- だから語彙素ではなく、書字形基本形を採用すべきじゃないか
- 「走れないが走る」を、各単語を語彙素に直して分かち書きした場合
- 走る ない が 走る
- 「走れないが走る」を、各単語を書字形基本形に直して分かち書きした場合
- 走れる ない が 走る
- 語彙素に直してしまうと "able" の意味が消えてしまう
- そもそも名詞の語彙素として、なぜかカタカナが入っているものもあるし(理由不明)
- 「走れないが走る」を、各単語を語彙素に直して分かち書きした場合
もちろん上記はあくまで私の個人的意見なので、みなさんはそれぞれの目的・事情に合わせてどうするかを考えるべきだと思う。
goshu, type を理解する必要性
UniDic にオレオレ辞書を追加する場合、上記の(左右の文脈ID とコスト以外の)素性を設定する必要がある。で、どうせ追加するのは名詞だけ(あっても記号)なので、少なくとも名詞の時に各素性に何を設定すべきかは知る必要がある。(もっと言えば、普通名詞と固有名詞の2種類の場合にどうするかが分かるだけでも十分)
で、名詞なので活用形は無いから、活用関係の素性は全部 *
で逃げてしまえば良い。ヨミと発音は、やはり活用が無いから、類する所にそれぞれ同じものを埋めてしまえば良い。そして設定するのが難しそうな aType, aConType, aModType, lid, lemmaID も全部 *
で逃げてしまうことにする。
すると残るのは goshu(語種)と type(日本語名不明)である。
これらは特徴的な文字が設定されており、しかもちゃんと適切な文字を入れないと、左右の文脈 ID が特定できなくて辞書に加えられれない。しかし、どこにも説明は載っていない。
だから自分でルールを探すしか無い。というこで、また辞書から引っこ抜いて一覧を作った。
goshu の一覧
普通名詞、固有名詞、記号、補助記号だけを抜き出した。意味は私が勝手に解釈したもの。
goshu | 品詞 | 意味 |
---|---|---|
和 | 名詞,普通名詞,一般,* |
和語 |
外 | 名詞,普通名詞,一般,* |
外来語 |
混 | 名詞,普通名詞,一般,* |
和・外・漢がまざったもの |
漢 | 名詞,普通名詞,一般,* |
漢語 |
不明 | 名詞,普通名詞,一般,* |
|
固 | 名詞,普通名詞,一般,* |
固有名詞 |
名詞,固有名詞,一般,* |
||
名詞,固有名詞,人名,一般 |
||
名詞,固有名詞,人名,名 |
||
名詞,固有名詞,人名,姓 |
||
名詞,固有名詞,地名,一般 |
||
名詞,固有名詞,地名,国 |
||
記号 | 名詞,普通名詞,一般,* |
記号 |
補助記号,一般,*,* |
||
補助記号,AA,一般,* |
||
補助記号,AA,顔文字,* |
||
記号,一般,*,* |
||
記号,文字,*,* |
type の一覧
同じく普通名詞、固有名詞、記号、補助記号だけを抜き出した。同じく意味は私が勝手に解釈したもの。
type | 品詞 | 意味 |
---|---|---|
体 | 名詞,普通名詞,一般,* |
体言 |
国 | 名詞,固有名詞,地名,国 |
国名 |
名 | 名詞,固有名詞,人名,名 |
名 |
姓 | 名詞,固有名詞,人名,姓 |
姓 |
人名 | 名詞,固有名詞,人名,一般 |
人名(姓+名) |
地名 | 名詞,固有名詞,地名,一般 |
地名 |
固有名 | 名詞,固有名詞,一般,* |
固有名 |
補助 | 補助記号,一般,*,* |
補助記号 |
補助記号,AA,一般,* |
||
補助記号,AA,顔文字,* |
||
記号 | 記号,一般,*,* |
記号 |
記号,文字,*,* |
goshu, type の設定方法
上の表を見ると、バリエーションはそれほどなく、さらにルールがかなり限定されているように感じる(もちろん例外は見受けられるが)。なのでそれほど難しくはないだろう。
ただ一点だけ難しいのが、goshu の「和」「漢」「外」の区別。一応 NINJAL に説明がある。
和語・漢語・外来語の語種の判定は、 原則として『新潮現代国語辞典』第2版(新潮社)により、 『新潮現代国語辞典』第2版の見出しにない語は、『日本国語大辞典』第2版(小学館)を主たる資料として語種判定を行います。 また『新潮現代国語辞典』第2版の語種判定に従い難いと判断した場合は、『日本国語大辞典』第2版等を参照して、独自に語種を判定しています。
難しいわ!
だから簡便的に以下の方針で良いんじゃないかと思っている。あまりに簡便的すぎるかもしれないけど。
- 普通名詞
- goshu
- カタカナ・アルファベット・記号のみだったら「外」
- 漢字のみで、それの読みが音読みだけだったら「漢」
- ひらがな・漢字のみで、漢字の読みが訓読みだけだったら「和」
- 上記が混ざっていたら「混」
- type
- 「体」
- goshu
- 固有名詞
- goshu
- 「固」
- type
- 人名や地名だったら「人名」「姓」「名」「国」「地名」を使い分ける
- その他は「固有名」
- goshu
- 記号・補助記号
- goshu
- 「記号」
- type
- 「記号」もしくは「補助」
- goshu
mecab-unidic-neologd を UniDic3 で使う
NEologd さんが、IPA 辞書に対して mecab-ipadic-neologd を作ってくれているのと同様に、UniDic に対しては mecab-unidic-neologd を作ってくれている。
ただし、mecab-unidic-neologd の中身を読むと、対応する UniDic のバージョンは 2.1.2 らしく、それ以降は対応していない。(まぁ最終更新が 2020/09/14 なので、仕方無いところ)
そもそも major version が違うので素性の形式が全然違う。さらに左右の文脈 ID もコストも UniDic 3.1.1 で新たに振り直さなくてはならないはず。
だから表層形と品詞・ヨミ・発音だけもらって、あとは自分でユーザー辞書を作る容量で作り直さなければならない。
mecab-unidic-neologd の seed に含まれている品詞は以下の8種類しかない。(想定通り)
名詞,普通名詞,一般,*
名詞,普通名詞,サ変可能,*
名詞,固有名詞,一般,*
名詞,固有名詞,人名,一般
名詞,固有名詞,人名,名
名詞,固有名詞,人名,姓
名詞,固有名詞,地名,一般
記号,一般,*,*
じゃあ簡単に変換できるんじゃないかというと、意外とそうでもなかった。
- 記号の中に顔文字も含まれている
- UniDic3 の品詞体系では「補助記号.AA.顔文字」となっているので、顔文字ならば品詞を変換
- Wikipedia の原文が混ざっちゃって HTML タグが付いているものがある
- そういうものは削除
- あまりに単語が長すぎて、左右の文脈 ID とコストを振る
mecab-dict-index
の挙動が不安定になる- UniDic3 に含まれているもっとも長い単語は、
supercalifragilisticexpialidocious
。メリー・ポピンズの歌に出てくる例のやつ。Wikipedia。 - なので、これに敬意を表して 32 文字以上の単語は全て削除
- UniDic3 に含まれているもっとも長い単語は、
- goshu や type が無い(ものもある)
- 上記のルールに従って、新たに適当に振る
- 本当に超テキトウ
- 上記のルールに従って、新たに適当に振る
- ヨミや発音を表す素性がいっぱいある
- UniDic2 の素性の定義は、どこに書いてあるのか既に良く分からない
- なので、いい感じのヨミと発音を1種類ずつ抜き出して、それを UniDic3 の全部のヨミ・発音に埋め込んだ
こういった地道な努力を行い、新たに mecab-dict-index
で左右の文脈IDとコストを振り直すことによって、UniDic3 でも NEologd が使えるようになった。
UniDic 3.1.1 を使う
ということで、いつものように既に作っとります。
(注意:各辞書はそれぞれライセンスがあります。個人的に使う分には問題ないはずですが、必ず各々の適切な判断に基づき使用してください)
上記の repository の README に使い方などは書いたので、ご参考まで。
> echo "山田とキンタロー。と丸太郎がルシスへ走れないが粛々と走る" | mecab -d unidic_cwj_neologd
山田 (ヤマダ) [山田] <名詞.固有名詞.人名.姓> (unidic-cwj)
と (ト) [と] <助詞.格助詞.*.*> (unidic-cwj)
キンタロー。 (キンタロー) [キンタロー。] <名詞.固有名詞.一般.*> (unidic-neologd)
と (ト) [と] <助詞.格助詞.*.*> (unidic-cwj)
丸太郎 (マルタロウ) [丸太郎] <名詞.固有名詞.一般.*> (user)
が (ガ) [が] <助詞.格助詞.*.*> (unidic-cwj)
ルシス (*) [*] <名詞.普通名詞.一般.*> (UNK)
へ (ヘ) [へ] <助詞.格助詞.*.*> (unidic-cwj)
走れ (ハシレ) [走れる] <動詞.一般.*.*> (unidic-cwj)
ない (ナイ) [ない] <助動詞.*.*.*> (unidic-cwj)
が (ガ) [が] <助詞.接続助詞.*.*> (unidic-cwj)
粛々 (シュクシュク) [粛々] <形状詞.タリ.*.*> (unidic-cwj)
と (ト) [と] <助詞.格助詞.*.*> (unidic-cwj)
走る (ハシル) [走る] <動詞.一般.*.*> (unidic-cwj)
こんな風になるよ。