読者です 読者をやめる 読者になる 読者になる

コードネームは初話ユウ

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

システム稼働開始

まただいぶ間が空いてしまったが、以前記事に書いた「オブジェクト指向意味理解システム」をここしばらく作っていた。去年8月頃から始めて、仕様作成3か月、コーディング半年弱。諸事情により1か月強中断の後、デバッグを1か月程してきたところ。ようやく、例文を平文で入力して、(ログを見るかぎり一見)正しく解析して出力を返すところまで来た。まだまだバグはありそうだし、またとりあえず動かすこと優先で作ったため、一部の機能は簡易化した実装になっている部分もあるものの、とにかくも最初から通して動いてくれるとやはり安心感がまるで違う。

システムの概要としては、以前の記事(これこれ)に書いたほぼそのとおりの物を作っている。眼目は

 ・係り受け、WSD、照応解析、述語項解析を同時に行う
 ・名詞の背後に「オブジェクト」を想定し、その属性をトラッキングする

の2点。

なお前処理として、形態素解析mecabを、文節分割はcabochaのそれをそれぞれ使っている。mecabの辞書はipadic固定。UTF-8固定。このあたりはkakarotと一緒。C++で現在5千行強。

プログラムは9割方できたと思うが、辞書はまだ例文を通すのに最低限必要なぶんしか入っていない(30エントリくらい)。とりあえずは日本語能力検定試験のN4レベル、2000語程度あれば日常会話程度は理解できそうなのでまずその辺を目指したい。だが辞書作成がかなり工数のかかる作業で、2000語は1年でできるかなぁ…というところ。まあ引き続き地道にやっていくしかないのだが。

小学1年の国語教科書でつつじのカバー率をみる

今作っているシステムで、機能表現については前回言及した「つつじ」をベースに文法を入れていこうと考えていた。つつじの機能表現には大きく分けて格補語系、文末表現系、接続関係系の3種があるが、私の作業上文末表現系、接続関係系の2つが当面気になっている。つつじはどの程度信頼できるのだろう?漏れはないのだろうか?

この点を検証するため、小学1年の国語教科書を調べて、使われている文末表現系、接続関係系の機能表現がつつじに含まれているかを調べた。

使った教科書は、教育出版の「ひろがることば」。1年ぶんが上下に分かれているが、両方みた。5年くらい前のもので、平成16年検定、とある。字が大きくスカスカなので、全部見てもそう大した量ではない(でなければそんなめんどくさいことやる気はしない)。人が目で見てのチェックなので、もしかしたら見落とし・勘違い等がないとはいえないことを付記しておく。

出てきた表現と、それがつつじにあった場合はつつじの分類・意味コードを記す。なければ'-'。ないものは、単独でわからなそうな場合は用例を示す。

【文末表現系】
ね 感嘆 w31
な 感嘆 w21
よ 感嘆?「みつけたよ」 -
の 疑問「たべたの?」 -
たい 願望 z31
う(よう) 意志 G11
た 過去 B21
か 疑問 x11
かな 疑問 x11
のだ(んだ) 説明?「…したんだ」 - (?判断D31?)
ている 継続 J31
てしまう 完了 B21
てくる 着継続 J33
ことの(が)できる 可能 E11
う(よう)とする 意志 G11
てもらう 受益 K31
れる(られる) 受動 -
ください 依頼 z26
せる(させる) 使役 -
てみる 試行? -
よう(みたい) 比況 R11
<以下下巻>
ことか 感嘆 w21
かもしれない 推量 I11
ようになる 自然発生 H11
ことがある 可能性? -
や 否定強調?「来やしない」 -

【接続関係系】
て 順接確定 r32
ながら 付帯 v21
と 順接確定 r31
たり 並列 -
たら 順接確定 r31
ように 目的?「人にわかるようにはなす」 -
てから 継起 p12
ては 反復 r33
から 理由 s22
ので 理由 s22
<以下下巻>
かぎり 範囲?「みわたすかぎり」 - (強調D44?)
ても 逆接仮定 t12
まま[で] 付帯 v11
ば 順接仮定 r21

以上、40表現中、11表現がつつじにない、という結果になった。カバー率72%。

もしかすると、私がつつじの定義なりを勘違いしてる部分もあるのかもしれない。たとえば「説明のノダ」は、もしかしたらつつじでいうと「判断 D31」とかなのかもしれない。つつじを見るだけでは、「判断のノ」ってどういうのを言うのかわからないのだ。同様に「強調 カギリ D44」もどういう用法のことかぱっとわからない。

ただそれにしても、小学1年レベルでカバー率8割足らずというのは、やはり物足りない。もちろん、批判しているわけではない。つつじの意義自体は私も大いに評価しているし、作成チームには大変感謝している。というか他に類似のものがないのでこれを使うしかないし。ただ、現状のつつじはおそらく「まず一発作ってみた」レベルだと思うので、これから実地で使っていくなかで更にブラッシュアップしていく必要があるんだろうな、また私のように使う立場からすると、「つつじを使うから安心!」とはいかず、自分でチェックして適宜追加する必要があるな、ということである。

小学1年をやって、次どうしようか、2年、3年くらいまでやろうか、迷っているところ。いずれやらなくてはいけなさそうな感じではあるが、けっこう大変なんだよな…

文末表現のパターン・組合せ

4か月以上空いてしまった。今何をやってるかというと、前回書いた「オブジェクト指向自然言語理解システム」をちまちま作っている。仕様書を作り、コード半分くらい?書いたところ。動くまであと更に半年くらいかかりそうな気がする。仕様書といってもけっこうあちこち抜けがあるので、コード書いてて「あれ?ここどうしたらいいんだろう」と考えこんで数週間、とかいうのもしばしば。

そういう数ある抜けの中で、文末表現のパターン・組合せをきちんと考えていなかったというのがあり、ちょっと考えてまとめてみた、というのが今回のお題である。

ここで「文末表現」と言ってるのは、テンス・アスペクト・否定・ヴォイス・モダリティの5つを指す。

テンス(時制) - タ(過去) のみ
アスペクト - テイル(進行)、テアル、テシマウ(完了) 等
否定 - ナイ、マセン のみ
ヴォイス - セル/サセル(使役)、レル/ラレル(受身) のみ
   *可能をヴォイスに入れる考え方もあるようだが、ここでは可能は除くとする
モダリティ - たくさん:後述

これらが実際の文でどういうパターン/組合せで出てくるのかをできるだけ網羅的に知りたい、という話なのだが、ちょっとググった程度では答えが見つからなかった。なので、自分の脳内で「こういう文は成り立つか?これはどうか?」などといろいろ試してみた結果をまとめたものである。もしかしたらどっかの文法書とかにまとめられてるのかもしれない。そうだと車輪の再発明だけど。また、もしかしたらどっか間違ってるかもしれない。その場合は指摘歓迎。

1)ヴォイスとアスペクト

・ヴォイスとアスペクトはこの順に出る。「食べられている」

・ヴォイスは使役受身同時がありうる。その場合は必ず使役->受身の順。
「食べさせられる」は使役受身が同時に、この順に出た例。「食べられさせる」はNG。

・ヴォイスのセル/サセル、レル/ラレルはそれぞれ、動詞のよって片方しか使えない
五段動詞はセル・レル、一段動詞はサセル、ラレルを使うと決まっている。
書かせる/書かれる <-> 食べさせる/食べられる

・ヴォイスとアスペクトは動詞にしかつかず、他(テンス・否定・モダリティ)より先に来る。
まず前提として、述語には A)動詞、B)形容詞、C)名詞+ダ、の3つがある。で、ヴォイスとアスペクトは動詞にしかつかない。(「赤くている」とかはNG)
ヴォイスとアスペクトは動詞の直後につくため、テンス・否定・モダリティより先に来る。
「食べていなかったらしい」「食べさせてしまったようだな」

・アスペクトは同時にひとつしか出ない。「食べていてしまう」はNG。


2)否定とテンス

・否定とテンスが同時に出るときは、必ずこの順で、続けて出る。
同時に出るのは「…なかった」「…ませんでした」のみ。いずれも否定が先。

・否定は同時にはひとつしか出ない。(※テンスは元々「タ」ひとつしかない)
 (ただし否定もテンスも、推量モダリティをはさんで2か所に出る場合を除く。後述)
「…しないません」はNG。 #とか何を当たり前のことを書いてるんだか…


以上の1)、2)をまとめると、モダリティが絡まない場合は、順序は
ヴォイス -> アスペクト -> 否定 -> テンス
になる。「食べさせていなかった」
また、アスペクト、否定、テンスはそれぞれ最大ひとつずつしか出ない。ヴォイスだけは使役受身が同時に出れる。

…ここまでは、内省でやっている部分が多いがまあたぶん正しいと思う。ここからがちょっと怪しくなる。


3)モダリティの種類

モダリティの分類についてはググるとけっこう情報が出てくるし、文法書にもある。細かい分類については若干違いがあるようだが、大枠は大体似ている。ここではそれっぽい分類を適当にひとつ挙げておく。

述べ立て: モダリティ標識なし。事実を事実として述べる。
 行く
 行った

表出: 一人称(話し手)の思い・意向を表す
 行こう  意志(*)

 行くつもりだ  意志
 行きたい    希望
 行ってもいい  許容

働きかけ: 一人称(話し手)から二人称(聞き手)への何らかの働きかけを表す
 行きなさい    命令(*)
 行ってください  依頼(*)
 行きましょう  勧誘(*)

 行った方がいい  忠告
 行くべきだ   義務
 行かなければならない/いけない 義務
 行ってもいいです 許可
 行かなくてよい  不必要
 行ってほしい 願望
 行ってはいけない 禁止

推量: 事態の認識について、話し手の確信度を表す
 行くだろう  断定保留
 行くかもしれない 可能性
 行くはずだ  含意
 行くにちがいない 思い込み
 行くようだ・みたいだ 推測
 行くらしい  推測
 行くそうだ  伝聞

その他: 
 行くのだ   説明
 行くわけだ  説明
 行くか?   疑問
 行くのではないか? 疑問
 行くね   感嘆
 行くわ   感嘆
 行きます  丁寧 
 …です   丁寧


その他のところのラベルの「説明」とか「感嘆」とかはいまいちしっくりこないが、たまたま私が見ていた本にこう分類されていた、くらいに思ってほしい。

網羅的にカバーしようと思うと他にもあるだろうが、100%を目指すときりがないので、このくらいでまあ現代日本語における実使用の9割以上はカバーしてるだろう、と仮に思って、これらについて検討するという方向で話を進めていく。

ちなみに網羅的にと思うなら、名古屋大のつつじがいちばんまとまっていると思う。これは「機能表現」のリストで、格助詞的なものや接続助詞的な表現も含んでいるが、文末表現にあたるのはおおむね w11-M11 である。モダリティだけでなくヴォイス、アスペクト、否定、テンスも含んでいる。


4)モダリティ標識間の出現制約

・「呼びかけ型」のモダリティは基本単独で使う
ここで「呼びかけ型」と言ってるのは、上で(*)をつけたものである。
「行こう」「行きましょう」などは、基本的にそのままの形で使うもので、これに他のモダリティがつくことはない。(ただし疑問の「か」、感嘆の「ね」は例外的につくこともある)

・非呼びかけ型は、次の順序で出る
 表出/働きかけ -> 推量 -> 丁寧 -> 疑問 -> 感嘆     (+)
 各カテゴリ内では、最大ひとつずつしか出ない
 「行くべきかもしれないですかね」
 「帰ってきてほしいにちがいありませんよ」

なお、「にちがいない」は既に否定が入っているので、これに否定がつくことは通常ない。(「ちがいなくない」とかいうのもまああるといえばあるが、これは通常でない、ある種ふざけた文だろう。こういうのは考えないとする。)感嘆の「ね」「わ」は大体何にでもつく一方、疑問「か」はたとえば「だろう」や「いい」「ほしい」等にはつくが「…だ」型にはつかない。こういうのは他にもあると思うので、(+)の可能な列がすべてありえる、と主張しているわけではない、という点は了解いただきたい。

『各カテゴリ内では最大ひとつ』については例は示さないが、興味ある方は確認してみてほしい。というのはこの辺、いろんな変な例を考えついてはチェック、というのをずっと続けていると、感覚がおかしくなってきて、何が正しいのか自信がなくなってくるのである。毒されていないフレッシュな頭でチェックしてみていただけると幸いである。

ウェブページとかもちょっと見て実際の文を検討しようとしたのだが、うだうだといくつもの文末表現が続くような文ってなかなかないのだ。まあ当たり前といえばそうなんだけど。だとしたらあんまりこんなとこで考えこんでも意味ないのか?少納言で検索しようとしたら、検索文字列10文字までしか受付けられなくて挫折した。


5)モダリティとヴォイス、アスペクト、否定、テンスの関係

・ヴォイスとアスペクトは、出るなら最初に出る。モダリティは必ずその後。
これは先に1)でも書いたように、ヴォイスとアスペクトは動詞につくため。

・否定とテンス(or その両方)は、推量モダリティの前と後で2回出現しうる
否定とテンスが同時に出るならば必ずこの順で、続けて出る、というのは2)で書いたとおり。なので否定とテンスをひとまとまりで考えることにする。ただしこれが丁寧と組み合わさると「なかったです」か「ませんでした」となり、後者では 否定->丁寧->テンス、となるので注意。
で、上の4)の非呼びかけ型の順序 (+) とここでの主張を合わせると、次の順序で出ることになる。

 ヴォイス -> アスペクト ->
 表出/働きかけ -> (否定+テンス) -> 推量 -> (否定+テンス+丁寧) -> 疑問 -> 感嘆  (#)

 「行くべきじゃなかったかもしれないですかね」
 「帰ってきてほしいようではなかったですよ」

くどいようだが、各カテゴリ内では、ヴォイスを除いて最大ひとつずつしか出ない。また推量がないならば、否定/テンスが2つ続きはしない。

否定が2回出る場合のそれぞれの意味は、推量の後の否定が「推量していること自体の否定」、推量の前の否定が「推量の対象の内容に関する否定」。(で合ってるだろうか)

1.彼は食べたいようだ     彼は今食べたそうにしている、と私が思っている
2.彼は食べたくないようだ   彼は今食べたくないのだろう、と私が思っている
3.彼は食べたいようではない  彼は今食べたそうにしている、と私が思っていない
4.彼は食べたくないようではない  彼は今食べたくないのだろう、と私が思っていない

言い換えると、「食べたいか食べたくないか」について、a)食べたい b)食べたくない c)どちらでもない、としたとき、私が思っているのは
1. a
2. b
3. b or c
4. a or c

という理解(で正しい?)

テンスが2回出る場合のそれぞれの意味は、推量の後のテンスが「推量している時点が過去か」、推量の前のテンスが「推量の対象が、推量している時点より過去か」で合ってるだろうか。

彼は食べたいようだ     彼が目の前にいて、今食べたそうにしている
彼は食べたいようだった   過去の時点で彼が目の前にいて、その時食べたそう

              にしていた


彼は食べたかったようだ   少し前まであったケーキが今はなくなっているが、

              彼はそのケーキを食べたかったみたいだな、と

              今私が見ていて思っている


彼は食べたかったようだった 過去の時点で、その時の少し前まであったケーキが

              その時にはなくなっているが、彼はそのケーキを

              食べたかったみたいだなと、
              その過去の時点で見ていた私が思っていた


まあとにかく、上の (#) がいちおう今回の結論。上でモダリティ標識だけで30個ほど挙げているが、2の30乗通りとかよりはかなり可能なパターンの数は絞れたと思う。


オブジェクト指向的な文章理解

前記事で書いた「係り受け・WSD・照応・述語項を同時に処理するシステム」において、評価関数はどのように作るべきか、の話。当然、日本語として「もっともらしい文」が高い点数になるようにしたい。では、文のもっともらしさとは具体的にどう(プログラムにわかる形で)表せばよいのだろうか。

 

はじめに、cabochaを思い出しておこう。cabochaでは、ある文節が別のある文節に「係っていそう」と思われるときにSVMがtrue/falseを返す。ここで素性として使われていたのは、(かなり乱暴に)ざっくり言うと、主に単語・品詞間の統計情報だった。コーパスによく現れた単語/品詞の組合せが、そのまま文のもっともらしさを表す、ということである。これはたしかに、「日本語のもっともらしさ」のかなりの部分を占める重要な要素ではあるだろう。しかし、さすがにそれ*だけ*ということはないだろう。評価関数では他に何と何を考慮すべきか?を検討する必要がある。

 

ちなみにkakarotはもっと単純で、単語は助詞・助動詞しか認識してなく、あとはほとんど品詞(細分類)間の結びつきやすさだけである。kakarotとcabochaの最大の違いは、単語間の選好性を使うか否かだと言ってよいだろう。以前書いたように、対KNBCの係り受け正解率はkakarot 83%, cabocha (v0.65, 京大コーパスで学習) 89%だった。つまり、

 単語間の選好性を使わずに、エラー率は17%まで下がる。

 単語間の選好性を使うと、その17%のうち6%は解決できたが、残り11%には依然対処できない

ということだ。単語間の選好性は重要ではあるが、明らかにそれだけでは足りない。では何が欠けているのだろうか?

 

前回書いたように、WSD/照応/述語項の情報を同時に扱うのは一つの有望な方向だと思っている。しかし考えているうちに、これでもまだ不十分ではないかと思えてきた。それは次のようなケースである:

 

  犯人は太朗で、次郎は無実と判明した。彼を逮捕するため…

 

「彼」の照応候補として「太朗」と「次郎」が挙がったとする。しかし、単語の選好性を見てもこの場合何もわからない。「太朗を逮捕する」と「次朗を逮捕する」で、表現上何も差がないからである。

 

では何をすべきだろうか?このケースで考えるかぎり、オブジェクト指向的な考え方を取り入れるのが最も自然な解決法に思える。単語を見るのではなく、オブジェクトを見るべき、ということである。

 

システムは、「太朗」という単語が出現した時点で、「人間」クラスのインスタンスを生成する。文を処理していく過程で、必要に応じてそのインスタンスのオブジェクト属性を追加していく。たとえば「犯人は太朗で…」を読んだところで、太朗オブジェクトの属性に「犯人」を追加する。「彼」の照応を考える時、照応候補をひとつずつ評価していく。先行詞「太朗」の評価では、「彼」の指すオブジェクトが太朗であると仮定して、「[太朗オブジェクト]を逮捕する」は自然か?と考える。すると、犯人属性を持つオブジェクトを逮捕するのは自然であるとわかるので、評価値が上がる。…といった具合である。

 

そういうわけで、評価関数の基本方針としては

 

 ・名詞はオブジェクトに対応させる

 ・文の処理結果をオブジェクトの属性に反映させる

 ・単語でなく、オブジェクト属性と述語の選好性に評価点を与える

 

ということになる。まあ評価関数は考えるべきことが多く、細かい話もいろいろあってこれだけというわけではないのだが、細部はまた暇があったらおいおい書いていくことにする。

 

さて、これ、アイデアとして正しそうだろうか?実際にシステムを作って評価してみないとわからない、というのが正直なところではあるが、自分の頭の中の処理を内省してみるに、おそらく正しそうな気がする。つまり、頭の中でオブジェクトを管理して、属性によっていろいろ判断しているような気がする。もう一つ、このアイデアがよさそうに思える理由は、述語項の先の、より深い意味理解(RTE等)にも役立ちそうな点。なので、この方向で突き進んでみる価値はありそう、というのが現時点での個人的感触。

 

今まで論文等見たかぎり、こんなふうにオブジェクト指向的な考えを取り入れた処理系はなかった気がする。(まあそんなきっちりサーベイしたわけではないので見落としあるかもしれないが。もしあったら指摘歓迎。)意味の表現形式としては、述語論理的なものが多かっただろう。しかし、述語的表現とオブジェクト的表現で、どちらが人間にとって自然かと言ったら、文句なくオブジェクトの方だろう、と思っている。述語論理型言語であるPrologと、オブジェクト指向言語であるC++Javaとでどちらが普及しているか?と考えてもその点は明らかだろう。

 

このようなシステムを作るのは、相応の複雑さはあるので工数はかかるだろうが、原理的に難しい点はなさそうな気がする。ぱっと見「やればできるだろう」という印象。オブジェクトを正しく指せるためには照応解析がきちんとできることが必須ではあるが、まあそこはできるものと仮定する。というか、照応解析もできないようではその先の意味理解などどうせおぼつかないので、ここは腹をくくって進む、と決める。逆に、オブジェクトとその属性トラッキングさえできればその先は、人間のように喋る「初話ユウ」の実現は案外それほど遠くないのではないか、という気すらする。いや錯覚かもしれないけど。

 

作成上のいちばんの問題はおそらく、辞書作成の工数。辞書は一から作らねばならない。既存の、mecab辞書のようなものは使えない。FrameNetや動詞項構造シソーラスなども、多少似ている点・参考になる面はあるが、やはり「流用して工数を減らせる」とはならない。実はここ数か月少し試していたのだが、2か月くらいかけて数百語という感じで、しかもちょくちょく「この単語どうすればいいんだろう?」みたいにつっかえることも多々あり、一人でやるとかなりかかりそうである。当初はN4の1800語くらいのパイロットシステムを作ろうとしているのだが、辞書も入れて1年でできるかなぁ?というところ。まあ気長にやっていくつもりだが。

 

そんなわけで、次回のブログ更新はいつになるかちょっと見えないが、なにか目に見える進展等あったらまた報告しますんで。

 

係り受けの次のステップ

いろいろ雑用に手を取られたりして間が空いてしまったが、その後も考えつづけている。

 

係り受けは現在(kakarotもcabochaも)正解率8割台。研究としてはそこそこいいものの、実用レベルから言うとまだ不十分だろう。97~98%程度にしたいところだが、それには何らかのブレークスルーが必要と思う。

 

JDC等を使って単語間の選好性を使うことを以前考えていたが、それだと若干改善はするかもしれないが、まだしょせん文の上っ面を見ているだけなので、ブレークスルーにまではならないような気がしてきた。それより、どうせいずれ意味の世界に踏み込まざるを得ないのだから、この際行ってしまおう、ということで、単なる係り受けを越えて意味解析にトライしようとしているところ。

 

さて「係り受けの次の意味解析」って何だろう?係り受けから先は混沌とした世界で、定番というか確立された技術はないような気がしているが、「必要だろうと思われている処理」という観点では次のようなものが挙げられそうだ:

 

  •  語義曖昧性解決(Word Sense Disambiguation: WSD)
  •  照応・共参照解析
  •  述語項解析

 

このほか含意関係認識なども挙げられるだろうが、これは上の3つよりもう少し先にあると思う。なので、当面この3つを中心に考えてみる。

 

いくつかこの辺の論文を見ていて真っ先に気になることのひとつは、いわゆる「パイプライン方式」ではまずいのではないか、ということだ。述語項解析の実験的なシステムがいくつかあるが、それらはいずれも(cabocha等の)係り受けの出力を受け取り、それに対して(係り受けの結果は正しいとして)ガ格やヲ格を決める。しかし、これはやはりおかしいだろう。たとえば

 

  割り箸を食べた弁当の箱にしまう

 

という文に対して、述語項を考えない係り受けだと「割り箸を」が「食べた」に係る、と判断しがちだ。(実際、cabocha(0.64)ではこうなる。)だが、その後述語項に行き、「弁当」は「食べた」のガ格かヲ格かと考えると、単語間の選好性(コーパスでの出現頻度)を考慮すると弁当「を」食べた、としたくなる。しかし係り受けが正しいとする限り、「食べた」のヲ格は「割り箸」しかあり得ないため、正しい解析ができない。

 

本来やりたい処理はこうだろう:

「割り箸を」は、構文的に見ると「食べた」に係りそうに思えるけど、「弁当」は「食べた」のヲ格だよな。とすると「割り箸を」が係るのは「食べた」ではなく「しまう」なのか。

 

こういう判断をできるためには、係り受けと述語項は直列に実行するのではなく、同時に処理するべきではないか、と思える。

 

照応やWSDも同様だ。

「犯人がやって来ました!彼を逮捕して下さい」

という文で、「彼」の先行詞が何か?「犯人」か?と考えるとき、「彼」を「犯人」で置き換えた「犯人を逮捕する」が自然な表現か?を考慮すべきだろう。そのためには照応と述語項も別々でなく同時に処理するべきと思われる。

WSDでも、「太朗が走る」のか「プログラムが走る」のか、「走る」の語義によって述語項の判断が変わる。これも同様に、同時に処理するべきと思われる。

 

以上のようなわけで、係り受け・WSD・照応・述語項は同時に処理する方が精度が上がりそうだし、またそれは可能のように思える。というわけで、「係り受け・WSD・照応・述語項を同時に処理するシステム」をこれから作ってみようと思う。

 

具体的にどうするのか?別にあまり難しいことは考えていない。私が作るので、当然kakarotをベースにする。kakarotが全幅探索であったことを思い出そう。係り受けで、各文節から可能な係り先をすべて挙げ、それらを順に試す。それぞれの係り受け方(各文節からの係り先の組)に評価値を与え、値が最大になる係り受け方を選ぶ。

 

これと同じことをやるだけである。WSDでは、各単語の語義の候補は辞書から直接わかる。述語項では、ゼロ照応を除き、係り受けの関係のあるものが候補になる。連体節(「食べた弁当」)や副助詞の場合はガ格なのかヲ格なのかわからないが、可能性のあるものをすべて候補として挙げておけばよい。候補の中のどれが正解かは、評価値が決めてくれる。照応の候補列挙の方式はやや複雑になりそうで、これについてはまだ深く検討できていないのだが、論文でその問題を論じたものもあるので、まずはそれらを参考にしながら候補を挙げていけるだろう。

 

各選択肢について候補を挙げることができれば、あとは全幅探索で評価最大のものを求めるだけである。計算量が気になるだろうが、kakarotでの経験からして、ここは何とかなるのではないかと思っている。少なくとも係り受けでは、相当原始的な探索アルゴリズムでも、通常の長さの文なら瞬時に終わる。WSD・照応・述語項が加わっても、たぶん致命的に長くはならないだろう。私は以前のPJTでこの手の探索をやっていたが、ちょっとチューンするだけで原始的なアルゴリズムは百倍、千倍高速化できることもざらにある。という経験があるので、あまり心配していない。

 

もうひとつ決めるべきは、評価関数である。これについては、長くなってきたので次の記事に書く。

 

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

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

 

まだ明確にやることが決まっているわけではないのだが、何をするにせよ、各単語の意味なり用法なりを記述した、いわゆる「辞書」を作ることが必須になりそうだ。イメージとしては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%といったところだろうか?その程度は誤差を含むと思ってほしい。

 

比較があまり意味なかった(らしい)件

京大コーパスを試したと前回書いたが、比較のためにcabochaでも同条件で測定してみた。


           ok      ng     正答率

kakarot  266014  54603   83.0%

cabocha  291893  28724   91.0% (v0.64)

cabocha  304930  15687   95.1% (v0.65)


cabocha v0.65が(またしても)やたらいい。これももしかして、京大コーパス自体で学習してるからだろうか?v0.64から0.65では素性がかなり増えたようなので、自身で学習してるならこのくらい上がっても不思議はないのかも。

といっても学習する元ネタは京大コーパスかKNBCくらいしか存在しない(と思う)ので、じゃあ客観的な比較は難しいのか…などと考えながら情報を探していると、以前ちょっと言及した J.DepP のページでこんな記述を発見:

> training: 9501<01-11>.KNP and 95<01-08>ED.KNP, testing: 9501<14-17>.KNP and 95<10-12>ED.KNP

京大コーパスの約4分の3で学習し、測定はそれ以外の4分の1でやった、ということらしい。cabochaについての情報は見つけられなかったが、これがその道の標準(なのか?)というのならそうしてるのかもしれない。

ただそうだとすると、私がやってるような「京大コーパス全体に対する正答率」を比較するのは(一部を学習に使っているので)あまり意味がない、ということになりそうである。

あとついでに言うと、「京大コーパスの約4分の3で学習し、測定はそれ以外の4分の1で」というのも、正直ちょっとどうかなという気がする。というのは、1月1-11日の記事と14-17の記事って、実はあんまり独立ではないのだ。1日ごとに全く別の話題ばかり記事になるわけではなく、同じ話題が数日にわたって書かれることも多い。首相の訪米とか、ロシアの侵攻とか。なので、1-11日の記事で学習すれば、14-17日の記事にも相当役立つだろうと思われる。まあとはいえ、「他にアノテートされたコーパスがない」というのはいかんともしがたいのでしかたないのだろうが。

そういう意味では、前回cabocha作者さんが提供してくれたような「京大コーパスで学習したモデルで、KNBCで測定する」というのが(現状availableな範囲では)いちばん客観的なのかもしれない。(いやもちろん、毎回そんなモデル作るのも大変でしょうから、やってほしいとかいうわけではまったくないんですが。)