コードネームは初話ユウ

自然言語処理でいろいろやってみる

単語数・出現頻度・カバー率

係り受けもまだ終わったわけではないが、そこそこ精度も出たし改善案も見えているしで一段落してはいるので、同じことをずっとやってるのも飽きるというのもあり、そろそろ次のステップのことを考えはじめている。

 

まだ明確にやることが決まっているわけではないのだが、何をするにせよ、各単語の意味なり用法なりを記述した、いわゆる「辞書」を作ることが必須になりそうだ。イメージとしてはWordNetとかFrameNetとかあんな感じのもの。もちろんWordNetやFrameNetそのものではだめで、新しく作る必要がある。

 

しかし、辞書を一から作るとなるととんでもなく大変な作業なので、単語数どれだけいるのか?よって工数はどのくらいになりそうか?を見積もる必要がある。また、いきなり全単語を網羅する完全な辞書ができるわけはないので、当初は小さい辞書を作ってプロトタイプを作る、といったことになるだろう。そうすると、最初に辞書に入れるべき単語はどれか?また、単語いくつあれば、文章全体の何%がカバーできるのか?といったことが気になってくる。今回はそのあたりの情報を収集してみたのでまとめておく。

 

まず、日本語の単語数とは一体いくつあるのか?ウェブ上の国語辞書「デジタル大辞泉」は見出し語24万だそうである。だがこの辞書、見出し語をざっと見ると、私もさっぱり知らないような単語ばかり並んでいる。一般的な日本人の語彙はもっと少ないはずだ。

 

IPA辞書 mecab-ipadic-2.7.0-20070801 では品詞ごとにcsvになっているので、各品詞の数も wc -l 等で簡単にわかる。

 

   27210 Adj.csv

     135 Adnominal.csv

    3032 Adverb.csv

     199 Auxil.csv

     171 Conjunction.csv

      19 Filler.csv

     252 Interjection.csv

    3328 Noun.adjv.csv

     795 Noun.adverbal.csv

   60477 Noun.csv

     120 Noun.demonst.csv

      42 Noun.nai.csv

   34202 Noun.name.csv

      42 Noun.number.csv

   16668 Noun.org.csv

     151 Noun.others.csv

   72999 Noun.place.csv

   27327 Noun.proper.csv

   12146 Noun.verbal.csv

       2 Others.csv

      91 Postp-col.csv

     146 Postp.csv

     221 Prefix.csv

    1393 Suffix.csv

     208 Symbol.csv

  130750 Verb.csv

  392126 total

 

動詞と形容詞は活用形の違いも1語にカウントされているのでだいぶ多くでていることに注意。ちなみに{Verb,Adj}.csvを'基本形'でgrepすると、それぞれ15446/3641行ある。Nounは固有名詞も含んでいるので多くなっている。予想はしていたが、やはり名詞が圧倒的に多い。

 

参考までに英語の単語数は、WordNetの情報がある:

 

POS     Unique      Synsets    Total

             Strings                 Word-Sense Pairs

Noun   117798    82115   146312

Verb   11529   13767   25047

Adjectiv   21479   18156   30002

Adverb    4481   3621   5580

Totals   155287   117659   206941

 

形容詞が動詞より多い等、若干傾向が違うが、大筋似ているようだ。まあそれはさておき。

 

この記事 によると、小学生向け辞書で3万語、高校向けで8万語くらいを収録のようだ。ただこれも、一般的な小学生/高校生の使う語彙よりかなり多く収録していると思われる。

 

…などと探しているうち、そのものずばり理解語彙数を調べた記事を発見:

 

>小学生レベル: 5千~2万語

>中学生レベル: 2万~4万語

>高校生レベル: 4万~4万5千語

>大学生レベル: 4万5千~5万語

 

だそうである。

 

一方、wikipedia 語彙 によると:

 

>満年齢で6歳になる子どもの場合、理解語彙の総量は、およそ5000~6000語ほど。

>13歳では3万語前後。20歳ではおよそ4万5000~50000語ほどという調査結果が出ている。

 

とのことなので、まあ大体こんなもんか。

 

ちなみにこれらは*理解*語彙(見て/聞いてわかる語彙)であって、使用語彙(実際に自分が使う語彙)はもっと少ない。これがどのくらいか、あまりちゃんと調べてないが、こういう発表が見つかった: 「日本人のオンライン・コミュニケーション上での平均使用語彙数は8,000語である」

 

理解語彙の5万よりだいぶ少ないが、まあ5万といってもひとりひとり(専門等によって)かなり違い、共通するものは少ないのかもしれない。たしかに女子高生の会話なんか聞いたってちんぷんかんぷんだし。文系の人にプログラムの話してもわかってもらえないし。ツイッターで専門の深い話なんかしないだろうし。というのを考えると、誰もが使うような共通項の語彙というのは8000程度なのかもしれない。

 

もう少し別な観点からも見てみよう、ということで、外国人向けの日本語能力検定試験についても調べてみた。日本語能力検定試験は2010年に制度が変わっているのだが、2009年までの旧試験では語彙数の目安が示されていた、と http://ja.wikipedia.org/wiki/日本語能力試験 にある。

 

1級 10,000語程度 社会生活をする上で必要な、総合的な日本語能力

2級 6,000語程度 一般的なことがらについて、会話ができ、読み書きできる能力

3級 1,500語程度 日常生活に役立つ会話ができ、簡単な文章が読み書きできる能力

4級 800語程度 簡単な会話ができ、平易な文、又は短い文章が読み書きできる能力

 

2010年からは「*級」に代えて N1, N2, N3, N4, N5 と呼ぶように変わった。

N1/2/4/5がそれぞれ旧1/2/3/4級に相当し、旧2級と3級の間にN3を新設したとのこと。新制度では語彙数の目安が出されていないが、N3以外はおおむね上記が目安になると考えてよいのだろう。

 

「日本語単語スピードマスター」という単語集シリーズがある。N1/2/3/4・5向けに4冊あり、単語数は下記のとおり:

  N1向け   2800語

  N2向け   2500語

  N3向け   2400語

  N4,5向け 1800語

 

下から累積をとっていくと、ほぼ上の数字に近い。このことからも、大体合ってると考えてよさそうだ。

 

大きな書店に行けば、試験用問題集が置いてある。その問題を見てみると、N5はやはり一見して漢字が少なく、文型も限られたものしか使っていなくて、小学校低学年向けのような印象を受ける。N4になるとだいぶ漢字が増え、一見するとかなりまともに見える。ただよく見るとやはり使用する表現が限られているのがわかる感じ。N3になると、ふりがなが振られている点を除けばほぼまっとうな文章に見える。

 

次に、単語の「カバー率」を考えてみる。カバー率とは、日本語の文章(コーパス)をとってきて、上位N語の出現頻度を指すとする。

 

こんな記事 がある。これによるとカバー率は

 

   1000語  60.5%

   2000語  70.0%

   3000語  75.3%

   5000語  81.7%

 

原典はあたってないので意味する正確なところはわからない(単語なのか、形態素なのか。機能語を含むのか、等)。まあ目安にはなるだろう。

 

ウェブ記事を鵜呑みにするのは心配なので、少し実データでも検証したい。そこで、「日本語ウェブコーパス 2010」で検証してみる。これは矢田 晋氏がウェブ(1億ページ!)から収集したコーパス。生テキストは69GBありなかなか扱いづらいが、形態素Ngramもついている。ここでは単純に、形態素1gramを見てみる。 

http://dist.s-yata.jp/corpus/nwc2010/ngrams/word/over9/1gms/1gm-0000.xz

XZutilsというあまり一般的でない(?)圧縮ツールを使っているのでご注意。ツールのリンクもついていてダウンロードできる。

 

各行は「単語(形態素) 出現回数」の形式なので、 sort --key=2 とかで回数でソートする。そうすると先頭の方はこんな感じになる:

 

<S>     5634102353

</S>    5634102353

の      4124326304

、      3080970756

に      2241587693

は      1972344221

を      1947665622

て      1882399603

 :

 

ここから記号の行を除き、先頭N行の回数の和を数えればカバー率が計算できる。結果:

 

 #words    count      %

   1000 n=50038713048  67.2

   2000 n=55532769489  74.6

   3000 n=58676956041  78.8

   5000 n=62396742459  83.8

   6000 n=63607914650  85.4

  10000 n=66672728062  89.6

  12000 n=67643928325  90.9

  20000 n=69964954129  94.0

  50000 n=72652408894  97.6

 100000 n=73618811012  98.9

4027873 n=74410612034 100.0

 

注:

・除いた記号行は全部ではなく、先頭いくつかを手で除いただけである。

・「単語」でなく「形態素」なので、動詞や形容詞の活用形はそれぞれひとつとカウントされる。

形態素解析mecab+ipadicを使っているとのこと。mecabの解析は、かなり精度はいいもののやはり時々間違いがある。定量的な数字を持っていないが、分ち書きに関しては誤り2-3%といったところだろうか?その程度は誤差を含むと思ってほしい。