豪鬼メモ

一瞬千撃

英単語の獲得年齢の分析

英単語の獲得年齢の統計値を辞書に統合してみた。データがない語に関しては関連語から推定することで、主要な語のほとんどをカバーすることができた。このデータを使うと、実力別の英単語集や実力診断テストなどを自動生成することができるようになる。

獲得年齢とは

英単語を何歳の時に覚えたかを多数の人に聞いて平均を取ると、それぞれの単語をいつまでに覚えているのが普通かという指標が得られる。それを獲得年齢(以後、AOA=Age of Aquisition)と呼ぶ。Amazon Mechanical Turkを使ったクラウドシーシングでその調査を行った研究者がいて、その評価がこの論文にまとめられている。調査対象の語彙と統計値がCSVファイルとして公開されていて、3万語以上も収録されている。このデータを元にして、WordNetとWiktionaryを統合した辞書に収録された、より多くの英単語のAOAを推定したい。これができると、レベル別の単語集や実力診断テストを自動生成できるようになる。

AOAのデータベースには、各単語について、被験者全体のAOAの平均と標準偏差が記録してある。母集団のAOAが正規分布すると仮定すると、平均に標準偏差を足した値の年齢であれば、約85%の人がその単語を知っているということになる。例えば「mother」の平均は2.63で標準偏差は1.07なので、3.7歳の85%がそれを知っているとみなせる。「motherfucker」の平均は9.74で標準偏差は5.11なので、14.85歳の85%がそれを知っているとみなせる。一般論として、半分の人しか知らない単語を会話に使うべきではないし、知らなくても問題ない。一方、85%が知っているなら、自分は積極的に使わないにしても相手が使ってくる可能性は高いわけで、その単語は獲得しておくべきだろう。ということで、この「平均 + 1シグマ」をAOAの代表値として扱う。

ところで、学習用の英単語集は各社が出版していて、私は30冊ほど持っているが、そのどれもが、学習者のレベルに合わせた単語の集合を選定することに労力を払っている。全ての英単語を収録するわけにはいかないし、収録できたとしても覚えきれるわけがないので、学習者にとって有用度の高いものを選定するのは必然だ。その選定をどうやって行うのかが編者の腕の見せ所のひとつであるわけだが、おそらく多くの場合は、適当なコーパス内の頻度を分析して頻出語を抽出した上で、それを人間が分類して最終的な選定を行なっているだろう。この恣意的な工程は、コーパスや作業者のバイアスから免れることはできず、どうしても漏れが発生してしまう。例えば、ネイティブ英語話者が日常で使っているであろう「sassy」「bossy」といった語は、私が持っている30冊のどれにも収録されていなかった。大学入試やTOEICの問題文で生意気だったり横暴だったりするキャラはあんまり出てこないからか、Weblioやら英辞郎やらについている「単語レベル」的な指標でも、そういった日常語は重要視されない。しかし、それらは現地の小学生ならみんなが知っているということをAOAのデータベースは教えてくれる。「sassy」は11.4歳、「bossy」は10.6歳である。

今回は、AOAデータベースを使って、レベル別単語選定の作業を完全自動化できるようにする。そして、極力漏れがなく、また直感的かつ実用的な順序になるようにしたい。AOAを元にする事で、大学入試とかTOEICとかTOEFLとかの偏ったコーパスに最適化された語彙ではなく、ネイティブ英語話者が自然に単語を習得する順序を再現することを目指す。

Wikipediaを使った回帰分析

AOAのデータベースはサンプリング調査で得られた結果に過ぎないので、全ての単語が載っているわけではない。すなわち、データベースに載っていないからといって重要語でないというわけではない。今回はできるだけ多くの単語を網羅的に扱いたいので、辞書にある全ての単語においてAOAを推定することが望ましい。そのために単語の出現率を用いる。以前Wikipediaにおける単語の出現率(任意の1文にその語が出現する確率)を算定してデータベースを作っているので、それを使う。よく使われる単語ほど早いうちに習得されるという仮定は妥当だろうが、具体的にどういう式にするかは悩ましい。

ぱっと思いついたのは、出現率の対数をもとに回帰分析を行うことだ。AOAデータベース内の全ての単語を対象とした結果としては、log(p) * -0.52 + 7.93という式が得られる。相関係数は0.414ということなので、あてずっぽうに答えるよりはマシな推定だとは言えそうだ。しかし、この理屈だと、AOA調査のサンプリングに漏れた時点で、出現率が100%だったとしても、7.8歳未満の子供は知らなくてもしょうがないという判定になってしまう。出現率が0.000001%だったとしても、17歳なら知っているべきという判定になってしまう。相関分析で得られるのはlog(p)とAOAの相関の強さであって、切片や傾きの妥当性ではない。回帰分析の結果を無視して適当な切片や傾きをつけても相関係数は変わらない。なので、log(p) * -1.5 - 1という式でも相関係数は同じ0.414だ。その場合、出現率が20%である「a」は1.8歳、出現率が0.000001%である「cryobiology」は21.6歳ということになるが、誤差は拡大しているのにもかかわらず、その方が何だか納得できるような気がしてしまう。相関係数だけで近似式の妥当性を判断するのは危険だ。

実際のデータを眺めてみたところ、どうも出現率が低い語では相関が低いっぽい。サンプル数が少ない事象の精度が低くなるのは当然だし、Wikipediaの語彙が偏っているというのも原因のひとつだろう。一方で、頻出語に関しては比較的に精度が期待でき、また偏りの程度も低いことが期待できる。よって、出現率0.002%以上の10974語に絞って回帰分析をしてみたところ、log(p) * -1.0 + 3.3という式が得られる。その際の相関係数は0.43だ。相関係数はあんまり気にしていないのだが、切片が3.3になったのが嬉しい。100%の出現率なら3.3歳で獲得しているはずだという理屈は何だかそれっぽい。まあ、こじつけの類ではあるが。

単語の出現率とAOAに相関があるのは明らかだ。しかし、たとえネイティブ英語話者の発話行為全てを収録した理想的なコーパスがあったとしても、そこでの出現頻度だけから高い精度でAOAを推定するのは難しいだろう。出現率を使った推定は最後の手段として有用だが、他の手段も検討すべきだ。

WordNetWiktionaryを使った派生語への伝搬

AOAのデータベースは基本語彙の多くについてカバーしてくれるが、派生語は除外されていることが多い。例えば、"anticipate" は載っているが "anticipative" は載っていない。ただ、"anticipate" を知っている人なら、たとえ "anticipative" という綴りを見たことがなかったとしても、「anticipate(予期する)の主体になりがちな」という意味の形容詞であることは何となく理解できるだろう。とはいえ、実際には初見で理解できるかが問題ではなくて、例文に触れるなどして使いこなせるようになっているかが問題である。よって、派生語である "anticipative" のAOAは、その派生元である "anticipate" のAOAに出現率を加味して推定するのがよさそうだ。"anticipate" のAOAは9.61歳であり、その出現率は0.1676%である。そして、"anticipative" の出現率は0.001%であるから、上述のlogを使った回帰式を変形して当てはめて、(log(0.0016) - log(0.00001)) * 1.0 + 9.61で14.68歳ということにする。つまり、出現率の対数の差に回帰式の傾きを掛けた値を足すのだ。単にその語の出現率から推定するよりは、派生元との比較で推定する方がマシであるという仮定である。

派生語の派生元をどうやって突き止めるかが問題となる。WordNetには派生語というリンクがあるのだが、そこにはなぜか明らかに派生語ではない語が混じっている。例えば "lazy" の派生語としては、"sloth", "laziness", "idleness", "slothfulness", "indolence" が記載されているのだが、その中で派生語と呼べそうなのは "laziness" だけだ。となると、綴りが似ている語だけに絞ることが必要になりそうだ。ただし、単に "lazy" と "laziness" の編集距離を見るような方法だと、接尾辞の影響を受け過ぎてうまくいかない。そこで、手製の品詞毎の接尾辞のリストをつかって語幹を取り出した後に編集距離で比較することにする。

noun_suffixes = [
  "ment", "age", "tion", "ics", "ness", "ity", "ism", "or", "er", "ist",
  "ian", "ee", "tion", "sion", "ty", "ance", "ence", "ency", "cy", "ry",
  "al", "age", "dom", "hood", "ship", "nomy",
]
verb_suffixes = [
  "ify", "en", "ize", "ise", "fy", "ate",
]
adjective_suffixes = [
  "some", "able", "ible", "ic", "ical", "ive", "ful", "less", "ly", "ous", "y",
  "ised", "ing", "ed", "ish",
]
adverb_suffixes = [
  "ly",
]

WordNetには品詞情報があり、"laziness" は名詞であると分かる。名詞を作る代表的な接尾辞の中の "ness" に後方一致することが判定される。そうすると "lazi" が語幹として残る。それを候補である "lazy" と比較して、派生元かどうかを判定する。完全一致だと "lazi" には一致しないので、前3文字が一致してかつ編集距離が1以下であれば的確とみなすようにする。「"i" で終わっていたら "y" と同一視する」みたいなルールを書き足しても良いのだが、例外も多数あるので、編集距離を使う方法が現実的にはうまくいく。同様にして、動詞 "internationalize" からはその派生元 "international" が得られるし、形容詞 "convertible" からはその派生元 "convert" が得られるし、副詞 "beautifully" からはその派生元 "beautiful" が得られる。

WordNetメタデータだけだとカバー率がそんなに高くないので、Wiktionaryも併用したい。WiktionaryにはEtymologyという項目であり、そこの語の構成が載っていることがある。接頭辞と語幹と接尾辞に分けてくれるのだ。例えば、"largely" は語幹 "large" に接尾辞 "ly" という構成である分かる。"international" は接頭辞 "inter" に語幹 "national" がついた構成であると分かる。接頭辞は単語の意味を変えすぎるので、接頭辞がある場合には無視する。語幹と接尾辞のみで構成される場合、その語幹に一致する語を派生元とみなす。

派生語と同様に、動詞の現在分詞(または動名詞)と過去分詞も辞書の見出し語として独立して扱われる場合がある。"strike" の現在分詞である "striking" や、"age" の過去分詞である "aged" は独立した見出し語になっている。それらの多くもAOAのサンプリングから漏れているので、派生語に準じて、原形の語のAOAを伝搬させる。ただし、分詞は独立した単語ではなく、屈折形の出現と区別がつかないので、出現率で調整するのは妥当ではない。分詞の意味は原形動詞の意味とほとんど同じであり、原形動詞を獲得していればその分詞も獲得しているとみなしても問題なさそうだ。とはいえ、ほんの少し含意が増えている場合もあるだろう。そのあたりを加味して、原形動詞のAOAに1を足した値でお茶を濁す。形容詞の比較級と最上級が独立した見出し語についても同様の処理を行う。

元々は31125語に付与されていた獲得年齢情報を各々の派生語に伝播させたところ、新たに18042語に付与されて、合計49167語になった。 "gone"(5.8)、"usually"(12.1)、"beautifully"(10.7)、"broken"(8.4)、"carefully"(7.8)、"largely"(10.6)などの語が新たにAOAを持つようになった。WordNetWiktionaryのデータが不完全なことで取りこぼす派生語はあるが、誤って派生語だと判断された例は今のところ発見していない。

カバー率の評価

これらの工夫の結果、主要単語における獲得年齢のカバー率がどのくらいになるかを見てみたい。となると、主要単語の集合を獲得年齢のデータベースとは独立して取得しなければならないのだが、とりあえずは英辞郎に収録されている標準語彙水準SVL12000SVLという指標を使ってみる。公式サイトによると、"ネイティブスピーカーの「使用頻度」をベースにしながら、日本人学習者にとっての「有用性」「重要性」を考慮して単語の選定を行いました" とのことであり、実際のデータを見た感じでも確かに重要そうな単語が揃っているように思う。12000と言いつつなぜか11998語しか載っていなかったが、そのうち11165語(93%)は元のAOAデータベースでカバーされている。残り833語(7%)をどう攻略できるかが問題だ。

派生語と分子によるAOAの伝搬を行ったところ、SVL12000中の11728語(97.7%)をカバーして、残りは270語(2.3%)となった。残った単語以下のようなものだ。

April  February  Friday  July  June  Monday  Mr.  Mrs.  Ms.  OK
October  September  Thursday  Tuesday  Wednesday
already  am  an  are  been  children  could  did  does
eighteen  fourteen  has  hi  is  its  men  most  nineteen
o'clock  seventeen  seventy  should  theirs  thirteen  twenty
video-tape  was  were  whose  worst  afterward  ah  anywhere

曜日と月名と略語と数詞がまず目に付くが。これらは自明なので無視して良いだろう。そして残りの多くは統合辞書の見出しになっていない屈折形がほとんどで、それらは原形動詞の屈折形として検索可能なので、無視して構わない。「whose」とかの機能語もどうでも良い。「already」「truly」の類が取れていないのが最も気に掛かる。

フォールバック

ここまでの工夫をしてもAOAがどうしても付与できなかったものは、仕方ないので、出現率から推定するフォールバックで対処することになるだろう。辞書には出現率のみを登録しておくことで、アプリケーション側で任意のフォールバックを実施してもらうのが現実的だろう。出現率から推定するもよし、相互共起率が最も高い単語を探してAOAを伝搬させるもよし、見捨てるもよしだ。曜日や月名などに関しては手で設定してしまうのが無難だろう。曜日は「week」と同時期とすると5.11、月名は「month」と同時期とすると5.79といったところか。

単語集を自動作成するという目的に照らして考えると、重要語が漏れていないことが第一に重要で、少数の語のAOAの値が多少ぶれていてもあまり問題にはならない。曜日や月名や「already」や「truly」は小学生なら知っていそうなものなので、AOAが付与されていなくてもカバーしておきたい。それらの一般的な頻出語は、どれだけWikipediaが偏ったコーパスであるとしても、頻出語として検出できる。よって、AOAが付与されている単語に加えて、推定AOAが十分に低い単語を抽出すれば、十分なカバー率が得られるだろう。

AOAの推定に関しては、出現率に応じて5歳から22歳くらいまで適当に分布する値が設定できさえすればよい。とすると、log(p) * -2.2 - 8 とかが良さげだ。出現率0.2%の「already」が5.6で、出現率0.02%の「truly」が10.7で、出現率0.002%の「kindle」が15.8で、0.0002%の「deferral」が20.8で、0.00002%の「cacophonous」が25.9ということで、だいたいそれっぽい。測定AOAよりも推定AOAはちょっと高めに出すくらいが望ましい。その上で、AOA測定値およびその推定値で昇順にソートして上から見ていけば、それっぽい学習ができるだろう。

大文字と小文字

WordNetでもWiktionaryでも、見出し語の大文字と小文字と小文字は区別される。「Japan」は「日本」の意味であり、「japan」は「漆器」の意味である。よって、統合辞書でもそれらは区別して扱いたいが、AOAのデータベースでは大文字と小文字は区別されていない。これは困った問題だ。「Japan」の場合、頻度から考えて「Japan」が優勢なので、AOAはそれにのみ付与することが考えられる。しかし、それだと「japan」という単語が無視されることになってしまう。まあ、「japan」はそんなに重要な言葉ではないので百歩譲って無視してもよいだろう。でも、「may」と「May」は両方とも明らかな重要語であり、小学校に入る前に習得すべき言葉だ。

いまのところ、この問題に関して適切な解法は思いつかない。文頭が大文字になる英語の作法により、コーパス中の頻度では大文字語と小文字語を区別できないのが痛い。しかたないので、ヒューリスティクスお茶を濁す。辞書内の記述の分量が多い方を主として、少ない方を従とする。AOAデータベースからの値は主の見出し語のみに与えて、従の見出し語には主のAOAにバイアス値を加算した値を与える。分量の割合を0.5から引いた値の4倍をバイアス値とする。割合が0.1なら、(1 - 0.1) * 4 = 1.6 を足す感じだ。バイアスの最大値は2ということになるが、辞書でほとんど説明されないマイナーな同級異議語も、元の語を覚えて2年も経てば覚えるだろうという仮定に基づく。というか、「japan」と「May」が両方うまくいくようにするにはこれしか思いつかなかった。

まとめ

WordNetの単語をAOAの昇順に並べると、7歳までに1852語、10歳までに7665語、13歳までに18523語、16歳までに34088語、19歳までに46123語を覚えるべきという結果が得られる。多いな。具体例を見ると、16歳の時点で「transfusable」「hyoid」「represser」「labia」「ocarina」といった単語を覚えているのが普通ということがわかる。なんだか難しそうな単語だが、「注入可能」「舌骨」「抑圧者」「陰唇」「オカリナ」と日本語で書けば、16歳の多くが知っていてもおかしくない気がする。抽出したデータのCSVファイルをここに置いておくので、実際に確認してみていただきたい。

英単語の獲得年齢(AOA)のデータベースを辞書に適用して、ネイティブ英語話者と似たような優先度で語彙を増やすべく並べる方法について検討した。とはいえ、並べたからって覚えられるわけじゃない。「ネイティブ並みの語彙力」なんてよく言うけども、非ネイティブがそれを獲得するのは生半可な努力では済まないということはよくわかった。中学生並みになるって考えても2万語くらいは覚えねばならんのだ。

重要語彙といえども全部暗記しようとするのは無謀だが、一度くらいなら見たことがあるという状態にしておくというのは有益だろう。その意味では、AOAをもとに辞書の収録語を並び替えた、カバー率最強の単語集を作るのは面白い考えだと思う。もう必要なデータは揃ったので、あとは適当に整形して出力するだけだ。