2022年4月15日金曜日

Web N-gram を用いた日本語の共起コーパス wncc-ja を作った

Web N-gram を用いた日本語の共起コーパス wncc-ja を作りました。 名前は Web N-gram based Collocation Corpus の略です。 精度と網羅性の高い例文や用例、共起データが欲しかったので開発しました。 検証用に作ったのですが、まあまあの出来には見えます。



共起辞書は昔 NICT がやってたみたいですが今は存在不明、 例文や用例データとしてすぐに使えるコーパスとして WordNet、 単語ベクトルを算出する Word2Vec がありますが、後述するように難点はあります。 他にも例文や用例は検索サイトならいくつかあるのですが、 再利用可能なデータがなく精度や実用性にも少し疑問があります。

既存の例文生成の問題

例文や用例は課題がわかりやすいので取り上げてみます。 生成手段としては青空文庫や Project Gutenberg から全文検索で作る方法が有名です。 しかし (1) 文章が長すぎ、(2) 文調が古すぎます。 上記の問題を解決するには頻度を考慮した適切な文章を生成する必要があります。 そのためには言葉の意味、最低でも共起関係をきちんと見ることが重要となります。 例文や用例は、文章が長くなっても言葉のイメージが掴めない問題があるので、 語彙の意味や利用シーンがわかることが重要となります。 一番わかりやすい例は「真理の追究」と「責任の追及」です。 同音異義語の「ついきゅう」はたった一つの周辺語さえ提示すれば、 利用用途が完璧にわかります。これは地味に凄いことです。

Word2Vec や WordNet の問題

共起コーパスとは異なりますが、語彙の関係を抽出する試みとして有名なものに Word2Vec があります。 Word2Vec は網羅性が非常に高いのが利点ですが、残念なことに考慮しているのは類似度です。 類似度と共起は近いようで異なるため利用が難しく、例文や用例の生成もできません。 先ほど例示した「追究」と「追及」を例に挙げると、Word2Vec では非常によく似た語として扱われてしまい、 類似の候補としてそれぞれが提示されてしまったりします。 Word2Vec の情報をもとに例文を作ることは厳しいなと思いました。

言葉の出現分布の類似度ベクトルは、必ずしも類義語を示す訳ではありません。 fastText も同じことが言えて、サブワードの出現分布の類似ベクトルが似通っていても、類義語を指すとは限りません。 同じような文脈で使われることが多いことを示すだけです。 結構色々と遊んでみましたが、例文や用例として応用するのはやや難しいという印象です。

例文や用例、共起データをすべて含む WordNet は一番使い勝手が良く、一応は使い物になります。 ただややノイズが強く、概念が冗長過ぎる割に、単語の網羅性が低く、 例文や用例もやや冗長な欠点があります。 いざ使おうとすると様々な問題にぶつかり、仕方なく自作したという事情があります。

作ってみた

それではどのように共起関係を抽出すればいいでしょうか。 共起関係を抽出するには、日本語の助詞をよく見て述語構造解析に近いことをやれば良いだけです。 解析は真面目にやると死ぬので、自明な関係だけを処理します。 日本語も英語も考え方はほとんど一緒なのですが、実装はなかなか面倒です。 話が長くなるだけなので、抽出ルールは以下のページに分けて記載しました。

GPT2 や BERT との比較

N-gram で重要な関係だけ抽出する考え方自体は、GPT2 や BERT の穴埋め問題の考え方に近いところがあります。 ただ長文と短文のバランスを考えたりする必要があって、GPT2 や BERT の計算ステップは無駄が多い。 良い短文は数 gram を頻度カウントすれば生成できる直感があるので、わざわざ GPT2 や BERT を使う必要はない気がしています。 ちなみに GPT2 による例文生成もやってはみました。 なんとなく生成はできるのですが、結果が不安定だし、問題によってはボロボロになりがちなで、実用には耐えませんでした。 わざわざ問題を難しくする必要はないのかなと思います。 BERT もダメダメで使い物になりませんが、GPT2 よりは良いかな。 ただ語彙数が少ないため、それに伴う悪影響が大きかったです。

欠点

欠点もあります。(1) 名詞、動詞、副詞、形容詞に付随する関係性を抽出するのは簡単ですが、接続詞は難しいです。 少し考えてみても、接続詞でいい感じの関係性を抽出するには多くの ngram を必要とします。 もっとも日本語の接続詞はそれほど多くないので、接続詞は別途処理すれば、十分に使い物になるコーパスだと思います。

(2) 関係性を抽出できると言っても、あくまで頻度の多さでしか判断できません。 例えば、「責任を追求する」「顔が火照る」で用例はわかるかも知れませんが、意味は正確にわかりません。 ただ日本語は漢字の並びでだいたいの意味がわかるので、案外どうにかなるのかも知れません。 例えば適当に「激燃る」という動詞を作ったとしても、なんか「すごい燃えるんだな」と、十分に意味が通じます。 「しばしば (屡々)」みたいな現代の知識ではどうにもならないケースだけ対処すればいいはずです。

まとめ

とりあえず生成データは既存手法よりずっと使いやすいです。 抽出手法もわかりやすく、せいぜい 5gram くらいの形態素 Web N-gram と、最低限の文法知識だけ用意すれば、汎用的に多言語対応できるのも利点です。 データセットは使いやすい形で公開しているので、使い方はどうぞ。

0 件のコメント: