単一化アルゴリズムとHPSGパージング 二宮 崇.

Slides:



Advertisements
Similar presentations
PCFG の EM アルゴリズムとス ムージング 二宮 崇 1. 今日の講義の予定 PCFG (Probabilistic Context Free Grammar, 確率付 文脈自由文法 ) EM アルゴリズム スムージング 教科書 北研二 ( 著 ) 辻井潤一 ( 編 ) 言語と計算 4 確率的言語モデル.
Advertisements

プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
HPSG (前半) 二宮 崇.
数理言語情報論 第11回 2009年12月16日 数理言語情報学研究室 講師 二宮 崇.
人工知能特論II 二宮 崇.
コンパイラ 2011年10月17日
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
LMNtalからC言語への変換の設計と実装
プログラミング基礎I(再) 山元進.
An Algorithm for Enumerating Maximal Matchings of a Graph
LMNtalからC言語への変換の設計と実装
数理言語情報論 第8回 2009年11月25日 数理言語情報学研究室 講師 二宮 崇.
第8回 プログラミングⅡ 第8回
条件式 (Conditional Expressions)
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ 2012年10月22日
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
テキストボックス、チェックボックス×2、コマンドボタンを配置する。 コマンドボタンに機能を与える
コンパイラ 2011年10月24日
二分探索木によるサーチ.
第4回JavaScriptゼミ セクション2-8 発表者 直江 宗紀.
データ構造とアルゴリズム 第4回 リスト ~ データ構造(1)~.
アルゴリズムとデータ構造1 2006年6月16日
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
アルゴリズムとデータ構造勉強会 第6回 スレッド木
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
国立情報学研究所 ソフトウェア研究系 助教授/
 型推論1(単相型) 2007.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとプログラミング (Algorithms and Programming)
暗号技術 ~暗号技術の基本原理~ (1週目) 情報工学科  04A1004 石川 真悟.
フロントエンドとバックエンドのインターフェース
プログラミング 4 木構造とヒープ.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
コンパイラ 2011年10月20日
 型推論3(MLの多相型).
15.cons と種々のデータ構造.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
米澤研究室 全体ミーティング 2010/07/07 M2 渡邊裕貴.
人工知能特論II 第8回 二宮 崇.
情報工学概論 (アルゴリズムとデータ構造)
PROGRAMMING IN HASKELL
~sumii/class/proenb2010/ml2/
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
2006/6/27(通信コース)2006/7/5(情報コース) 住井
情報処理Ⅱ 2006年11月24日(金).
4.プッシュダウンオートマトンと 文脈自由文法の等価性
~sumii/class/proenb2009/ml6/
ヒープソート.
PROGRAMMING IN HASKELL
言語プロセッサ ー第9回目ー 構文解析(続き).
参考:大きい要素の処理.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 第2回 2004年10月12日(火).
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
プログラミング 2 静的変数.
Presentation transcript:

単一化アルゴリズムとHPSGパージング 二宮 崇

今日の講義の予定 単一化アルゴリズム HPSGのフルパージング 教科書 C. D. Manning & Hinrich Schütze “FOUNDATIONS OF STATISTICAL NATURAL LANGUAGE PROCESSING” MIT Press, 1999

型付素性構造の単一化アルゴリズム データ構造 アルゴリズム 型テーブル ヒープ ポインタ Unify(F, G) 破壊的単一化アルゴリズム 出力: F, Gのポインタは同じデータを指し、そのデータがF, Gの単一化の結果

型テーブル:型定義 (復習)型階層 特殊 一般 adj verb 正方形 perp 円筒 長方形 菱形 subst 円 func 四角 丸 plus minus head bool 図形 ⊥ 一般 (ボトム)

型テーブル:型の包摂関係 t4 ⊔ t9=t12 型単一化の結果: 共通の特殊な型のうち最も一般な型 特殊 一般 t13 t8 t6 t12 ⊥ 一般 (ボトム)

型テーブル 型定義は単一化実行前に与えられていると仮定 静的に全ての型の組み合わせに対する単一化を計算 t ⊔u=u ⊔tなので、表の半分だけ計算すれば良い スパースになるケースが多いのでハッシュで実装することが多い ⊥ t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 -

ヒープとセル ヒープ セル セルの列 タグとデータのペア アドレス タグ データ 0x00000000 VAR a 0x00000001 STR e 0x00000002 0x00000003 INT 15 0x00000004 FLO 0.335 0x00000005 f 0x00000006 PTR 0x00000007 STG “Taro” ...

ヒープとヒープポインタ ヒープには使用領域と未使用領域の二つがある ヒープポインタ 新しいデータは未使用領域に追加される 未使用領域の先頭アドレス(=使用領域の末尾アドレス+1)を格納した変数 0x00000000 0x00000001 ..... 0xffffffff used ヒープポインタ unused

タグの種類 重要なタグ 特殊なデータのためのタグ VAR: 枝をまだ持っていないノード。データ部は整数の型ID。 STR: 枝を持つノード。データ部は整数の型ID。 PTR: ポインタ。データ部はアドレス。 特殊なデータのためのタグ INT: 整数(integer) FLO: 浮動小数 STG: 文字列

ヒープ上の素性構造 F F アドレス タグ データ 0x00010000 STR d 0x00010001 VAR e 0x00010002 PTR 0x00010005 0x00010006 0x00010007 ... d F: G: F d F: G: e a 10

VAR もしかしたら今後、枝(素性)を持つようになるかもしれないけど今は持っていないノード データ部にはノードの型のID (整数値)を格納 枝を持つようになったら、ポインタで上書きして、ポインタの先に新しい枝つきのデータを作成 アドレス タグ データ .... ... 0x00010001 VAR e アドレス タグ データ .... ... 0x00010001 PTR 0x0020002e STR e 0x0020002f VAR g HP

STR 枝(素性)つきノード 後続するアドレスのセルにはそのノードが持つ素性の値が入る データ部にはノードの型のID(整数) 後続するアドレスのセルにはそのノードが持つ素性の値が入る 素性の順番はSTRタグを持ったノードの型と素性によって静的に決定しておく Index(f, t)=1, 2, 3,...,nt 例えば、素性にIDをつけて、型tがもつ素性集合のうちIDの昇順に並べる、など。型tが素性fを持たない時は0を返すようにすると便利 新しくSTRタグのデータをつくるときは、その素性値にはデフォルト値として、appropriateな型を格納する Approp(f, t) アドレス タグ データ .... ... 0x00010001 STR e 0x00010002 VAR g 0x00010003 PTR 0x0001023f

PTR 実データを指すポインタ ポインタはチェーンになっていても構わない 手続き型言語でよくあるポインタのポインタといった複雑な構造ではないので注意! アドレス タグ データ .... ... 0x00010001 PTR 0x00010005 0x00010002 STR f 0x00010003 VAR g 0x00010004 0x00010006 0x00010007 h 矢印が指すアドレスの素性構造は全部同じ(0x00010007のデータ)

Deref ポインタを辿って実データのアドレスを得る操作 Deref( p ) ## アドレス p while(Heap[p].tag = PTR ) ## タグがPTR p := Heap[p].data ## pをアドレスpのセルのデータで置き換える return p 0x00010001 PTR 0x00010005 0x00010002 STR f 0x00010003 VAR g 0x00010004 0x00010006 0x00010007 h Deref(0x00010001) = 0x00010007

ポインタに対する考え方 同じノードを指すポインタの集合 local local foo cat nil valence noun nom HOGE: cat VALENCE: nil COMPS: valence noun nom CASE: nil SPR:

ポインタに対する考え方 どこから指されているのか気にせず実データの書き換えを簡単に行える goo goo 今ここを書き変えたい local CAT: local CAT: DEE: dee cat cat

単一化アルゴリズム(1/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 もしp=qなら終了 p tp q tq G: I: G: H: H: もしp=qなら終了

単一化アルゴリズム(2/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 新しいノードを生成 r p tp q tr tq F: G: I: G: H: H: 新しいノードを生成 ノードの型trはtr = tp ⊔ tq

単一化アルゴリズム(3/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 pとqをrを指すポインタに書換 r p tr F: G: I: G: H: H: pとqをrを指すポインタに書換

単一化アルゴリズム(4/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 r p q tr F: G: I: F: G: H: H: G: H: J: I: 新しいノードの型trが持つ素性に対する枝を作る

単一化アルゴリズム(5/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 共通でない素性には単純にポインタをはる r p q tr F: G: I: F: G: H: H: G: H: J: I: 共通でない素性には単純にポインタをはる

単一化アルゴリズム(6/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 r p q tr G: F: G: H: H: G: H: J: I: tpにもtqにもない新しい素性J:にはAppropriateな型(trと素性J:に対して定義されるデフォルトの型)のノードを生成

単一化アルゴリズム(7/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 r p q tr G: F: G: H: H: G: H: J: I: 共通の素性G: H: に対しては、とりあえず、pかqのどちらかの素性G:H:が指すノードに対し、ポインタを貼る

単一化アルゴリズム(8/8) Unify(p, q): アドレス pとアドレス qの素性構造を単一化 r p q tr p’’ q’ G: p’ F: q’’ G: H: H: G: H: J: I: Unify(p’, q’)とUnify(p’’, q’’)を再帰呼び出し

単一化アルゴリズム: まとめ Unify(p, q) # pとqはヒープ上のアドレス p := Deref(p); q := Deref(q); if( p = q ) return true; r := HP; HP := HP + 1; tagp := Heap[p].tag; tp := Heap[p].data; tagq: = Heap[q].tag; tq := Heap[q].data; tr :=Type-Unify(tp, tq); if (tr is not defined ) return false; Heap[p].tag := PTR; Heap[p].data := r; Heap[q].tag := PTR; Heap[q].data := r; Heap[r].tag := STR; Heap[r].data := tr; HP := HP + |Features(tr)|; foreach f ∈ Features(tr) if( f ∈ Features(tp) ∧ tagp = STR ) Heap[r + index(f, tr)].tag := PTR; Heap[r + index(f, tr)].data := p + index(f, tp) else if( f ∈ Features(tq) ∧ tagq = STR ) Heap[r + index(f, tr)].tag := PTR; Heap[r + index(f, tr)].data := q + index(f, tq) else Heap[r + index(f, tr)].tag := VAR; Heap[r + index(f, tr)].data := Approp(f, tr) foreach f ∈ (Features(tp) ∩ Features(tq)) if( ¬Unify(p + index(f, tp), q + index(f, tq)) ) return false; return true;

単一化アルゴリズムの特徴 素性構造にサイクルがあってもok 必ず終了する Unifyが再帰呼び出しされる度に実体ノード(ポインタ以外のノード)が一つずつ減る appropriateな型のノードが生成される時のみVARノードが増えるが、このノードを無視すれば、各ステップでノードが一つずつ減る VARノードを無視しても良い大雑把な説明 アルゴリズムを改良して、タグの組み合わせで処理を分類すると、各ステップでSTRノードの数が増えないようにすることができる VARとVAR→VAR (STRノード数は減らない) VARとSTR→STR (STRノード数は減らない) STRとSTR→STR( STRノード数がひとつ減る) 各STRノードが持つことができるVARノードは全ての型に対する最大素性数で抑えられるため、実ノード数をSTRノード数×最大素性数と考えれば、この数は各ステップごとに一つずつ減るので、必ず終了する

⊔ = 単一化の例 (1) 異なる型の場合は、型単一化を行う。型単一化に失敗すると、全体の単一化も失敗 F: G: F: G: F: G: F: a G: b F: a G: b F: a ⊔ = G: F: c G: H: a F: c H: a I: a J: b I: a J: b 異なる型の場合は、型単一化を行う。型単一化に失敗すると、全体の単一化も失敗

単一化の例 (1) Unify(p, q) q p G: F: F: G: G: F: G: H: F: F: J: I: b a a a c a b

単一化の例 (1) Unify(p, q) p q G: F: F: G: G: F: G: H: F: F: J: I: b a a a c a b

単一化の例 (1) Unify(p, q) p q G: F: G: F: G: H: F: F: J: I: b a a a c a b

単一化の例 (1) Unify(p, q) q p G: F: G: F: G: H: F: a J: I: b a b c a

⊔ = 単一化の例 (2) 1 1 1 1 (a⊔c=dとする) F: F: a F: F: G: F: d F: a G: b G: H:a F: a G: b ⊔ = 1 1 F: c H: a 1 1 (a⊔c=dとする)

単一化の例 (2) Unify(p, q) q p F: G: F: G: F: G: H: F: F: a b a c a

単一化の例 (2) Unify(p, q) q p F: G: F: G: F: G: H: F: F: a b a c a

単一化の例 (2) Unify(p, q) q p G: F: G: F: G: H: F: F: a b a c a

単一化の例 (2) Unify(p, q) q p G: F: G: G: F: H: F: b a c a

単一化の例 (2) Unify(p, q) q p G: F: G: F: H: F: b a c a

単一化の例 (2) Unify(p, q) q p G: F: F: H: G: F: b a a c

単一化の例 (2) Unify(p, q) q p G: F: F: H: G: b d a

HPSGのスキーマの単一化 synsem: dtrs: right-dtr: left-dtr: スキーマ (=句構造規則)

HPSGのスキーマの単一化 ここが新しい親になる スキーマ (=句構造規則) synsem: dtrs: right-dtr: left-dtr: right daughter left daughter 単一化 単一化

Reduce Sign 子供の部分はいらないので切ってしまう ここが新しい親になる synsem: dtrs: right-dtr: left-dtr: 子供の部分はいらないので切ってしまう

Reduce Sign 子供(daughters)の部分をカット 子供がまるまる残っていると、構文木のルートノードに全ての展開された構文木集合が格納されてしまう(簡単に数百億以上の構文木になってしまう) そこで、子供の部分をカットしてCKYチャートに格納してやればよい

CKYアルゴリズム CFGのCKYアルゴリズムとの違い 非終端記号のかわりに素性構造が格納される 子供をカットする操作 (reduce sign)が必要 単一化は破壊的操作なので、実行前にコピーをして元の素性構造を残しておく ルール規則の適用 CFG: 非終端記号X, Yに対し、G(X, Y)は親の非終端記号集合を返す HPSG: 素性構造X, Yに対し、G(X, Y)は親の素性構造集合を返す ファクタリング CFG: 等価な非終端記号 HPSG: 等価な素性構造 (X = Y iff X ⊑Y and X ⊒ Y) デコーディングの時も同様 ⊑⊏⊒⊔⊐

CKY法 for HPSG for j = 1 to n Sj-1,j := L(wj) ## Lは単語wに対する素性構造の集合を返す関数 for l = 2 to n for i = 0 to n – l j := i + l; for k = i+1 to j - 1 forall X∈Si,k forall Y∈Sk,j forall b ∈ BS # BSはバイナリースキーマの集合 X’ := copy(X); Y’ := copy(Y); b’ := copy(b) Si,j := Si,j ∪ Reduce(b’(X’, Y’)) Si,j := Si,j ∪ U(Si,j) ## Uはユーナリールールの適用手続き

等価性チェックとコピー 構造共有があるため素性構造の等価性チェックやコピーはそんなに簡単ではない 破壊的でない操作 すでに辿ったセルのアドレスをハッシュにいれておいて構造共有をチェック 破壊的操作+バックトラック すでに辿ったセル上にマーキングタグと対応する相手側のアドレスを書き込む 変更履歴をたどることによって元のデータに戻す(バックトラック)

不完全ながら高速な等価性チェック セルの列とセルの列を単純なforループで簡単にチェック コピーする際に、ポインタの作り方や部分構造の作り方を工夫すれば、等価な素性構造はまったく同じセルの列になる ただし、VARタグを展開していない場合とVARタグが展開されてSTRになっている場合では正しいチェックができないので注意

まとめ 単一化アルゴリズム HPSGフルパージング