2020年11月21日土曜日

形態素解析辞書の使用感まとめ

最近、自然言語処理でよく利用される辞書やコーパスを利用して、ニ文字熟語や三文字熟語、用例の生成を試みてきました。 三文字熟語が少し強敵で、これまでたくさんの辞書を利用して実験しています。 たくさんアプリを作ってクロスチェックできるようになり、バグも減り知見も溜まってきたので、結論をまとめておきます。

成果物

ちなみに熟語生成の成果物はこちら。 以下のライブラリを利用して 12こくらい アプリを作ったりもしてます
また熟語生成やゲーム制作を通じて、既存の自然言語処理には様々な問題があると改めてわかりました。 そこで痒いところに手が届く、ライブラリも色々と作りました。 作る気はまったくなかったのですが、既存のライブラリではできないことが多すぎて作らざるを得なかったものたちです。 コンセプトは O(1) で検索できて省メモリです。

自然言語処理によく使われる辞書まとめ

熟語生成について語る前に、良い機会なので自然言語処理においてよく使われる形態素解析辞書や語彙辞書についてまとめておきます。 形態素解析辞書や語彙辞書を使うと、簡単に熟語生成ができます。 JMDictFurigana は有名ではないけど、かなりたくさんの語彙が登録されています。 有料では BCCWJ などありますが、利用が限定されているので扱いません。 有用な辞書はすべて入れたつもりですが、他にもあるでしょうか。

名称語彙数ライセンス
Juman (dic) ver 7.0141,434BSD 3-Clause
JMdictFurigana ver 2.2.1195,098CC-BY SA
Juman (all) ver 7.01215,838BSD 3-Clause
IPADic ver 2.7.0334,221IPADic License
NAIST-jdic ver 2010-07-30485,863BSD 3-Clause
JMndictFurigana ver 2.2.1581,408CC-BY SA
SudachiDict (small) ver 2020-07-02768,030Apache Licence 2.0
UniDic (cwj) ver 2.1.2872,831GPL / LGPL / BSD 3-Clause
UniDic (csj) ver 3.0.1.1875,923GPL / LGPL / BSD 3-Clause
SudachiDict (+core) ver 2020-07-021,619,350Apache License 2.0
SudachiDict (+full) ver 2020-07-022,927,811Apache License 2.0
mecab-unidic-neologd ver 2020-09-103,384,963Apache License 2.0
mecab-ipadic-neologd ver 2020-09-105,572,307Apache License 2.0


ちなみに語彙量が多ければそれで良いかというと、そうでもないと思います。 たとえば neologd にはほとんど同じ語彙で「〜」の数だけ違うものが大量に登録されています。 これはなぜかというと、既存の形態素解析器は「やゔぁあああい」「わーーーーーい」といった文字列は本質的に解析が難しいからなんですよね。 おそらくこの問題を少しでも改善しようと統計的に出現頻度の高いパターンを語句として登録しているのだと思います。 ただ形態素解析以外でこれが使えるかというと、ほとんどのケースで使えないでしょう。 よって用途に応じた選択こそが大事なのだと思います。 実際にいろいろ触って気付いたこともメモとしてまとめておきます。


熟語や用例の生成に一番良いのは形態素 N-gram

では熟語を生成するのに一番良いのはどれでしょうか。 結論を先に言ってしまうと、語彙辞書からではなく Web から抽出した N-gram からの抽出が最も適していると思います (爆)。 成果物たる marmooo/ngram-idioms では、NWC 2010 という形態素 N-gram コーパスを利用しています。 いきなりちゃぶ台返しのような結論ですが、実際にやってみてわかった事実なのでどうしようもない。 N-gram は実際に使う言葉の頻度分布をそのまま反映するので、自然な熟語が生成できます。 N-gram 以外の形態素解析辞書には読みデータが付いている利点があるのですが、分布の利点はどうしても捨てられませんでした。 ちなみに N-gram 以外の方法では、私が作った熟語生成ライブラリの紹介順で生成結果が良かったです。 Juman 辞書では熟語生成をしていませんが、これは単にやる気の問題です。 固有名詞が扱いにくく、ふりがなも一部にしかないので、やる気が出なかった。

N-gram が一番良かったと結論を述べてしまいましたが、辞書ごとにどのような違いがあったか軽く説明したいと思います。 事前に特徴を知っていると、どのような利用シーンでどの辞書を使えば良いか、わかりやすくなります。 こちらの情報のほうがはるかに有用です。

辞書の特徴

NAIST-jdic, IPADic

熟語の生成はそれなりに安定していますが、N-gram より使われない熟語がよく出てきます。 ニ文字熟語だと問題にならないのですが、三文字熟語になると顕著です。 NAIST-jdic と IPADic はかなり近いデータではありますが、NAIST-jdic が上位互換になっています。 IPADic より語彙数も多いですし、より正確な生起コストが記載されている利点があります。 IPADic と NAIST-jdic で迷ったら、普通は NAIST-jdic で良いと思います。 NAIST-jdic は同音異義語や表記ゆれをきちんと扱っており、クオリティの高い辞書だと感じました。 ただ実際に生成してみると、三文字熟語に関しては IPADic のほうがずっと良いです。

熟語に限らない話でもいくつか気になることはあります。 どちらの辞書も、色々遊んでみると形態素の基準が怪しいことが多いし、ふりがなのデータが怪しい印象です。 精度を求めていくとやや限界があるかも。

JMndictFurigana, JMndictFurigana

JMndictFurigana, JMndictFurigana は有名ではないものの、かなり大きな辞書です。 JMndictFurigana は固有名詞を大量に含んでいるので、熟語生成に使うとしたら JMdictFurigana になります。 「気配り上手」など形態素ではなく用例がたくさん登録されている辞書なので、形態素解析には向きません。 生成される熟語は、実用上は使わなそうなものがそれなりにありますが、生成結果は N-gram, IPAdic, NAIST-jdic の次くらいにいい感じです。 熟語より用例に使える辞書ということでしょうか。 ただコスト値がないため頻出熟語のみを抽出といったことはできません。 この特徴は、熟語生成には少し使い勝手が悪いです。 あとライセンスにも注意が必要です。

SudachiDict

SudachiDict は非常に網羅性の高い辞書です。 ただ品詞 (特に固有名詞) についてはたまにノイズがある印象です。 ちなみに full は使うことがほぼないものばかりなので、生成に使ったのは small + core です。 使いやすい辞書であることは間違いありませんが、生起コストはあまり納得がいかない。 形態素に分離することで生起コストが歪むとかあるんだろうか? この問題が大きいため、熟語生成に関しては N-gram に軍配が上がります。 コスト値などを強く意識する必要がなく網羅性の重要な解析用途では、真っ先に利用を検討すべき辞書だと思います。 実例としては、こども漢字辞書 です。 何となく作ってみた辞書ですが、常用外漢字はとにかく用例が不足するとわかりました。 N-gram では頻度順に抽出できて自然な用例を生成できる一方、頻度が下がってくると若干信頼性に不安が出てきます。 SudachiDict を使って補完すれば、常用外漢字もサポートしやすく、とてもうまく機能しています。 同音異義語や表記ゆれ、そして正規化まできちんと扱っており、クオリティの高い辞書だと感じました。

熟語生成特有の問題としては「年生」が固有名詞または接尾辞、「一年生」が固有名詞として出現するため、少し排除が難しかったりします。 IPADic や NAIST-jdic では「年生」は接尾辞、「一年生」は普通名詞です。 接尾辞・接頭辞の完璧な合成は難しい (例えば接頭辞「黒」と「年生」はどう考えてもつかない) し、一般固有名詞は会社名が大量に混ざってくるので取り扱いが難しい。 あと「千島風露」みたいな珍しい花名が普通名詞に入ってきたりもするので、色々と排除の手段を考える必要があります。

UniDic

UniDic は辞書が大きく、語句のカバー率は N-gram より高いのが利点です。 IPADic より厳格な方式で作られた辞書ですが、生成される熟語はまず使わないものばかりが上位に来てしまいます。 二文字熟語はいい感じですが、三文字熟語はとても使う気になりません。 この問題はおそらく UniDic の「短単位」基準による構築が原因となっています。 IPADic では「小学校」を語彙として登録していますが、UniDic では「小+学校」として分離するため、「学校」のみ語彙登録されています。 つまり UniDic に登録されている三文字の語彙は、短単位の考え方から漏れた例外しか登録されていません。 まず使わない熟語ばかり生成されるのは、当然とも言えます。 熟語生成には向きません。

UniDic は中身もかなり他の辞書と違うので、注意が必要です。 まず語彙素を基本単位として、それが表層形として登場するという考え方で作られています。 表層形は書字形出現形の活用を受けたものということです。 かなり注意が必要なので「以下」という言葉を例に挙げてみます。 表層形は「下」という語彙素を持ち、「シモ」という語彙読みを持ちます。 UniDic の読みデータは語彙素に付随したものになっているので、表層形に対応する読みは「シモ」になります。 しかし当然ながらそのような読み方をすることはありません。 よって「以下」の読みを知るためには、語彙素 lemma と表層形が一致しているものだけを見ないといけない。 動詞などはさらに活用があるし、表記ゆれも多発します。 「表層形に付随する読みがない」のが原因で、特定ケースでは取り扱いが難しい辞書です。 あと色々なライブラリを作って比較するとわかるけど、ちょっとノイズ多いかな。

先に例として挙げた「一年生」問題はさらに複雑で、UniDic では「一 / 年 / 生」とすべて分離して扱います。 短単位だと確かに正しい気はするのですが、熟語生成に使える辞書ではないことが、こういったところからもわかるかと思います。 SudachiDict と同様に網羅性が重要なときか、短単位で処理したいときに使う辞書ですね。

mecab-ipadic-neologd, mecab-unidic-neologd

現状で最もサイズが大きい辞書は mecab-ipadic-neologd です。 mecab-unidic-neologd もおそらく中身は一緒なのですが、UniDic に合わせて作っているので数が違うのだと思う。 これらの辞書は、普段使う語彙を蓄積した辞書というよりは、未知語や新語を蓄積した辞書です。 冒頭で述べたように neologd にはほとんど同じ語彙で「〜」の数だけ違うものが大量に登録されています。 熟語生成には向きません。


熟語の読み推定の課題

熟語の生成は N-gram が一番良いとわかったものの、N-gram には読みデータがないという致命的な問題があります。 「それなら形態素解析器を使って読み推定すれば良いのでは?」と思われる方もいるかも知れません。 しかしここまでの説明で勘の良い人は気付いたでしょうが、三字熟語の読み推定はそう簡単ではないです。 巷でよく使われる Mecab、というより形態素解析器そのものが、読み推定に主眼をおいて作られている訳ではありません。 IPADic を使えば読みのデータが不足しますし、UniDic を使っても短単位に即した読みしかできません。 熟語の推定には問題が生じやすいことがわかります。 実際に試してみると、Mecab (+IPADic / UniDic) は、あまり使えないかな…。 これは三字熟語の読みは必ずしも短単位によって決まらないものが多くあるからだと予想できます。 mecab-ipadic-neologd も短単位での登録なので、精度が上がるとは思えません。 三字熟語は読みデータ自体がないので、諦めるか手動登録しかないかな。 ちなみに諦めました。

そのような調査をしている時に、形態素解析器だととにかく遅いことに気付きました。 単純な熟語の読み推定は案外利用シーンが多い気がして、形態素解析器を使わないほうが良いのではと思いました。 短単位の問題以外にも、「おととい」「いっさくじつ」のように複数の読み方がありながら、無視されてしまう問題もあります。 たかだか数文字の語彙に形態素解析器で読み推定するのはあまり効率が良いとは思えません。 色々考えた結果、パターンマッチングで上記の辞書のふりがなを O(1) で検索できるふりがな辞書を作りました。 辞書は marmooo/yomi-dict で配布しています。 今回はふりがな辞書として公開していますが、ほんの少しコードを書き換えれば IME 用の辞書もすぐに作れます。 真面目に説明すると話が長くなるので、詳しくはこちらのページを見てください

他にもデータチェックやデータ生成のために色々なライブラリを作っています。 熟語生成に興味のある人がいるかわかりませんが、興味があれば使ってみてください。

0 件のコメント: