murawaki の雑記

はてなグループから移転してきました

方言等語線

時間が経ったが、アイヌ語諸方言の系統樹の話の続き。系統樹の代わりに等語線 (isogloss) を引いてみる。

問題意識。方言群を系統樹で解釈するのは無理がある。接触による語彙伝播で説明するほうが良さそう。ではどうするか。ひとまず簡単に作れる別の表現を試す。ということで出てきたのが等語線。接触となると、とりあえず隣同士の関係を見ればすみそう。

思いつくままに系統樹と等語線の違いを挙げてみる。可視化される情報という点では、等語線は地理的に隣り合う方言同士の関係だけ。離れた方言同士の関係は可視化しない。等語線は隣同士であればすべて可視化する。系統樹は隣り合っていない関係も可視化するが、木を作るために一部だけを採用し、他を切り捨てる。

見ている情報という点では、等語線は隣との関係だけ。方言間に違いにはいろんな要因がある。該当方言だけの局所的な変化だとか、大方言群同士の境界だとか。等語線ではそうした要因はわからない。系統樹は木にそって要因を分割した結果。

御託を並べたところで、結果を見ていく。まずはアイヌ語



original authors: Lee S, Hasegawa T (2013); doi:10.1371/journal.pone.0062243.s001.
バイナリ化された基礎語彙の 0/1 の境界に線を引いている。太さが境界が置かれた数。不明 (?) の扱いがいい加減だが、大きな影響はないだろう。服部・知里論文の第3表 (p.62) にある同源語の一致率にほぼ相当する。表に並んだ数字を眺めていても分からない。こんな風に可視化した方が良い。

線は一部を除いて垂直二等分線。旭川は石狩水系だが、同水系の他の言語のデータがない。道南日本海側のデータもない。おかげで西側の南北境界が実際よりも北に引かれているのではないかという気がする。樺太の落帆と内路の間には無理矢理境界を設定した。Lee の系統樹では最初にくっつけていたので。落帆-美幌、長万部-旭川長万部-宗谷なども無理矢理感がある。

気付いた点を挙げてみる。同じデータをそのまま見ているだけなので、服部・知里とくらべて特に新しい知見があるわけでない。

  • やはり北海道と樺太の断絶が大きい。
  • 樺太はどこをとっても断絶が大きい。南部の多蘭泊-落帆間の断絶が一番大きい。結果的に、この2つが最後に (一番昔に) 結合するような木が推定されている。
  • 北海道は北部、南西部、東部に3分されている印象。北部と東部をひとまとまりにする分類を別文献で見かけたが、両者の差異も大きそう。
  • 八雲-長万部と平取-貫気別-新冠はそれぞれまとまっている。両者の間の幌別が中間的で、木を作る際にも困っている様子。
  • 服部も指摘しているが、日高南部の様似が新冠と似ておらず、むしろ釧路に近い。
  • 系統樹では宗谷が北海道の外れ値となっているが、宗谷と名寄の差はそこまで大きいわけではない。クラスタリングの都合で取り残されたことが確認できる。

あとは可視化には成功していないけど、データを眺めていて気付いた点。

  • 語同士が独立ではない。考えてみれば当たり前。調査票にある意味を表す語を聞いて回って、A を使う群と B を使う群が得られたら、A と B は相補的に分布する。多少の重複はあるけど。同じ調査項目の競合関係を系統モデルは無視する。
  • 全体に広がっているけど穴がある場合、あるいはその反対の局所的な分布は新しい変化と解釈できる。地理的に離れた複数の地点で使われている場合は、周圏論的に古いと解釈できる。分布がきれいに分断されている場合は、いずれが古いか、あるいはいずれも新しいか判断できない。
  • 南北境界はもちろん北海道と樺太の間が一番大きいが、宗谷の南に引かれる例も目立つ。名寄の南に引かれる例もある。樺太南部と北海道北部が共通することがあるが、北海道全土+樺太南部 という分布を持つ語はないみたい。北海道 + 樺太虫食い は樺太内部での局所的な改新だろう。一般には南北どちらが新しいか判断がつかない。
  • 北海道側の改新は複数の拡散パターンの重ねあわせっぽい。単一の中心点がある感じはしない。
  • 系統樹の観点からすると、拡散領域が複数あるとして、重なりがなかったり、包含関係にあるなら木の形になる。複数の拡散領域が部分的に重なり合っていれば木にならない。そう考えるとやはり宗谷は重要。宗谷には劣るけど、幌別も中間的で面白い。

ついでなので日本語も。



original authors: Lee S, Hasegawa T (2011); doi: 10.1098/rspb.2011.0518.
こちらは量が多いので機械的に処理しただけ。個別の語の分布は検討していない。

  • 八丈方言はどことも離れている。系統樹では八丈・静岡が100年ちょっと前に分岐していて変だと思ったが、静岡と特に近いわけではない。もっと昔に分岐したと考える方が自然なくらい違っている。いまの系統樹は、八丈方言ではここ100年ほどで急激な変化が起きたと解釈していることになる。おそらく、静岡に別の方言をくっつけていくと、祖語の内部状態が八丈からさらに離れていく。だから仕方なしにさっさとくっつけている。
  • 八丈方言と近い順に並べると、群馬、鳥取、静岡、東京、和歌山、三重、栃木となる。なぜ鳥取?
  • 個人的には兵庫が京都、大阪とやや離れているのが気になる。採取地点が播州加古川だから中国寄りなのだろう。それにしてもプロットしている点が西に寄り過ぎ。
  • 東西対立でいうと、北の糸魚川はそこそこ明確だけど、南側はぼやけている。
  • 九州は熊本・大分が比較的似ているが、あとは離れている。そんなつながりがあったっけ?
  • 本土で一番離れているのは秋田・鹿児島。
  • 鹿児島・名瀬 (奄美) の差が注目されることが多い。実際、この断絶は秋田・鹿児島よりも大きい。でもよく見ると、沖縄・池間 (宮古)、沖縄・平良 (宮古) の差の方がさらに大きい。琉球というのはあくまで比較言語学が産んだ仮想的な群であって、実体としては存在しないのだろう。
  • それにしても、琉球諸方言の内部の差異は大きすぎる。考古学的な証拠からすると、宮古八重山への日本語話者の移動はあまり遡れない。となると、比較的短期間のうちに急激な変化が起きたことになる。あくまで推測だが、少数の話者が孤立しているとこういうことになる。言語変化を牽引するのはおそらく世代交代だから、通婚圈が狭いとなおさら。沖縄の共同体の慣習を「ゆい」と言って変に理想化する言説も見られるけど、異常なほどの閉鎖社会だったんじゃないか。
  • 地図には載せられなかったが、上代語との距離でソートすると、上位は中古語、東京、北海道、山梨、滋賀、岐阜、栃木の順。本土の下位は、佐賀、鹿児島、秋田、青森の順。同じことを中古語でもやってみる。上位は東京、北海道、山梨、長崎、栃木。下位は佐賀、秋田、宮崎、福岡、青森。辺境が遠いのは分かるが、東京が近いのが謎。現代の関西諸方言が思ったよりも遠い。関西限定の改新が多かったということか。

Linguistic Phylogenies Support Back-Migration from Beringia to Asia

Mark A. Sicoli and Gary Holton. Linguistic Phylogenies Support Back-Migration from Beringia to Asia. PLOS ONE, 2014.

要約。Dene–Yeniseian系統樹を作ってみたら、Na–DeneYeniseian が最初に分岐する木はいまひとつだった。Na–Dene 側が沿岸と内陸に分けられそうで*1、Yeniseian は Na–Dene 沿岸部に近い。とすると、旧大陸から新大陸に一方向に広がっていたとするより、ベーリング地峡あたりから東西に広がったとするほうが説明しやすい。

この雑記を訪れるような奇特な人にとっても未知語だらけではないかと思う。とりあえず英語版 Wikipedia にリンクをはってみた。

Na–Dene は北米先住民の語族。私も全然知らない。名前だけ知っているものですら、Navajo と Tlingit ぐらい。Navajo は米軍が暗号として使ったことで有名。狂ったように複雑だから。Haida も聞いたことがあるが、最近は Na–Dene から除外する方向で落ち着きつつあるらしい。*2

Yeniseian は名前の通りシベリアのエニセイ川流域で話されている (いた) 語族。論文では Ket と Kott の2つを使っている。現存するのは Ket だけ。エニセイ川と言えばモンゴル国の北側。いくら地図で高緯度地域が引き伸ばされているといっても、北米大陸からは相当離れている。

この Na–Dene と Yeniseian との間の系統関係が最近話題になっている。Edward Vajda という人の主張だが、それが (あからさまな) トンデモではないらしい。自分では確認していないけど。ここまでが背景。

この論文は、Dene–Yeniseian の存在をとりあえず仮定して、計算モデルで系統樹を作ってみたというもの。SplitsTree で NeighborNet を作る。MrBayes で木を作る。よくある話。

変わっているのは、類型論データを使っていること。普通は基礎語彙を使う。一応使わない理由を説明してある。Na–Dene に限れば同源語が豊富らしい。でも長期の接触の影響でぐちゃぐちゃ。さらに Yeniseian との対応を考えるのは大変。1 万年近くさかのぼるには、語彙の比較は厳しいよね、とか。

類型論のデータベースというと、私は WALS しか知らない。この論文は独自にデータを作っている。Na–Dene については Sherzer (1976). An areal-typological study of American Indian languages north of Mexico という本を土台にし、他の文献で補っている。Yeniseian はこれにあわせる形で、文法書を見ながら自分たちで作成。偉い。とにかくデータを作る人は偉い。

supporting information 1 (S1) に具体的な特徴量が載っている。116 種類。音韻論と形態論のみ。この部分の説明が謎。例えば特徴量の 2 番は 1-1-1 とあって何のことやら。Sherzer (1976) にあたればわかるのだろうか。

類型論データの利用は以前から疑問に思っている。モデルは個々の要素が独立に生まれて死ぬと仮定している。しかも、生死のパラメータは同じもの。語彙なら独立性と仮定してもそこまでまずくはなさそう。一方、類型論データだと、S1 を見れば要素間に依存があるのは明らか。要素間の依存性がどの程度結果に影響するか調べた方が良さそう。誰かやってないのだろうか。

データが公開されていることだし、グダグダ言ってないで (欠損値対応の) PCA にでもかけてみればいいのだろう。でも、そうすると連続値に変換されてしまう。あるいは、バイナリ化をやめて categorical に表現するということも考えられる。いずれにしても、バイナリ列を仮定する既存のツールでは扱えない。少なくとも、依存関係を直接モデル化するよりは現実的。

問題はモデル化の都合だけではない。直感的にも分からない。語であれば生死は自然に了解できる。語が作られ、やがて使われなくなる。あるいは、意味が変化して調査対象の意味で使われるようになったり、使われなくなったり。一方、類型論的特徴が発生したり、消滅するのはいったいどういうことなのか。松本克己あたりの主張も、一部の類型論的特徴が歴史的変化に対して抵抗力が強いということだけ。モデルが変化に着目している以上、どういう仕組みで変化するかを一般化した形で知っておきたい。でもそういう説明を見たことがない。

考えてみると、同じ問題は morphology (生物学用語の方で、例えば、羽を持っているか) を使った系統樹にもありそう。そっちでは何か議論はないのだろうか。

*1:この切り分けは少々強引。よく見ると North Pacific Coast Athabascan が少し離れている。

*2:日本でもこのあたりの言語を研究している人が何人かいる気がして、宮岡伯人『「語」とはなにか』を確認してみた。そこに登場する人は、どうやらみんな微妙に外しているみたい。

Evolution of the Ainu Language in Space and Time

Sean Lee, Toshikazu Hasegawa. Evolution of the Ainu Language in Space and Time, PLOS ONE, 2013.

著者は以前日本語諸方言に系統樹モデルを適用していた人。論文公開直後に見つけてつぶやいた。

その後忘れて 1 年以上が過ぎていた。最近 arch74324 氏のブログ記事を見て思い出した。

モデル自体は印欧語への適用例と同様なので省略。データと結果に焦点をしぼって気付いたことを箇条書きしてみる。

  • 誰が偉いかというとデータを作った服部四郎が圧倒的に偉い。先見の明がありすぎ。glottochronology への着目もさることながら、1950 年代に危機言語の問題に気付いてデータを採取したことが驚異的。いま同じことをやろうと思っても不可能だろう。
  • データは 1955/56 年時点でのアイヌ語 19 方言の基礎語彙。樺太が 6 方言で残りは北海道方言。
  • データとくらべてツールにオーバースペック感がある。ツールがあるから動かしてみた、みたいな。おそらくもっといい加減なクラスタリング手法でも同じ形の木が得られる。単に子供の間を取る形で内部ノードの geolocation を決めても、祖語は北海道北部に落ち着きそう。
  • 現代語だけでは絶対年代を推定できない。どうしているかというと、裏技を使っている。アイヌは 15 世紀に樺太に入ったと想定し、樺太祖語が2つに分岐する時点に対して、500 BP を平均とするガウス分布をソフトな制約として与えている。この仮定の妥当性が一つの焦点。*1
  • calibration を 1 点でしか行っていないので、この時刻に関する仮定を変更しても、同じ比率のまま伸び縮みするだけだろう。
  • 祖語の年代はかなりぶれている。本文によると、中央値は 1323 BP だが、95% 区間で 820-1862 BP。*2手がかりが乏しいので仕方がない。
  • 宗谷方言の位置付けが鍵。服部・知里の原論文で指摘されているように、宗谷方言は北海道方言の中では外れ値。全体的には北海道方言だが、樺太方言に比較的近いとのこと。こういう中間的なデータが存在するときに木構造を仮定して大丈夫なのか。
  • 著者は一応先回りしている。いわく、tree-likeness を測ったら良い値だったとのこと。とは言え、推定結果では宗谷方言は早くに枝分かれしているので、祖語の位置への影響が大きい。
  • Figure 3 を見ると、北海道祖語は、宗谷と宗谷以外 (旭川近辺) とのほぼ中間に位置している。大雑把に言って、北海道祖語の語彙は、宗谷と宗谷以外から等距離。つまり、宗谷は保守的だと推定されいるみたい。推定された北海道祖語には宗谷の樺太的要素が反映されていそう。北海道祖語の語彙の状態を確認したいところ。
  • 共通祖語の位置は、北海道と樺太を結ぶ線上のどこかだと思うが、Figure 3 では判別できない。
  • これも服部・知里の論文で言及されているように、方言周圏論というか波状説の方が系統樹よりも説明しやすそう。北海道方言と樺太方言が分岐した後、北海道方言で広く多く改新が起きたけど、樺太方言が (一部については宗谷方言も) その影響をまぬがれたする。このデータを系統モデルで説明すると、論文のように樺太寄りの故地を設定せざるを得ない。
  • やはりこの規模のデータに系統モデルを適用するのは無理があるんじゃないか。系統モデルの成功例は印欧語とオーストロネシア語族。印欧語は過去のデータが豊富で地理的広がりがある。オーストロネシア語族は過去のデータはないけど、地理的広がりがあるうえ、洋上なので相互の接触が限定的。これらに比べるといかにも厳しい。
  • 論文はテンプレート通りの展開。二重構造モデルが適切か、いわゆるオホーツク人の影響を加味すべきかという問いを立て、モデルの推定をもとに後者を支持する。祖語の年代と位置がオホーツク人のそれと一致するから。日本語方言を扱っていたときは年代だけで農耕の開始を論じていた。いずれにしても危うい。もっと堅実に議論すればいいのにと思う。でも、それだと注目されにくいのだろう。

2014 年 9 月 1 日追記: 同じ著者の 2014 年の論文では、アイヌ語のデータとして千島と千歳が追加されている。ただしデータは載っていない。

*1:calibration を 1 点でしか行っていないので、分岐の中央値はほぼ 500 BP になるはず。なのに、Figure 2 では 目測で 460 BP あたりに中央値がある。supporting information の XML ファイルを見ると、平均は 460 になっている。40 年のずれは何なのか。1955 年に 40 を足しても 1995 年にしかならない。謎。計算時には謎補正を行っておきながら、結果を図にするときに戻していないのではないか。

*2:やっぱり Figure 3 は 40 年ずれている。

「戦犯旗」はいつ使われだしたか

世の中のいろんなものがネット上に移行して記録されるようになった結果、何がどう起きたかを後から*1分析できる場合が増えてきた。今回はそういう話。これから色々御託を並べる。けど結局やったことはローテク。ちゃんとした話ならちゃんとした場所で発表する。微妙な政治ネタだし、結論的には新しい情報はない。*2雑記に投げ捨てるのが適当。

お題は、「戦犯旗」(전범기) なる語はいつ使われだしたか。技術屋なので技術を使って何とかしたいところ。しかし韓国語。まずこの時点で、私が自然言語処理を活用するのは厳しい。

以前、Baidu の n-gram を使って、新語 (新用法) の出現時期を求めてみたことがある。しかし、2010年7月までのデータなので、いい加減賞味期限切れ。前にいた研究室では、学生に頼んで、自前で時系列コーパスを作ろうとしてみた。クローラを運用していたので。しかし駄目だった。取得するページは最近のものに偏りすぎていた。非力なクローラでは、ほとんど無尽蔵にあるページの一部しか取得できない。新しめのページの取得で精一杯で、古いページまでたどり着かない。もちろん韓国語は対象外。

Twitter は駄目。中の人だったり、契約してデータを貰っていれば良いかもしれない。部外者だから、streaming のデータを貯めこまないといけない。膨大な量だけど、それでも sampling されたデータ。しかも全世界のデータだから、言語を限定するとデータが一気に減る。後で思いついた語を検索しても全然ヒットしない。事前に決めた語を track するぐらいしか使い道はないのではないか。

Google Trends はいまひとつ信用できない。低頻度語の切り捨てが激しい。

Google N-gram は対象言語が限られている。日本語も韓国語もない。

結局、新聞サイトで記事を検索してみる。朝鮮日報は過去1年しか出てこない。東亜日報も古いのが出てこない。

ということで、中央日報を使う。単純マッチングを使っているようで、전범기 (戦犯旗) に対して전범기업 (戦犯企業) も引っかかる。それを除くと初出は2012年8月16日。今ではさも当たり前のように使われているが、ごく最近の造語であることが確認できる。

古い記事は本文が読めない。スニペットから、朴鍾佑のサッカーの試合における政治宣伝と関連付けていることがわかる。試合は2012年8月10日だから、少し時間がたっている。

次は욱일기 (旭日旗) で検索してみる。あまりヒットしない。最初が2004年2月12日。例によってスニペットしか見れない。李丞涓というタレントが慰安婦のコスプレでヌード映像を作ったという話題。炎上マーケティングっぽい。同年同月20日まで計6記事。

その次は2011年1月26日。7年も飛んでいる。またもやサッカー。奇誠庸が2011年1月25日の試合で人種差別パフォーマンスを行って騒ぎになったあとの Twitter での発言を取り上げたもの。Wikipedia がソースなので怪しいが、「Twitterで「観客席の旭日旗を見て涙が出た。私も選手の前に大韓民国国民です…」と発言、旭日旗に腹が立ったことを理由に故意に上記のパフォーマンスを行ったことを主張した。」とのこと。これが計2記事。

次が2011年8月26日に1件、その次が2011年12月24日。その次が2012年8月15日。オリンピックの日本体操チームが使用したユニホームに難癖をつけているっぽい。「戦犯旗」の初出が2012年8月16日だからその前日。2012年11月7日に、かの有名な VANK が反旭日旗の活動を国連前で行ったという記事。ここでようやく具体的な活動がはじまり、年が明けて2013年になると記事の数が爆発的に増える。

事前の予想よりはるかにわかりやすい結果。新聞記事の検索だけで、かなりの程度目的が達成できた。要するに、韓国人はもともと旭日旗に何の関心もなかった。2011年1月にサッカーの試合で人種差別パフォーマンスを行った選手が、言い訳のために旭日旗を持ちだしたのがはじまり。2012年8月にサッカーの試合で別の選手が政治的パフォーマンスを行って世界的に批難をあび、少し経ってから、腹いせのために旭日旗を批難することを思いついたのが次の展開。この段階で「戦犯旗」なる語が発明された。これに VANK が目をつけ、2013年以降大々的な反対活動が行われるようになった。逆に言えば、今の反対活動は、もとはといえば、サッカーにおける逆切れが発端。そんなことをしていると韓国に対する好感度も下がるわけである。

ここまであからさまなら、反旭日旗の活動家 = racist という図式を作るのは難しくなさそう。特に奇誠庸の件は都合が良い。他には、VANK が「디스카운트 재팬」 (discount Japan) という運動をしていたように記憶していたがみつからない。さすがにヤバいと思って消したのだろうか。*3 この図式を補強するために、旭日旗に目をつけてから反対活動を始めるまでの展開が詳細に分析できると良い。時系列データと自然言語処理のツールがあればできるかもしれない。あと、米国籍の人間の活動が目立つが、彼らと韓国との連動具合も分析できるかもしれない。でもデータもツールも持ち合わせていないので私には無理。

2014年6月12日追記: takeda25 氏が詳しい補足を書いてくれているので、そちらも参照してほしい。

2015年7月3日追記: NAVER Trend で上記の結論が再確認できた。このサービスは Googld Trends の韓国版。전범기 (戦犯旗)、욱일기 (旭日旗)、욱일승천기 (旭日昇天旗) をくらべてみた。2007 年 1 月から 2015 年 6 月までの検索語の「検索推移」(?) が週単位で得られる。ちゃんとした凡例がないので推測だが、下部の時間幅を調整できる部分が検索量を表しているみたい。これを見ると、2012 年 8 月頃から旭日旗に関する検索が増えたようである。「戦犯旗」という語がこの 2012 年 8 月に出現したことも確かめられる。期間内で最大の burst は 2011 年 1 月、奇誠庸の事件当時。それ以前は、2007 年 9 月と 2008 年 8 月に小さな burst があるだけ。

2015年11月6日追記: 英語版を書いた。ちょっと情報を追加して。改めて少し調べてみたけど、最近またひどいことになっているみたい。

*1:後からのんびりというわけにはいかない場合もある。例えば、中国のネット検閲の検証などは、リアルタイムでデータを集めないといけない。

*2:私がスポーツニュースを一切追いかけていないのが敗因らしい。私が得た結論はよく知られているみたい。

*3:「4月から始める」という予告であれば Internet Archive に残っていた。

JUMAN メモ

黒橋研究室で開発している日本語形態素解析JUMAN についてのメモ。

以前は研究室のページに置いていたもの。長く放置していて内容的に古くなっていたが、最近になって突然晒された。*1文書に日付を入れていなかったのが敗因。この機会に雑記に移すことにした。古くなっても日付を言い訳に使えるし。

以前は中の人だった。どこを直すかという問題意識があった。今は所属も変わって、しばらくはそういうのはいいかなという気分。かわりに、使っている人向けにぼちぼち書き換えようかと考えている。論文には書きにくい小ネタなども。

タスク: 日本語の形態素解析

形態素解析と言っているのは、以下の3つのタスクの同時処理。

  • 分割 (segmentation)
  • 品詞タグ付け (POS tagging)
  • 見出し語化 (lemmatization)

分割は、テキストを形態素に区切ること。形態素というとおっかないが、単語だと思っておけば良い。品詞は「名詞」や「動詞」など。見出し語化という表現は聞き慣れないが、「走れ」のように活用変化した形を基本形の「走る」に戻すこと。

世の中一般的には、形態素解析は分割 + 品詞タグ付け と説明されることが多いが、見出し語化にも触れた方が良いと思う。ここが語形変化のない中国語の処理と決定的に違うところ。中国語の処理と違って辞書ベースの手法が主流なのも、これが大きい。

「X分割」という表現は混乱している。word segmentation の場合、X は分割後の状態だが、text segmentation や query segmentation だと分割対象。

入出力フォーマット

  • 入力は1行1文
  • 出力は1行1形態素
    • 最後の行は EOS (end of sentence)

子ども こども 子ども 名詞 6 普通名詞 1 * 0 * 0 "カテゴリ:人 代表表記:子供/こども"
は は は 助詞 9 副助詞 2 * 0 * 0 NIL
リンゴ りんご リンゴ 名詞 6 普通名詞 1 * 0 * 0 "カテゴリ:植物:人工物-食べ物 ドメイン:料理・食事 代表表記:林檎/りんご"
が が が 助詞 9 格助詞 1 * 0 * 0 NIL
すきだ すきだ すきだ 形容詞 3 * 0 ナ形容詞 21 基本形 2 "代表表記:好きだ/すきだ"
EOS

形態素解析は非常に局所的な文脈しか見ないので、別に複数文を一度に入れてもあまり問題にならない。構文解析でそれをやると、計算量が爆発するし、結果が気持ち悪いことになる。

英数字記号は全角で入力されることを期待している。UTF-8 化 (後述) にあわせて半角入力でもそれなりに処理するようになった。しかし全角に変換しておくことを勧める。出力時のエスケーピングをちゃんとやっていないので、特に記号がらみで事故が起きやすい。

エンコーディング

長らく EUC-JP だった。外部の人が UTF-8 版を作ってくれた。しばらく放置されていたが、時代の流れに逆らえず正式に UTF-8 に移行した。

速度

MeCab とくらべると圧倒的に遅い。しかし中の人には「cat 状態」と認識されている。一般に、形態素解析の結果を受けて何かをしようとすると、後段の処理の方が比較にならないほど遅い。だから JUMAN の速度を改善する動機はとぼしい。

というか MeCab が頑張りすぎである。下手な英語の tokenizer よりもよっぽど速い。気合が違う。

解析結果をルールでゴリゴリ処理するようなアプリケーションを作っている人なら、JUMAN の速度は気にならないはず。でも、KNP で構文解析までやると遅い思う場合は、

juman | knp -tab -assignf

がお勧め。文節まとめあげ + 各種 feature 付与までで打ち切って構文解析をやらない。KNP が吐く feature をうまく使えば、解析結果に対するルールの再発明が減るはず。

内容物

  • プログラム
  • デフォルトの文法辞書
  • デフォルトの形態素辞書

プログラムは古色蒼然としてる。C で書いてある。辞書のデータ構造は、パトリシア木を ChaSen から借りてきたり、double array を MeCab から借りてきたり。

連濁対応などでプログラムの更新もたまにあるが、実質的に辞書のみの更新。

文法辞書と形態素辞書は利用者が自由に定義できるとマニュアルではうたっている。しかしデフォルト以外の辞書が配布されている例を知らない。

ChaSenMeCab は配布のレベルで、プログラムと辞書を分離している。それらに対する辞書としては IPADIC, NAIST jdic, UniDicなどがある。

ライセンス

マニュアルには3条項BSDライセンスが書いてある。このライセンスがプログラムだけでなく辞書に及んでいるかなどはよく分からない。中の人もあまりちゃんと決めていない。

よく分からない問題はいろいろある。最近 Wikipedia を加工して辞書を作っているんだけど、この辞書のライセンスはどうなるのか。テキストの解析結果には辞書の情報が大量に埋め込まれているけど、解析結果を配布するときどうなのかとか。頼まれて以前調べたけど、法律の専門家でも何でもないので私には正解が分からない。詳しい人に教えてほしい。

品詞体系

  • いわゆる益岡・田窪文法
    • 基礎日本語文法』の記述に結構忠実
    • 学校文法 (橋本文法) 系の ipadic の IPA 品詞体系も異なる
      • 相互の変換は困難
    • unidic は unidic で IPA 品詞体系とも違うらしい
      • KyTea のデフォルトモデルは、unidic の品詞の大分類 & 「語尾」(活用語の変化する部分を切り出したもの)

益岡・田窪文法に慣れると IPA 品詞体系には拒否反応が出る。ただ、ナ形容詞と判定詞の区別は微妙。活用変化がほとんど同じなので。

つべこべ言わずに統一してくれよという声はよく聞く。

処理内容

  1. 入力に対して、形態素辞書を引いて出力 (形態素列) の候補を列挙
  2. コストにより最適な候補を選択

候補の列挙

  • 辞書を引く
  • 未知語候補をその場で生成
  • 連濁候補は基本形に戻して辞書を引く
  • 反復型オノマトペはパターンにマッチするものをその場で生成
  • 非標準表記を標準表記に戻して引く

ChaSenMeCab は最初の2つしかやっていない。残りは JUMAN でも比較的新しく入った機能。MeCab だとチューニングしすぎていて入れにくそうな機能。そのうちちゃんと説明するかも。

候補の選択

  • 形態素辞書と連接辞書により、形態素と、形態素同士の連接にコストを付与
  • コスト最小のパスを選択

パラメータ (コスト)

このご時世に人手で設定している。まさに職人芸。単語の生起コストはいい加減でもわりと大丈夫。連接コストは頑張って調整してある。

ChaSen/MeCab はそれぞれ隠れマルコフモデル (HMM)、条件付き確率場 (CRF) により訓練データからコストを学習する。単語の長さがいろいろなので、hidden semi-Markov model や semi-CRF と言ったほうが正確かもしれない。

JUMAN、ChaSenMeCab とも、解候補は同じ構造 (lattice) で表現できる。解探索のアルゴリズムも同じ。コストの決め方に関する考え方が違うだけ。KyTea はまったく異なる。

精度は完全に MeCab に負けている。

ちなみに日本語版 Wikipedia は、長い間、JUMAN は「隠れマルコフモデル」を使っているという誤った説明をしていた。生暖かく見守っていたら、中の人によって修正されてしまった。

人手による連接コストには利点もある。ありえない連接が候補から除外できる。そもそも付属語の連接にはかなりの程度文法的な制約があって、可能な連接は限られている。

一方、MeCab は完全にコーパスから学習するので、あらゆる連接が可能。もちろん変な連接には大きなコストが設定されるので、普段は問題が顕在化しない。しかし、未知語が入ってきたときなどに、どう考えてもありえない解析結果を吐いたりする。MeCab も連接制約のホワイトリストブラックリストを作って入れたらいいのに。

ただ、特に文頭の連接制約はきつすぎて、くだけたテキストの解析がつらい。

同形

  • コストが同じ複数の候補は同形として出力
  • @ から始まる出力行があるもの
    • 出力は単に辞書引きの順番なので、どちらが正しいというわけでもない
    • 方針として、JUMAN は曖昧性の候補を列挙するのみ; 選択は KNP で行う

かぜ かぜ かぜ 名詞 6 普通名詞 1 * 0 * 0 "漢字読み:訓 カテゴリ:抽象物 代表表記:風/かぜ"
@ かぜ かぜ かぜ 名詞 6 普通名詞 1 * 0 * 0 "カテゴリ:抽象物 ドメイン:健康・医学 代表表記:風邪/かぜ"
で で で 助詞 9 格助詞 1 * 0 * 0 NIL
おくれた おくれた おくれる 動詞 2 * 0 母音動詞 1 タ形 10 "可能動詞:送る/おくる 代表表記:送れる/おくれる"
@ おくれた おくれた おくれる 動詞 2 * 0 母音動詞 1 タ形 10 "付属動詞候補(基本) 自他動詞:他:遅らせる/おくらせる 自他動詞:他:遅らす/おくらす 代表表記:遅れる/おくれる"
EOS

  • 同形が出力されるのは分割とコストが同じ場合のみという微妙仕様 (e.g., おさない == 幼い != 押さない) だが、結構使える
  • 同じコストになるのはコストを人手で調整しているから
  • くる:子音動詞ラ行 (繰る) と くる:カ変動詞 (来る) のように品詞が一部違っても同形になる

MeCab は同形の曖昧性を考慮せずにパラメータを推定しているので、どちらとも言えないような場合でも、とにかく一つの解に決めてしまう。N-best にすれば複数の解を出力するが、N をいくつにすれば良いかは事前にはわからない。 そもそも同形の曖昧性解消を N-gram の情報で行うのが適当とも思えないから、JUMAN/KNP の方針は妥当だろう 「おくれた」のような用言の曖昧性解消は、KNP が格フレームを使って行う。修士論文の成果だったと思う。最近の格フレームでどれぐらい正しく曖昧性解消できているかは誰もちゃんと調べていないはず。

辞書の整備方針

  • 形態素数は削減する方向
    • 基本語彙のみを人手で整備し、残りは自動獲得したい
    • 基本語彙には人手で様々な意味情報を付与
      • 意味情報: 形態素解析そのものでは使わないが、係り受け解析や応用処理で使う知識
      • e.g. 代表表記, カテゴリ, ドメイン, 可能動詞, 付属動詞候補(基本) など
  • 新聞記事に出てこない難しい単語や固有名詞などは、IPADIC の方が豊富
    • JUMAN/KNP を用いた日本語固有表現認識の論文でも、精度を上げるために MeCab の解析結果を参照するという変態的な処理をやっている
  • それ以外にも、なぜ登録されているのか不思議な形態素が辞書に残っていたりする

大人が読むテキストには普通出てこないようなひらがな表記も結構登録されている。「かぐ」(家具) とか。おそらく、小学生向けの辞書からの情報抽出を昔やっていたなごり。副作用も結構あって、「茄子」に対する「な子」のような変な混ぜ書きが悪さする。

代表表記

  • 基本語彙に付与されている
  • 表記ゆれをある程度吸収する
    • 風邪, かぜ -> 代表表記:風邪/かぜ
      • 代表表記は単なるキー
      • これが標準的な表記と主張しているわけではない

形態素よりも長いキーフレーズレベルでの表現の揺れの吸収は『キーワード蒸留型クラスタリングによる大規模ウェブ情報の俯瞰』が詳しい (ヒューリスティクスの塊)。解析に使う分には代表表記は便利。ユーザがいる問題設定だと、こんなものをユーザに見せるわけにはいかないので、処理中に、標準的な表記を代表表記といっしょに保持しておかないといけない。

カテゴリ・ドメイン

  • カテゴリは荒っぽい抽象化の単位
  • 付与されたカテゴリの半分ぐらいが「抽象物」
    • 卒論の成果
    • 設計ミスまがいだが、細分化しても取り分がなさそうだから放置してある

カテゴリ・ドメインは言葉の大雑把な分類。この2軸を組み合わせれば、大雑把な分類としては十分ではないかという見通しだったらしい。 他には、シソーラスを使うと権利の問題がややこしいから、独自に作ったとか。

カテゴリは省略解析などで実際に使われている。

かつて、カテゴリ (のサブセット) を自動分類しようとしてひどい目にあった。いまでもトラウマ。そもそも意味的な情報を形態素という単位に与えるところに無理がある。人間の作業者が、直感に基づいて適当に割り当てる分には良いかもしれないが、データに基づいて決めさせようとすると、そのいい加減さに計算機が耐えられない。

その他の意味情報

  • 付属動詞候補(基本)
  • 可能動詞
    • 元の動詞 (戻せる -> 戻す)
  • 自他動詞などの対応関係
    • 自動詞や他動詞、形容詞派生など

「可能動詞」ラベルは、可能で使われる可能性があることを示すだけで、文中の個々の形態素が可能動詞の用法で使われているとは主張していない。これに限らず、JUMAN/KNP では、可能性があるために付与されている情報と、解析の結果 (いくつかの可能性の中から選択された結果) 付与された情報があまり整理されないまま混在している。

自他の対応などは、構文レベルの表現のゆれの吸収を目的に付与してある。

読み

辞書に代表的な読みが書いてある。解析時には辞書引きした結果を表示しているだけ。テキスト中での正しい読みを当てる気はない。数字の読み、音・訓の区別、表記に反映されない連濁の区別は間違っている可能性が高い。

だから転写や音声合成には使えない。UniDic はこのあたりもちゃんとやる方針らしい。いまの形態素解析器が使っている手がかりだけで正しく判別できるのか疑問だけど。

形態素の単位

以前辞書を整理した際に、構成的な語を削除しまくったらしい。それでも単位の不統一は残っている。

テキストの分割方法として、これが正しい単位だという基準が設定できない。辞書に載っているということが一種の基準になってしまっている。

「揺れの少ない斉一な単位」をうたう UniDic でも、直感に反して、「寿司屋」と「家具屋」で分割が違うらしい (未確認)。漢語と和語で扱いが違うとのこと。UniDic は踏み込みたくない領域に踏み込んでいる。

可能性に基づく品詞体系

「可能性に基づく品詞体系」という用語は IPADIC で使われているもの。JUMAN のデフォルトの品詞体系はこうは説明されない。しかし実質的に同じことをやっている。

例えば、「今年」は「今年の目標」であれば名詞として振舞っているが、「今年起きた事件」では連用修飾を行っており副詞的。辞書は「今年」に「名詞 - 時相名詞」という品詞を割り振っている。どちらの文の「今年」に対しても、この品詞を割り振っておしまい。IPADic は、その点を明確にしていて「名詞 - 副詞可能」という品詞が割り当ててある。名詞としても振る舞うし、副詞としても振る舞うということ。

文中でどのような振る舞いをしているかを当てに行くのをはなから放棄している。要するにインチキ。英語の品詞タグ付けとは大違い。

誰が名詞用法と副詞用法を区別しているかというと、文節まとめあげや係り受け解析で暗黙的に行っている。

一応区別はしているものの精度が悲惨な例もある。「で」の曖昧性問題。「京都は大学の町で観光地でもあります。」という例文では、「町で」の「で」は判定詞だが、「大学の街で観光した。」だと格助詞。いまの形態素解析器が見ているような局所的な手がかりでは区別しようがない。

動詞の連用名詞化

動詞の連用名詞化は、IPADIC では「可能性に基づく品詞」を採用していないけど、JUMAN では採用している。例えば動詞「遊ぶ」の連用形「遊び」。「外で遊び家に帰る」だと動詞用法だけど、「遊びを楽しむ」だと名詞用法。IPADIC では、動詞と名詞の両方が辞書登録してある。しかし MeCab の解析結果は不安定。「買いに行く」の「買い」をいろんな動詞に入れ替えてみると、名詞と解析されたり、動詞と解析されたり。

JUMAN はいずれの用法でも動詞の「基本連用形」とする。名詞用法のものは KNP が名詞に変換するという運用。この変換はちょっと面倒。名詞にすると活用しない扱いなので、見出し語 (JUMAN 用語では原形) もあわせて「遊ぶ」から「遊び」に変更しないといけないとか。こういう変換処理がプログラム内にベタ書きしてある。

JUMAN 的には KNP の担当になっているが、名詞用法の判定は難しい。上記の「外で遊び家に帰る」なら「遊び家」という複合名詞はありえない。「彼を操り人形にした」なら「操り人形」という複合名詞を採用する解釈が自然。「彼を操って人形にした」という解釈も可能だけど。KNP はどう処理しているかというと、明らかなものはルールで決め、残りはウェブコーパスから作った共起の統計量をもとに判定している。

京大テキストコーパスは KNP 仕様で、名詞と動詞の用法を区別している。MeCab のもととなった CRF モデルの論文の比較実験が、このあたりをどう処理したのか、いまだに把握していない。

その他の雑多な問題

悩ましい問題はいろいろあって、京大テキストコーパスアノテーションガイドで言及されている。形態素関連は3節。

コーパスアノテーションガイドはいろんな知見がつまっていて面白い。みんなもっと読んだらいいのにと思う。

*1:Internet Archive によると2009年1月には移設前の状態だったみたい。

意味の意味が分からない

表題は某日記から拝借。計算機に自然言語を扱わせるうえで、意味を理解させるというのが大きな目標。しかしこの目標は漠然としている。何が達成できたら意味を理解したことになるのか分からない。いろんな人がいろんな方向から攻めている。適当に洗い出す。範囲は広いし時間もない。裏とりはせず、記憶に頼って殴り書き。

記号

意味は、対応する記号を置いておけば良いという立場。それ以上の表現を与えない。興味は、記号同士の関係を論理式で与えることと、その真偽値にある。この手の話は、元はといえばたぶん Frege あたりまでさかのぼる。

計算機との関係では、かつて人工知能屋さんが論理式と戯れていた。もはや教科書を通してしか知らない。Nixon diamond とか作って遊んでいた古き良き時代。planning とか、閉世界仮説とか。それ単独で見るとおもしろい話題はいろいろある。けれど、自然言語と遊離した独自世界。現実にそこにあるテキストと結びつく未来が見えない。

頑張って自然言語形式言語と結びつけようとしている人もいる。英語を対象とした Montague の文法は、失敗したという結論でいいのだろうか。そんなこと言っていると、誰かに後ろから刺されたりするのかな。難しい課題はいろいろあるが、例えば may とか want N to V とかどうするのよ、とか。論理体系が既にあって、そこに自然言語をどうやって帰着するかという問題ではすまない。自然言語の論理をうまく表すような論理体系を作りつつ、自然言語形式言語との間の変換規則も作るという同時並行的な作業。

最近の論文では、Combinatory Categorial Grammar (組み合わせ範疇文法、CCG) というのをよく見かける。誰が親玉なのかわからないが、Steedman という名前をよく見る。日本では戸次先生。最近は構文がそこそこの精度で解析できるので、構文の延長として意味を何とかしようと思ったとき、形式言語の出番かなあと思っている人がそこそこいる。ただし、ハードコアな人の興味は、文法要素の扱いとか量化とかをどう処理するかにあるっぽい。それだけでもやることが山積みっぽい。それはそれで大変楽しそうだけど、短期間で実用状態に持っていくことを望んでいる人たちとどう折り合いをつけるのかなあ。

基本はやはり記号というアトミックな単位の組み合わせ。最小単位は記号を割り振ったらおわり。論理式に変換できたとして、その先で本当に何かできるのかなあ。

最近見かけるシリーズでいうと、neo-Davidsonian な論理式をよく見る。John loves Mary を love(John, Mary) に変換すればすむと思ったら大間違いで、∃e.love(e, John, Mary) にしないといけないという話。あってる?

論理式で言うと、Markov Logic Network というのが一時はやった。最近は見なくなってしまった。Domingos 先生が頑張って旗を振っていたのに。論理式といっても、ルールが論理式の形で書いてあって、それに具体的な値が入って instantiate されて、論理式に対応づいている重みから全体のスコアが最適化されるってな感じ。こんな説明じゃ伝わらないと思うけど。論理式は人手でゴリゴリ書く。共参照 (coreference) のルールとか。自然言語の意味を扱う方向に発展する感じがしない。

同義性

テキストを処理する立場から言うと、最小単位は記号を割り振ったらおわりという部分が引っかかる。上位下位関係 (例えば、ペンギンと鳥) は論理式で表現できそう。部分全体 (meronymy/holonymy) とかは? 反義は? この手の、英語だと -onym (語について)、-onymy (関係について) と名のつく現象がいろいろある。

一番困るのは実は同義性。完全に同じ意味の語というのはなくて、どこかしら異なっている。仮に、ほぼ同じ、だいたい同じ、似てない、みたいに連続的に分布しているとしたら、離散的な記号でどう扱ったら良いのか。あるとき、国際会議で、上位下位とかの共通データセットを作っている人の発表を聞いたことがあったが、その人が「同義はわからないので扱わない」と宣言したものだから、唖然とした記憶がある。どのデータセットだったか覚えていないが、確かイタリア人の発表。

実用上は同義性は重要。例えば、検索するとして、知りたい内容が書いてあるのに、クエリとちょっと表現がずれていただけで引っかからないとなると困るから。

多義性

テキストを処理する立場から言うと、テキスト上の loves に love という記号を与えておわりで良いのかも疑問。love の語義は一個だけ? 別の語義もない? そもそも語義は1個、2個と離散的に数えられるもの?

人手で語義1、語義2とつけておいて、未知の出現に対して語義を推定するタスクが word sense disambiguation (語義曖昧性解消)。何を手がかりに推定するかというと、周りに出現する単語とかを見る。この話は後述。

発展として、以前、既存の語義一覧にない外れ値を当てるタスクを解いている人の発表を聞く機会があって、地をはう精度を見せられたことがあった。いや、そら難しいよね。

語義をあらかじめ定義せず、似た意味を持っていそうな出現をまとめていく (clustering) する流儀もある。こういう話と論理は、はたして将来統合されたりするのだろうか。

思いついたキーワードを適当にあげると、family resemblance。game に共通する意味って何だろうねってやつ。

意味を担う単位

テキストを処理する立場から言うと、単語にばらして記号を割り振れば良いという方針に疑問を感じる。慣用句はどうするよ? kick the bucket。idiom の例として散々紹介されるけど、実際に使われているのを見ないことでお馴染み。

別に慣用句に限らない。例外ではなく、むしろ一般の現象だと考えている。複合名詞には多かれ少なかれ構成性 (compositionality) で説明できない部分がある。「下駄箱」って「下駄」と「箱」の合成で説明できる? もはや「下駄」は関係なさそうなのに。

思うに、仮に世の中にある概念が離散的で数えられるとしても、概念の数は単語の数よりも多い。世の中は複雑すぎるから。先に概念があって、それをうまく説明しようと、単語を組み合わせる。そうやって人は新しい表現を作る。ひとたび社会に定着したら学習者はそれを受け入れるしかない。

とは言ったものの、いかにも構成的な場合と、そうでない場合がある。「木製下駄箱」という複合名詞は、「下駄箱」は語彙的だとしても、「木製」と「下駄箱」がその場で構文的に結びついている気がする。両者にきれいな境界があるかというと、なさそう。さあどうする?

ちょっと関連するのが collocation。これ自体は、テキスト中でよく共起する単語列 (ギャップを扱う場合もあるけど)。意味について何も言っていない。

分布仮説

ここからは、意味に対して記号を割り振るだけでなく、もっと具体的な表現を与えましょうという方向性。テキスト中での語の使われ方を見て何とかする。頑張ってさかのぼろうと思えば、みんな大好き後期 Wittgenstein とかまでいける気がする。こじつけかな? 一般に言われるのは Harris の分布仮説。「似た語は似た文脈で現れる」ってやつ。

どうやるかとうと、着目した語のテキスト中の出現を調べる。各出現について周りの単語を抽出してベクトルを作る。具体的なベクトルの作り方には山のような変種がある。で、これが意味だと主張する。

このベクトル自体は何とも解釈しようがない。しかし応用はできる。ベクトル同士の類似度をはかれば、それを語の類似度とできる。分布類似度というやつ。

分布類似度にはよく知られた問題がある。反義語の類似度は高くなる。考えてみると、似ていないというのは、全然無関係だってこと。反義語は、直感的には、ほとんど同じで、ある軸だけ反転している。そういう点ではよく似ている。

多義語をどうするのよという問題は当然ある。

あと、未整理のキーワードをあげると prototype と exemplar。

構文とトピック

周辺の語に着目した類似度は、かなりの程度構文的類似性となる。どういうことかというと、名詞と名詞、動詞と動詞は近くなるけど、名詞と動詞は似ていない扱いになる。英語だと、同じ単語の単数形と複数形が、期待ほど似ていないという結果が返ったりする。

周辺の語という制約をゆるめて、いっそ文書内での共起に着目したらどうなるかというと、それはトピックモデル。LDA (Latent Dirichlet Allocation) とか。そうすると、経済とか政治といったトピックでまとまる。名詞と動詞のような構文的類似性は関係がなくなる。これはこれで、ある種の意味の類似性だと思うが、そういう文脈で取り上げられることは少ない気がする。両者の折衷モデルも提案されている。

ニューラルネットの逆襲

いままでは素朴に意味ベクトルを作っていたが、ニューラルネットを使って低次元ベクトルを学習するといい感じになるという話題が最近熱い。ベクトル同士を適当に足し算・引き算する、例えば、King - Man + Woman とすると Queen が浮かび上がるという衝撃的な論文が去年 (2013年) 発表されている。

この論文を見ると、recurrent neural network を使っている。言語モデル用に作ったのを使いまわしている。recurrent だから長距離の影響も残りはするけど、基本的には直前の語の影響が大きいはず。そうすると、上で議論したように、構文的な類似性が強くなるんじゃないかと予想する。論文の表1にあるように、see:sees との類推で return:__ の空欄を埋めるとか。しかし Queen の例を出されて驚いている。素朴に意味ベクトルを作ると、ベクトル中の see の要素と、sees の要素は別々だけど、低次元に変換すると、see の要素と単複の要素に汎化されたりしているのかな。economy と economic みたいに、構文的に類似しない関係はどの程度いけるのだろう。

意味の合成

単語に対して意味表現が与えられたする。しかし、言語というのは組み合わせて句や文をつくるわけで、句や文に対しても意味表現を作りたい。ではどうするか。2つの構成要素 (単語とか句) が結合するとき、例えば、ベクトルの要素同士を足し算して、あらたなベクトルを作る。しかし、それでは bag-of-words と変わらない。単語の並びには何らかの意味があるはずで、それを意味合成にも反映させたい。

要素同士の足し算以外にも、要素同士の掛け算とか、さらにテンソルが出てくるとか、量子論だとか言っている人もいる。黒魔術が展開されているっぽい。おそろしくて深入りしていないのでよくわからない。

意味合成もニューラルネットが席巻している。ベクトルに重み行列をかけて tanh する。もはや何が起きているのかわからない。とにかく、重み行列をいい感じに学習できたら、単にベクトルを足し合わせるよりは良い精度が得られている。

重みの学習方法はいろいろあるが、一つは task driven。これはわかりやすい。例えば感情推定 (文が positive か negative か判定)。文の出力が正解になるように重みを学習する。これなら、正解を出せば良いと割り切れる。1個のタスクだけだと、感情推定に特化した重みが学習される。multi-task learning にして隠れ層を共有すれば、それなりの汎用性を持つようになる、かもしれない。

ここでは構成性が仮定されている。意味を担う単位は単語で、それより大きな塊は合成によって得られる。WSD 的な解釈では、単語自体は多義で、特定の文脈で特定の語義が採用されると思うのだが、既存の研究はそういうモデル化をせずに、単純なモデルで攻めているっぽい。

おわりに

ニューラルネットと聞いて、あえて素人的な発想をするなら、脳である。意味は何らかの形で脳内に保持されているのだろう。脳と言えば、ニューロンで、そのネットワークである。そんなこんなで、よく分からない連続値の羅列が意味なんだと言われるとそうかもしれない。その方向に突撃すると未来があるかもしれない。しかし何かに負けた気がする。その対極として、論理の世界がある。分布仮説的な意味と論理の意味が統合される未来が想像できない。

Randomized Pruning

Alexandre Bouchard-Côté et al. Randomized Pruning: Efficiently Calculating Expectations in Large Dynamic Programs. NIPS 2009. (pdf)

時間があいてしまったが、前回と同じ話題。sampling 時に pruning を行う手法。前回はいずれも slice sampling に基づいていたが、今回はかなり違う発想。そこが面白い。

あらかじめ断っておくと、使い勝手は悪い。sampling 対象とは別個に、簡単に計算できる別のモデルを用意しておく必要がある。論文の実験では、bitext parsing をするのに、Berkeley Aligner を使っている。機械翻訳の人は、簡単なモデルからはじめて徐々に複雑にしていくのに慣れているかもしれない。でも他の分野はそうでもない。

第一著者は、以前紹介した言語系統樹を与えて祖語の語形を推定する話の人。ちゃんと統計がわかっている人。MCMC sampling の使い方も王道的。表題にあるように、期待値計算の近似に用いる。私を含む他の言語処理関係者が、sampling を randomized search としてしか使っていないのとは大違い。

trick は大きく2つ。ひとつは pruning mask を分解していること。もう一つは MCMC にメタな MCMC を設けていること。論文はこの順番に説明しているが、ここでは後者を先に見る。

今回は blocked Gibbs sampling になっていて提案が常に受理されるが、Metropolis-Hasting の提案分布を考えた方がわかりやすい。MH の提案分布はパラメータを持っている。例えば、ガウス分布で random walk するなら分散をパラメータとして持つ。普通はこのパラメータは固定しておいて MCMC を走らせる。でも、パラメータの値の集合を用意しておいて、適当に交代させても MCMC としては問題ない。例えば、ガウス分布なら、大きな分散と小さな分散を用意しておけば、ドツボにはまって動けなくなるのを防げそう。これをさらに一般化すると、パラメータ自体が MCMC で遷移しても大丈夫ということになる。

注意が必要なのは、このメタな MCMC は、sampling 対象の MCMC (e.g., bitext parsing) の状態とは別個に構成していること。言い換えると、元の MCMC の状態を見ながら遷移の仕方を変えているわけではない。これが理由で、本来の sampling 対象とは別個に、簡単に計算できる別のモデルが必要となる。このモデルの出力を適当に加工して遷移パラメータを決める。

MCMC の状態を見ながら遷移の仕方を変える手法を adaptive MCMC というらしい。adaptive MCMC の論文を眺めると、たかが Gaussian の提案分布を adaptive にするだけでも、ちょっと間違えれば不正確になってしまう。正しく構成するために大変な議論が必要になっている。adaptive にできないと決まったわけではないが、無理ゲー感が漂っている。

話を元に戻す。やりたいことは、候補数の爆発を抑えるための pruning。確率の高そうな候補群だけを考えたい。しかし、同時に sampling として正しく構成したい。例えば、常に pruning されるセルがあるとまずい。確率が低いセルにも低い確率で訪れる必要がある。

論文では CKY を例に説明している。pruning によりセル単位で枝刈りしていくことになる。簡単な別モデルを使うと、確率の高そうなセルの集合が得られる。こうして得られる新しい集合を直接 pruning に使う、つまり、残りのセルを pruning してしまうと、正しい sampling にならない。

ではどうするかというと、もう一つの trick の出番。mask (セルが keep か prune かを決める) を selection と assignment という2つに分解して構成している。selection はメタな MCMC で得られるもの。各セルに selected か excluded かいずれかの値を付与する。次の状態への遷移をどうするかというと、現在 selected なセルの一部を取り除いて、代わりに別モデルから得られるセル集合の一部を加える。

assignment は現在採用されているセル集合。sampling 対象の MCMC の状態では、いくつかのセルが採用されて構文木が作られている。

selection と assignment から決定的に mask が作られる。mask は selected なセルに関して発動する。あるセルが selected でかつ assigned (論文の用語で positive) なら、それと競合するセルを prune する。セルが selected でかつ unassigned (negative) なら、そのセルを prune する。残りは keep。

何が起きるかというと、いま採用されているセルは必ず keep される。残りが pruning の候補となるわけだが、selection の状態の変化によって、pruning の対象がちょっとずつ変わっていく。そのため、確率の低いセルもその確率に応じて採用できる。

あとは細かい話。結局 slice sampling と同じく、補助変数を導入していることになる。決定的な処理をいろいろやっているけど、それを確率の形で表しているから理解しにくい。

最初に言ったように使い勝手は悪い。前回見たように、slice sampling による pruning も微妙な点がある。何が大変かというと、対象の分布からの正しい sample を得る部分。でも、そもそも sampling を randomized search としてしか使っていないなら、本当にそこを頑張る必要があるのか怪しい。不正確なのを承知のうえで beam search しても良いんじゃないかと思えてくる。