2021年5月18日火曜日

NGSL を超える英単語リスト mGSL を作った

NGSL を超える英単語リスト mGSL を作りました。 英単語リストってかなり色々あって、日本では古めの NGSL が有名です。 世界だと何が有名なのかいまいちわからないところがあるけど、単語数などを見てると NGSL ではなさそうな雰囲気はあります。

mGSL

NGSL / NAWL / TSL / BSL の課題

NGSL の一番の問題は単語数の少なさ。 2800語しか対応していないために、NAWL / TSL / BSL を併用するケースが多いように見えます。 ただデータセットが小さいために統計値に問題があるので、頻度が落ちてきた時が気になります。 データ量に着目し、頻度情報だけを見るなら、 Peter Norvig's compilation of the 1/3 million most frequent English words というのがあって、 Google n-gram 以上の膨大なデータで生成されていて、現時点で最強です。

新定番を目指した mGSL

前々から 1/3 million などを使って、ノイズ除去しながら自動生成したらどうなるのだろうと思っていました。 NGSL も考慮はしてるみたいなんですが、バラバラではなく大きな一つのリストが欲しいんですよね。 遊んでみたら結構うまくできたので、mGSL という名前で公開してみました。

それでは生成方法について。 (1)語彙を原形に戻す正規化、(2)固有名詞の除去、(3)翻訳の補完 が問題となります。

1. 正規化

NGSL などの頻度リストは正規化をどれくらいしているのか謎なところがあります。 少なくとも total と totally の 2つがリストに含まれるような状態になっています。 動詞の正規化も正直よくわかりません。 正規化はどこまでやるべきかは何とも言えませんが、頻度を測定するだけでなく、 勉強に使用したいのであれば、同一品詞内の正規化はしたほうが良いように思います。

正規化の方法は色々あります。 同一品詞内の正規化だけでなく、useful→use までやってくれるような強力な正規化として、Lemmatization と Stemming が知られているので、検討はしました。 ただ Stemming は consider→consid にしてしまったり。他にもノイズだらけでとても使えません。 Lemmatization は 2019年に精度が 95.6% まできましたが、実際にやってみると肝心なところで精度が低いです。 95.6% という数字自体が精度として低すぎますし、実行してみた印象としても精度は上がりにくいと予想しました。 例えば gonna のような口語をどのように Lemmatization するかは難しくて、gon としてしまいます。 同じようなケースはたくさんあると思うので、技術的な限界を感じます。

そこで Lemmatization について軽く勉強してみると、どうやら文字の統計的な変化可能性まで考慮したものを指すらしいです。 別にそこまではいりません。わかっているものだけを変換してくれれば良い。 そこで SoTA の LemmInflect はどんなデータセットを使っているのかと調べてみると、 AGID を使っていることがわかり、 AGID では変化のレベルを数段階で用意してくれていました。 なんだ素晴らしいものがあるじゃないかということで確実に変化する部分の辞書だけ利用させて頂きました。 不確実な部分には誤用なども含まれていると考えられるため、その排除は英和辞書に任せれば、完璧な正規化ができそうです。 精度はいくつかのアプリで確認しているのですが、駄目なところがあっても手動で直せるくらいには完璧です。 他のリストだとここまでうまくいきません。 正規化をクリアできて一気に精度的な心配が消えました。

2. 固有名詞の削除

ノイズ除去や正規化が終わったら固有名詞を削除します。これが一番難しい。 平凡な辞書を作るなら固有名詞の削除は不要なのですが、英単語学習においては固有名詞は言語依存要素があまりにも多いので、削除が必要と思っています。 大文字小文字で排除できるものはそのまま排除すれば良いのですが、たまに辞書でも混じってしまっているし、n-gram では小文字で扱われるものもあったりする。 大文字小文字を無視して固有名詞を削除しようとすると、急に難しくなります。 そして固有名詞はどこまで削除が必要なのか、という問題もあります。 これは最初から最後まで非常に悩んだ問題です。

そもそも日本の教科書でも出てくる John みたいな名前って、実は普通名詞の意味があったりするので、固有名詞を排除するのって意外と難しい。 WordNet で考えると、カウントの大きな意味をメインに使うのが現実的と思うのですが、トイレという意味が名前と同程度に使われるらしい。 John は普通名詞の意味だけ覚えるべきなのか、両方覚えるべきなのか、そもそも両方覚えないべきなのか。すごく難しい問題です。 私の結論としては、John のように頻度の高い固有名詞以外の意味を持つものは、意味の取り違えが起きるので、覚えたほうが良いと思ってます。 しかし固有名詞しか意味を持たないもの (例えば David) は、意味の取り違えが起きないため、覚えなくても良いと思っています。

ちなみに技術面から見ると 固有名詞は 97.8% で判定できることになってます。 しかし実際やってみると全然駄目なので、やっちゃ駄目。文構造を利用しないと難しいってことですね。 色々やってみた結果、NGSL / NAWL / TSL / BSL のような固有名詞より重要度の高い単語を登録した後に、不要なリストを削除するのが良さそうと思いました。 不要なリストは色々ありますが、企業名や製品名などは必須語を登録した後でも単語を削除してしまう可能性があるので、削除しないほうが良さそう。 今のところ、性的用語などの禁止語、冒涜語、地名、人名、国名、言語名、短縮名、元素記号など、てんこ盛りでストップワード処理をしています。

3. 翻訳の補完

禁止語、冒涜語などの事故が少ないリストを削除した後に、まずは辞書を用いて和訳、そして和訳できなかったものを英訳します。 英訳もできなかった単語は重要度が低いので削除します。 辞書はライセンス的に利用しやすい ANCDIC, 日本語 WordNet、EJDict、WordNet、Websters を利用しています。 WordNet は 3.0 ですが、3.1 を使ってもあまりノイズが減らせなさそうなのは軽く確認して、現状に至ってます。 3.1 は使いにくいからそれほど前向きではない。

色々遊んでいてわかったのは、都市名や人名の除去は不安定なので、大文字小文字による除去が重要ということです。 大文字小文字は他の場合でも重要で、(1) march と March のようにわずかに意味が違う言葉があり、 (2) 大文字小文字を考慮した辞書かどうかでノイズが大幅に減ります。 ちなみに 1/3 million は大文字小文字を考慮しておらず、また WordNet も考慮していません。 n-gram のほうは文章の先頭かどうかでかなり統計が揺らぐのでまあいいです。 ただ WordNet はあまり積極的に使えません。 なるべく大文字小文字を意識した辞書を優先して翻訳を行い、最終手段として使うようにします。

追記: 最初のリリースでは WordNet を使ってましたが、ほとんどのノイズの原因が WordNet になってしまい、またあまりにもノイズが多かったので、今は使ってません。

辞書の訳もそのままでは完璧ではなく、訳が多くなりすぎたり、複雑過ぎたり、学校で習う表記とズレが発生しやすい問題があります。 特にズレが発生しやすい助詞/助動詞などは、学校の教科書などを参考にしながらすべて標準的な訳に変えました。 また気になる訳はチマチマと手動更新しています。 ひとまず最初の 8000語まで一通り処理した後、重要度の高い 5000語は何周か調整しているので、だいぶまともになっているんじゃないかと思います。 巷の辞書は機械的にパースが難しいので、かなり大変でしたが、何日か頑張りました。 頻度の低いところで完璧を目指すのは難しいのでいったんリリース。 機械的にパースできる辞書としても有用かと思います。

まとめ

以上、今のところベストと思われる手法を検証しながら、mGSL を作りました。 実際に作ってみると、既存のリストは低頻度領域がやや効率悪そうな感じですね。 レベルが上がるにつれて mGSL のほうが効果が高くなるのではないかと思います。 mGSL は不満があればすぐに直せるようになっており、技術の進化に追随しやすいのが利点です。 変なところや改善点があれば修正します。

作り終わってから 色々な研究がある のを知ったのですが、あまり知見は活用できず。 残りの問題は和訳と低頻度ノイズなんだよなー。そればかりはどうしても手作業が必要になります。 和訳は単語レベルなら embedding な機械翻訳が割と簡単に作れそうではあるけど、 embedding は頻度が下がると全然駄目な印象があるので、やはり手作業しかないんじゃないかと思っています。

0 件のコメント: