2021年11月15日月曜日

学年別の熟語辞書を作った

学年別の熟語辞書 を作りました。 というか形態素 N-gram からの良い熟語生成を思い付いてしまったので、 以前作った ngram-idioms を一から作り直しました。



以前の生成方法

ngram-idioms では、 形態素 Ngram を前後のつながりを見ながら形態素を複数つなげて熟語らしいものを作り、 テンプレートマッチングでノイズを除去していました。 しかしこの方法は面倒だし、形態素 N-gram の gram 数の影響を受けて、 頻出熟語しか抽出できない問題があります。 今までのような教育用途だと問題ない精度で抽出できるのですが、手作業のノイズ除去が必要だし、 数は少なくなるし賢い生成方法ではないです。

改良案

どこまで真面目に作るかの問題があるのですが、シンプルに作るなら以下の方法で良さそうです。 手作業のメンテが不要なのが良い。
  1. 日本語ウェブコーパス 2010 の 1〜7gram から熟語っぽいものを生成
  2. SudachiDict で熟語判定
  3. SudachiDictinappropriate-words-ja で地名と人名と禁止語を削除
  4. 品詞判定で不要語を削除
  5. 漢字レベルに合わせて形態素を分類

ポイントは形態素解析辞書の生起コストに違和感があるので、形態素 N-gram のカウントを使うところ。 形態素解析辞書は Neologd でも良いですのが、より信用できる SudachiDict にしました。 以下の記事は熟語生成にもとても参考になります。 なんだ今なら簡単に作れるじゃないかーと思いました。 まあ以前作ったときは SudachiDict の固有名詞フィルターがどれくらい使えるかわからなかったので仕方ない。 やっぱ色々素振りして遊んでないと駄目ですね。

難しいところ=熟語 or 複合名詞

熟語かどうかの判定はとても難しいです。 そのよくわからないところを形態素の 2〜7gram を見て語彙生成した後、SudachiDict にぶん投げて解決しています。 7gram にもなると早口言葉みたいなのがたくさん出てきます。

SudachiDict なら A〜B単位がまさに熟語となります。C単位は微妙なところ。 C単位は「正多角形」のような熟語がほんの少しある一方、「八戸市内」のような熟語か?というものが大量に混ざってきます。 熟語かどうかはすごく判断が難しくて、考え始めるとキリがないです。 そもそも「歴史」も「草木」も熟語じゃなくて複合名詞では?と言われれば「確かにそうかも」となるように、本質的に難しいです。 私は雑なので頑張らず、SudachiDict に丸投げし、B単位までにしました。

SudachiDict は本当によくできた辞書なので、全体的にいい感じに生成されているように見えます。 データを見てもわかるのは、三字熟語まではまあまあ人間的にもわかりやすいですが、 四字熟語以上は熟語なのかしっかり考えないとわからないもの (C単位) のほうが多くなってきます。 ゲームで使えるのは三字熟語まででしょうね。 また基本語彙を押さえておけば三字以上の熟語の大半の意味はわかることも確認できました。

ちなみに昔の実装も面白いので ngram-idioms は残してあります。 ngram-idioms では手動のフィルターを結構作ったので、差分の比較に便利です。 たとえば SudachiDictでは「花王」「山門」「太一」「東横」などを普通名詞にしていますね。 この中では「花王」は固有名詞が正しい気がします。 ただ企業名のフィルターはかなり難しいので、まあ無視で良いかな…。

このへんを頑張ろうとするなら、Mecab をフィルターにすれば、頻度を考慮するので名前として除外されます。 最初は Mecab を併用して頑張ってノイズ除去していましたが、 ビルドに時間が掛かりますし、SudachiDict の進化に期待して最近は特に除去していません。

かなり良いものができたので、以前作ったアプリで関係のあるものは全部更新しておきました。 まずは統計の歪みが完璧に消えて完成度が高くなったと思います。 また難易度調整もしやすくなり、ドリル系のアプリもかなり使いやすくなりました。 なるべく基本語彙から学んでいくことで学習効果も高くなったはず。

0 件のコメント: