豪鬼メモ

一瞬千撃

ChatGPTに英語の共起語のリストを生成させる

統合英和辞書には各見出し語の典型的な共起語のリストを収録しているが、その生成をChatGPTにやらせてみた。結構まともな結果が得られ、類語検索や連想単語帳の精度が上がった。さらに、例文を選択する際にその共起語を含むものを優先することで、より典型的な例文を提示できるようにした。


「knife」の典型的な共起語として「stab」「kitchen」「edge」「blade」「sharp」などを人間は想起するだろう。それを辞書にも収録したい。共起語のリストを見ると、たとえ語義や訳語を全く見ていなくても、おそらく見出し語が「ナイフ」または「包丁」という意味であることが分かるので便利だ。共起語のリストは、語の理解に役立つだけでなく、それを素性にした類語検索k-means法によるクラスタリングを使った単語帳の生成にも使われている。共起語リストの精度が上がれば、それらの精度も上がることになる。

今までは共起語の抽出を自前の言語モデルで行っていたのだが、いろいろ限界があった。数え上げで解決しようとすると組み合わせ問題になるので、貧弱な私の計算環境では単語uni-gramしか対応できず、bi-gram以上の精度は壊滅的だった。例えば「come up with」の共起語はuni-gramの合成だと「come」「up」「with」のそれぞれとの共起率の相乗平均が高いものということになるので、「picked, have, grow, which, would, from, overtake, set, who, invent, back」とかになってしまう。それらはほとんど意味をなさない。また、TF-IDFで重み付けしても機能語が残ってしまっていて、「the」「of」「have」などが採用される確率が高かった。そして、コーパスの偏りが結果に如実に反映されていて、「dictionary」「wikipedia」などをストップワードにしてもなお、「age」「history」といった語が無関係に採用されることがあった。

従来の言語モデルで解けるような仕事はLLMも大得意なので、ChatGPTにやらせてみた。いつも通り、最初に「Generate a list of co-occurrence words of the given phrase.」といった指示を書いて、それからfew-shotの例を並べてやると、それっぽい回答を出してくれる。さらに、WordNetの語義を選ばせた際の手法に倣い、few-shotの順序を入れ替えて複数回実行した結果を集計している。今回得た知見だが、ChatGPTはfew-shotの例をそこそこの数(5個以上)示してあげたほうが精度が安定するっぽい。

結果の例をいくつか挙げてみよう。「come up with」の劇的な改善に刮目せよ。

  • come up with : idea, solution, plan, answer, invent, devise, think, design, create, picked
  • shock : trauma, wave, surprise, electric, horror, therapy, death, earthquake, treat, stun
  • fish : swim, tank, aquarium, pond, ocean, lake, river, sea, shoal, school
  • motor : engine, vehicle, neuron, car, boat, motorcycle, electric, nerve, rotor, drive
  • according to : report, say, police, official, study, bible, source, claim, data, survey
  • in order : to, that, for, do, need, get, make, have, take, keep
  • human : being, body, right, life, person, health, mind, world, animal, behavior
  • week : ago, last, next, weekend, day, month, year, today, yesterday, sunday
  • how much : money, cost, price, time, long, far, many, big, more, less, tall, large

とてもうまくいっている感じだ。見出し語が使われる文脈に特徴的に現れる語彙をきちんと補足できている。内容語の共起語としては内容語が多く選ばれ、機能語の共起語としては機能語が多く選ばれている。「according to」の共起語として、「report」「police」「official」あたりが来るのは、わかってらっしゃると思う。とはいえ、ChatGPTの仕事も常に正しいというわけではないし、たまに生成に失敗することもあるので、そのデータだけを使うわけにはいかない。よって、従来の自前の言語モデルの結果と混ぜることにした。

共起語のリストは例文の選択をする際にも役立つ。「according to」の例文が欲しいとして、どんな例文が嬉しいかといえば、「accoridng to police」(警察発表によると)や「according to the research」(その研究によると)といった典型的な言い回しを含むものだろう。そして典型的な言い回しは典型的な共起語を含む確率が高い。よって、例文を選択する際の重み付けに共起語リストの語が含まれているかどうかも利用することにした。従来は、見出し語の典型的な訳語が例文の訳語に含まれているかどうかを重み付けにしていたのだが、それだと翻訳精度に影響を受け、また表記揺れに弱いという性質があった。共起語リストを使う手法だとより直接的に関連する例文を選べるようになる。表記揺れに関しては既存の屈折語のリストを使うことで対処できる。

例えば、「strict」の共起語としては、「rule, discipline, diet, parent, rigidly, guideline, teacher, irreflexive」などが登録されている。例文選択で共起語を含むものを優先するようにしたところ、以下のものが採択された。ちゃんと「rule」「teacher」「parent」を含む例文が取れている。

  • There is a very strict rule forbidding smoking in bed.
  • A strict father makes his children toe the line by thorough training.
  • When the teacher is very strict, the students must mind their P's and Q's.
  • 500 policemen were put on strict alert.
  • Thus, strict rules apply for entrance, including church membership and regular attendance.
  • They have a strict idea of time.
  • Both of my parents are not strict with me.
  • They accused the teacher of being too strict with the children.

もう一つ例を。「rice」の共起語としては、「crop, dish, grain, food, cook, university, field, ricer, paddy, maize, bowl」などが登録されている。そして、以下のものが採択された。ちゃんと「bowl」「dish」「grain」「crop」を含む例文が取れている。

  • A bowl of rice is about 180 grams.
  • Curry and rice is my favorite dish.
  • I spread the rice grains evenly over the floor.
  • There's a good chance that this year's rice crop will be up on last year's.
  • What is peculiar to Japan at mealtimes is that people eat rice out of little bowls.
  • Needless to say, dealing in rice is a declining industry.
  • Young rice plants will be badly harmed.
  • When did the Japanese start eating polished rice?

今回の結果は統合英和辞書の内容表示と類語検索(シソーラス検索とも言う。内容表示のページで「類」アイコンを押すべし)とKindleの例文辞書の設定に反映されている。類語検索の結果に複数語の類義フレーズが採れる確率がかなり上がったのと、例文がより自然になったのは感じていただけると思う。

ついでに、類語検索の強力さをここで伝えたい。類語検索は上述のように、任意の見出し語を核として、その概念に近い見出し語の一覧を提示してくれる機能だ。何か単語をど忘れした時に、近い概念の単語を入れて類語検索した結果を見ていけば思い出せることが多い。例えば、「アゲアゲな気分にさせる」的な意味の言葉で「ex」で始まる言葉があったよなーと思っても、普通の和英検索だと調べにくい。「アゲアゲな気分」なんて訳語は辞書にはないからだ。ここで、「高揚させる」という言い換えが思いつけば、一撃で正解の「exhilarate」に辿り着けるだろう。しかし、辞書に収録されていそうなうまい言い換えが思いつかないことも多い。そんなときは、適当に意味が近そうな単語として「energize」の類語検索をしてみる。

この結果を見て、正解のものがあればよいが、今回はない。よって、結果の中で最も意味が近そうな英単語または訳語の類語検索を実施する。この場合、「invigorate」を核にしても、「鼓舞する」を核にしても、正解に辿り着ける。

訳語を核とした類語検索は特に強力だ。例えば「褒める」で類語検索すると、「褒める」を訳語に含む英語の見出し語のリストを生成してから、それらの同義語や共起語や訳語を抽出して、その中心概念をベクトルとして表現した上で、それにコサイン類似度が近い見出し語を取り出してくれる。つまり「褒める」を訳語に含むものを探す替わりに、褒めるという概念を表現しているものを探してくれる。これは英作文で適切な語彙を選択するのに大いに役立つ。詩を書く際にも役立つだろう。しかも、使う候補の言葉を決めたらその語をクリックすると意味や例文がわかるので、実際の使い方もすぐ把握できる。この機能はそこらのシソーラス辞典よりもかなり便利だと我ながら思っている。今回の改善でその精度がさらに増したので、虎に翼だ。

もう改善案は出尽くしたと思っていたが、就寝前に寝床でぼーっとしていたら思いついてしまったので、サクッと実装してみた。といっても、生成タスクはプロンプトを発行するだけなので、大した仕事じゃない。むしろ結果の共起語をどう活用するかの方に頭を使った。

まとめ。英和辞書の見出し語の共起語のリストをChatGPTに作らせた。その語の文脈で特徴的に現れる語をきちんと取れた結果として、よりわかりやすい辞書になった。類語検索や単語帳や例文辞書の精度も上がった。共起語の選択というのは言語モデルの元来の仕事といっても過言では無いので、うまくいくのも当然だ。餅は餅屋ということか。