自然言語処理プログラミング勉強会8 - 句構造解析

Slides:



Advertisements
Similar presentations
ゲームプログラミング講習 第2章 関数の使い方
Advertisements

サービス管理責任者等研修テキスト 分野別講義    「アセスメントと        支援提供の基本姿勢」 <児童発達支援管理責任者> 平成27年10月1日.
ヒトの思考プロセスの解明を目的とするワーキングメモリの研究
第27講 オームの法則 電気抵抗の役割について知る オームの法則を使えるようにする 抵抗の温度変化を理解する 教科書P.223~226
コラッツ予想の変形について 東邦大学 理学部 情報科 白柳研究室 山中 陽子.
コンパイラ 第3回 字句解析 ― 決定性有限オートマトンの導出 ―
第5章 家計に関する統計 ー 経済統計 ー.
公共財 公共経済論 II no.3 麻生良文.
VTX alignment D2 浅野秀光 2011年12月15日  放射線研ミーティング.
冷却フランシウム原子を用いた 電子の永久電気双極子能率探索のための ルビジウム磁力計の研究
生命情報学 (8) スケールフリーネットワーク
前半戦 「史上最強」風 札上げクイズ.

認知症を理解し 環境の重要性について考える
フッ化ナトリウムによる洗口 2010・9・13 宮崎市郡東諸県郡薬剤師会 学校薬剤師  日高 華代子.
食品の安全性に関わる社会システム:総括 健康弱者 ハイリスク集団 HACCP (食肉処理場・食品工場) 農場でのQAP 一般的衛生管理
規制改革とは? ○規制改革の目的は、経済の活性化と雇用の創出によって、   活力ある経済社会の実現を図ることにあります。
地域保健対策検討会 に関する私見(保健所のあり方)
公共政策大学院 鈴木一人 第8回 専門化する政治 公共政策大学院 鈴木一人
医薬品ネット販売規制について 2012年5月31日 ケンコーコム株式会社.
平成26年8月27日(水) 大阪府 健康医療部 薬務課 医療機器グループ
平成26年度 呼吸器学会からの提案結果 (オレンジ色の部分が承認された提案) 新規提案 既収載の変更 免疫組織化学染色、免疫細胞化学染色
エナジードリンクの危険性 2015年6月23日 経営学部市場戦略学科MR3195稲沢珠依.
自動吸引は 在宅を変えるか 大分協和病院 院長         山本 真.
毎月レポート ビジネスの情報 (2016年7月号).
医療の歴史と将来 医療と医薬品産業 個人的経験 3. 「これからの医療を考える」 (1)医薬品の研究開発 -タクロリムスの歴史-
社会福祉調査論 第4講 2.社会調査の概要 11月2日.
2015年12月28日-2016年3月28日 掲載分.
2010度 民事訴訟法講義 補論 関西大学法学部教授 栗田 隆.
腫瘍学概論 埼玉医科大学国際医療センター 包括的がんセンター 緩和医療科/緩和ケアチーム 奈良林 至
“企業リスクへの考え方に変化を求められています。 トータルなリスクマネジメント・サービスをプロデュースします。“
情報漏えい 経済情報学科 E  西村 諭 E  釣 洋平.
金融班(ミクロ).
第11回 2009年12月16日 今日の資料=A4・4枚+解答用紙 期末試験:2月3日(水)N2教室
【ABL用語集】(あいうえお順) No 用語 解説 12 公正市場価格 13 債権 14 指名債権 15 事業収益資産 16 集合動産 17
基礎理論(3) 情報の非対称性と逆選択 公共政策論II No.3 麻生良文.
浜中 健児 昭和42年3月27日生まれ 東京都在住 株式会社ピー・アール・エフ 代表取締役 (学歴) 高 校:千葉県立東葛飾高校 卒業
COPYRIGHT(C) 2011 KYUSHU UNIVERSITY. ALL RIGHTS RESERVED
Blosxom による CMS 構築と SEO テクニック
記入例 JAWS DAYS 2015 – JOB BOARD 会社名 採用職種 営業職/技術職/その他( ) 仕事内容 待遇 募集数
ネットビジネスの 企業と特性 MR1127 まさ.
Future Technology活用による業務改革
ネットビジネス論(杉浦) 第8回 ネットビジネスと情報技術.
g741001 長谷川 嵩 g740796 迫村 光秋 g741000 西田 健太郎 g741147 小井出 真聡
自然独占 公共経済論 II no.5 麻生良文.
Autonomic Resource Provisioning for Cloud-Based Software
Webショップにおける webデザイン 12/6 08A1022 甲斐 広大.
物理的な位置情報を活用した仮想クラウドの構築
ハイブリッドクラウドを実現させるポイントと SCSKのOSSへの取組み
寺尾 敦 青山学院大学社会情報学部 第12回 情報デザイン(4) 情報の構造化と表現 寺尾 敦 青山学院大学社会情報学部
【1−1.開発計画 – 設計・開発計画】 システム開発計画にはシステム開発を効率的、効果的に実行する根拠(人員と経験、開発手順、開発・導入するシステム・アプリケーション・サービス等)を記述すること。 システム開発の開始から終了までの全体スケジュールを記載すること。 アプリケーション機能配置、ソフトウェア、インフラ構成、ネットワーク構成について概要を示すこと。
6 日本のコーポレート・ガバナンス 2008年度「企業論」 川端 望.
急成長する中国ソフトウェア産業 中国ソフトウェアと情報サービス産業の規模 総売上高は5年間で約5.3倍の成長
米国ユタ州LDS病院胸部心臓外科フェローの経験
公益社団法人日本青年会議所 関東地区埼玉ブロック協議会 JCの情熱(おもい)育成委員会 2011年度第1回全体委員会
次世代大学教育研究会のこれまでの活動 2005年度次世代大学教育研究大会 明治大学駿河台校舎リバティタワー9階1096教室
子どもの本の情報 大阪府内の協力書店の情報 こちらをクリック 大阪府内の公立図書館・図書室の情報
第2回産業調査 小島浩道.
〈起点〉を示す格助詞「を」と「から」の選択について
広東省民弁本科高校日語専業骨幹教師研修会 ①日本語の格助詞の使い分け ②動詞の自他受身の選択について   -日本語教育と中日カルチャーショックの観点から- 名古屋大学 杉村 泰.
■5Ahバッテリー使用報告 事例紹介/東【その1】 ■iphon4S(晴れの昼間/AM8-PM3) ◆約1時間で68%⇒100%
『ワタシが!!』『地域の仲間で!!』 市民が始める自然エネルギー!!
ポイントカードの未来形を形にした「MUJI Passport」
SAP NetWeaver を支える Microsoft テクノロジーの全貌 (Appendix)
ガイダンス(内業) 測量学実習 第1回.
Python超入門 久保 幹雄 東京海洋大学.
熱力学の基礎 丸山 茂夫 東京大学大学院 工学系研究科 機械工学専攻
京都民医連中央病院 CHDF学習推進委員会
資料2-④ ④下水道.
Accessによる SQLの操作 ~実際にテーブルを操作してみよう!~.
Presentation transcript:

自然言語処理プログラミング勉強会8 - 句構造解析 Graham Neubig 奈良先端科学技術大学院大学 (NAIST)

自然言語は曖昧性だらけ! I saw a girl with a telescope 構文解析(パージング)は構造的な曖昧性を解消

構文解析の種類 I saw a girl with a telescope I saw a girl with a telescope 係り受け解析: 単語と単語のつながりを重視 句構造解析: 句とその再帰的な構造を重視 I saw a girl with a telescope S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

句の再帰的な構造 I saw a girl with a telescope S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

句の再帰的な構造 I saw a girl with a telescope S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

句の再帰的な構造 I saw a girl with a telescope ??? S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

句の再帰的な構造 I saw a girl with a telescope ??? S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

句の再帰的な構造 I saw a girl with a telescope ??? S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

I saw a girl with a telescope 違う構造→違う解釈 S VP ??? NP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

I saw a girl with a telescope 違う構造→違う解釈 S VP ??? NP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

I saw a girl with a telescope 違う構造→違う解釈 S VP ??? NP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

I saw a girl with a telescope 違う構造→違う解釈 S VP ??? NP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

非終端記号、前終端記号、終端記号 I saw a girl with a telescope 非終端記号 前終端記号 終端記号 S VP PP NP NP NP 前終端記号 PRP VBD DT NN IN DT NN I saw a girl with a telescope 終端記号

予測問題としての構文解析 I saw a girl with a telescope 文Xが与えられ、構文木Yを予測 「構造予測」の問題(品詞推定、単語分割と同様) S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

構文解析の確率モデル I saw a girl with a telescope 文Xが与えられ、事後確率の最も高い構文木Yを予測 S VP PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope argmax 𝑌 𝑃 𝑌∣𝑋

生成モデル 構文木Yと文Xが同時に確率モデルにより生成されたと する Xを固定すると、同時確率が最も高いYは事後確率も最 も高い 𝑃 𝑌,𝑋 argmax 𝑌 𝑃 𝑌∣𝑋 = argmax 𝑌 𝑃 𝑌,𝑋

P( ) 確率的文脈自由文法(PCFG) I saw a girl with a telescope 構文木の同時確率をどう定義するか? S VP P( ) PP NP NP NP PRP VBD DT NN IN DT NN I saw a girl with a telescope

確率的文脈自由文法(PCFG) I saw a girl with a telescope PCFG:各ノードの確率を個別に定義 P(S → NP VP) S P(VP → VBD NP PP) VP P(PP → IN NP) PP P(NP → DT NN) NP NP P(PRP → “I”) NP P(NN → “telescope”) PRP VBD DT NN IN DT NN I saw a girl with a telescope

確率的文脈自由文法(PCFG) I saw a girl with a telescope PCFG:各ノードの確率を個別に定義 構文木の確率はノードの確率の積 P(S → NP VP) S P(VP → VBD NP PP) VP P(PP → IN NP) PP P(NP → DT NN) NP NP P(PRP → “I”) NP P(NN → “telescope”) PRP VBD DT NN IN DT NN I saw a girl with a telescope P(S → NP VP) * P(NP → PRP) * P(PRP → “I”) * P(VP → VBD NP PP) * P(VBD → “saw”) * P(NP → DT NN) * P(DT → “a”) * P(NN → “girl”) * P(PP → IN NP) * P(IN → “with”) * P(NP → DT NN) * P(DT → “a”) * P(NN → “telescope”)

確率的構文解析 構文解析は確率が最大の構文木を探索すること ビタビアルゴリズムは利用可能か? argmax 𝑌 𝑃 𝑌,𝑋

確率的構文解析 構文解析は確率が最大の構文木を探索すること ビタビアルゴリズムは利用可能か? 答え:いいえ! 理由:構文木の候補はグラフで表せず超グラフとな る argmax 𝑌 𝑃 𝑌,𝑋

超グラフとは? I saw a girl with a telescope I saw a girl with a telescope 2つの構文木がある とする S 0,7 VP 1,7 NP 2,7 S 0,7 PP 4,7 NP 0,1 NP 2,4 NP 5,7 VP 1,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 PP 4,7 I saw a girl with a telescope NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 I saw a girl with a telescope

超グラフとは? I saw a girl with a telescope I saw a girl with a telescope その大半は同じ S 0,7 VP 1,7 NP 2,7 S 0,7 PP 4,7 NP 0,1 NP 2,4 NP 5,7 VP 1,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 PP 4,7 I saw a girl with a telescope NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 I saw a girl with a telescope

超グラフとは? I saw a girl with a telescope 両方に現れるエッジだけを残すと: S 0,7 VP 1,7 NP 2,7 PP 4,7 NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 I saw a girl with a telescope

超グラフとは? I saw a girl with a telescope 1番目の構文木のみに存在するエッジを追加: S 0,7 VP 1,7 NP 2,7 PP 4,7 NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 I saw a girl with a telescope

超グラフとは? I saw a girl with a telescope 2番目の構文木のみに存在するエッジを追加: S 0,7 VP 1,7 NP 2,7 PP 4,7 NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 I saw a girl with a telescope

超グラフとは? I saw a girl with a telescope 両方の構文木のみに存在するエッジを追加: ここで2択: 0,7 ここで2択: 赤を選択すると1番目構文木 青を選択すると2番目構文木 VP 1,7 NP 2,7 PP 4,7 NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 I saw a girl with a telescope

なぜ「超」グラフ? I saw エッジの「次数」は子の数 超グラフの次数はエッジの次数の最大値 グラフは次数1の超グラフ! 次数1 次数2 次数3 PRP 0,1 VBD 1,2 VP 1,7 VP 1,7 I saw VBD 1,2 NP 2,7 VBD 1,2 NP 2,4 PP 4,7 1 2 3 2.5 4.0 2.3 2.1 1.4 例 →

重み付き超グラフ I saw a girl with a telescope グラフと同じく: 超グラフのエッジに重みを付与 負の対数確率(ビタビアルゴリズムと同等の理由) S 0,7 -log(P(S → PRP VP)) -log(P(VP → VBD NP)) VP 1,7 NP 2,7 -log(P(VP → VBD NP PP)) PP 4,7 NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 log(P(PRP → “I”)) I saw a girl with a telescope

超グラフの探索法 構文解析=超グラフの最もスコアの小さい木を探索

超グラフの探索法 構文解析=超グラフの最もスコアの小さい木を探索 グラフではビタビアルゴリズムを利用 前向きステップ: 各ノードまでの最短経路を計算 後ろ向き: 最短経路を復元

超グラフの探索法 構文解析=超グラフの最もスコアの小さい木を探索 グラフではビタビアルゴリズムを利用 前向きステップ: 各ノードまでの最短経路を計算 後ろ向き: 最短経路を復元 超グラフもほとんど同等のアルゴリズム 内ステップ: 各ノードの最小部分木のスコアを計算 外ステップ: スコア最小の木を復元

復習:ビタビアルゴリズム e2 1.4 4.0 2.3 2.5 1 2 3 e1 e3 e5 e4 2.1 best_score[0] = 0 for each node in the graph (昇順) best_score[node] = ∞ for each incoming edge of node score = best_score[edge.prev_node] + edge.score if score < best_score[node] best_score[node] = score best_edge[node] = edge

例: e2 e5 e3 e1 e4 1 2 3 初期化: 1.4 2.5 4.0 2.3 2.1 best_score[0] = 0 0.0 0.0 1 ∞ 2 ∞ 3 ∞ 2.5 4.0 2.3 e3 e5 e1 2.1 e4 初期化: best_score[0] = 0

例: e2 1.4 0.0 1 2.5 2 ∞ 3 ∞ 2.5 4.0 2.3 e3 e5 e1 2.1 e4 初期化: best_score[0] = 0 e1を計算: score = 0 + 2.5 = 2.5 (< ∞) best_score[1] = 2.5 best_edge[1] = e1

例: e2 e5 e3 e1 e4 1 2 3 初期化: e1を計算: e2を計算: 1.4 2.5 4.0 2.3 2.1 0.0 1 2.5 2 1.4 3 ∞ 2.5 4.0 2.3 e3 e5 e1 2.1 e4 初期化: best_score[0] = 0 e1を計算: score = 0 + 2.5 = 2.5 (< ∞) best_score[1] = 2.5 best_edge[1] = e1 e2を計算: score = 0 + 1.4 = 1.4 (< ∞) best_score[2] = 1.4 best_edge[2] = e2

例: e2 e5 e3 e1 e4 1 2 3 e3を計算: 初期化: e1を計算: e2を計算: 1.4 2.5 4.0 2.3 2.1 0.0 1 2.5 2 1.4 3 ∞ 2.5 4.0 2.3 e3 e5 e1 2.1 e4 e3を計算: 初期化: score = 2.5 + 4.0 = 6.5 (> 1.4) 変更なし! best_score[0] = 0 e1を計算: score = 0 + 2.5 = 2.5 (< ∞) best_score[1] = 2.5 best_edge[1] = e1 e2を計算: score = 0 + 1.4 = 1.4 (< ∞) best_score[2] = 1.4 best_edge[2] = e2

例: e2 e5 e3 e1 e4 1 2 3 e3を計算: 初期化: e1を計算: e4を計算: e2を計算: 1.4 2.5 4.0 0.0 1 2.5 2 1.4 3 4.6 2.5 4.0 2.3 e3 e5 e1 2.1 e4 e3を計算: 初期化: score = 2.5 + 4.0 = 6.5 (> 1.4) 変更なし! best_score[0] = 0 e1を計算: e4を計算: score = 0 + 2.5 = 2.5 (< ∞) best_score[1] = 2.5 best_edge[1] = e1 score = 2.5 + 2.1 = 4.6 (< ∞) best_score[3] = 4.6 best_edge[3] = e4 e2を計算: score = 0 + 1.4 = 1.4 (< ∞) best_score[2] = 1.4 best_edge[2] = e2

例: e2 e5 e3 e1 e4 1 2 3 e3を計算: 初期化: e1を計算: e4を計算: e2を計算: e5を計算: 1.4 0.0 1 2.5 2 1.4 3 3.7 2.5 4.0 2.3 e3 e5 e1 2.1 e4 e3を計算: 初期化: score = 2.5 + 4.0 = 6.5 (> 1.4) 変更なし! best_score[0] = 0 e1を計算: e4を計算: score = 0 + 2.5 = 2.5 (< ∞) best_score[1] = 2.5 best_edge[1] = e1 score = 2.5 + 2.1 = 4.6 (< ∞) best_score[3] = 4.6 best_edge[3] = e4 e2を計算: e5を計算: score = 0 + 1.4 = 1.4 (< ∞) best_score[2] = 1.4 best_edge[2] = e2 score = 1.4 + 2.3 = 3.7 (< 4.6) best_score[3] = 3.7 best_edge[3] = e5

前向きステップの結果: e2 1.4 0.0 2.5 1 2.5 4.0 2.3 2 1.4 3 3.7 e1 e3 e5 e4 2.1 best_score = ( 0.0, 2.5, 1.4, 3.7 ) best_edge = ( NULL, e1, e2, e5 )

後ろ向きステップ

後ろ向きステップのアルゴリズム e2 1.4 4.0 2.3 0.0 2.5 1 2.5 2 1.4 3 3.7 e1 e3 e5 e4 2.1 best_path = [ ] next_edge = best_edge[best_edge.length – 1] while next_edge != NULL add next_edge to best_path next_edge = best_edge[next_edge.prev_node] reverse best_path

e2 1.4 0.0 2.5 1 2.5 4.0 2 1.4 2.3 3 3.7 e1 e3 e5 e4 2.1 初期化: best_path = [] next_edge = best_edge[3] = e5

後ろ向きステップの例 初期化: e5を計算: e2 1.4 0.0 2.5 1 2.5 4.0 2 1.4 2.3 3 3.7 e1 e3 0.0 2.5 1 2.5 4.0 2 1.4 2.3 3 3.7 e1 e3 e5 e4 2.1 初期化: best_path = [] next_edge = best_edge[3] = e5 e5を計算: best_path = [e5] next_edge = best_edge[2] = e2

後ろ向きステップの例 初期化: e2を計算: e5を計算: e2 1.4 0.0 2.5 1 2.5 4.0 2 1.4 2.3 3 3.7 0.0 2.5 1 2.5 4.0 2 1.4 2.3 3 3.7 e1 e3 e5 e4 2.1 初期化: e2を計算: best_path = [] next_edge = best_edge[3] = e5 best_path = [e5, e2] next_edge = best_edge[0] = NULL e5を計算: best_path = [e5] next_edge = best_edge[2] = e2

後ろ向きステップの例 初期化: e5を計算: e5を計算: 逆順に並べ替え: 0.0 1 2.5 2 1.4 3 3.7 4.0 2.3 0.0 1 2.5 2 1.4 3 3.7 4.0 2.3 2.1 e1 e2 e3 e5 e4 初期化: e5を計算: best_path = [] next_edge = best_edge[3] = e5 best_path = [e5, e2] next_edge = best_edge[0] = NULL e5を計算: 逆順に並べ替え: best_path = [e5] next_edge = best_edge[2] = e2 best_path = [e2, e5]

ノードの内ステップ VP1,7の最小スコアを計算 VP 1,7 e2 NP 2,7 e1 PP 4,7 NP 2,4 VBD 1,2

ノードの内ステップ VP1,7の最小スコアを計算 e2 e1 score(e1) = -log(P(VP → VBD NP PP)) + best_score[VBD1,2] + best_score[NP2,4] + best_score[NP2,7] score(e2) = -log(P(VP → VBD NP)) + best_score[VBD2,7] VP 1,7 e2 NP 2,7 e1 PP 4,7 NP 2,4 VBD 1,2

ノードの内ステップ VP1,7の最小スコアを計算 e2 e1 score(e1) = -log(P(VP → VBD NP PP)) + best_score[VBD1,2] + best_score[NP2,4] + best_score[NP2,7] score(e2) = -log(P(VP → VBD NP)) + best_score[VBD2,7] best_edge[VB1,7] = argmine1,e2 score VP 1,7 e2 NP 2,7 e1 PP 4,7 NP 2,4 VBD 1,2

ノードの内ステップ VP1,7の最小スコアを計算 e2 e1 score(e1) = -log(P(VP → VBD NP PP)) + best_score[VBD1,2] + best_score[NP2,4] + best_score[NP2,7] score(e2) = -log(P(VP → VBD NP)) + best_score[VBD2,7] best_edge[VB1,7] = argmine1,e2 score best_score[VB1,7] = score(best_edge[VB1,7]) VP 1,7 e2 NP 2,7 e1 PP 4,7 NP 2,4 VBD 1,2

文法からの超グラフ構築 超グラフは解けるが、構文解析で与えられるのは 解くための超グラフをどうやって構築するか? 文法 文 P(S → NP VP) = 0.8 P(S → PRP VP) = 0.2 P(VP → VBD NP PP) = 0.6 P(VP → VBD NP)= 0.4 P(NP → DT NN) = 0.5 P(NP → NN) = 0.5 P(PRP → “I”) = 0.4 P(VBD → “saw”) = 0.05 P(DT → “a”) = 0.6 ... I saw a girl with a telescope

CKYアルゴリズム CKY(Cocke-Kasami-Younger)アルゴリズムは文法に基 づいてハイパーグラフを構築して解く 文法はチョムスキー標準形(CNF) ルールの右側は非終端記号2つもしくは終端記号1つ この条件を満たさないルールは変更可能 OK OK Not OK! S → NP VP S → PRP VP VP → VBD NP PRP → “I” VBD → “saw” DT → “a” VP → VBD NP PP NP → NN NP → PRP VP → VBD NP_PP NP_PP → NP PP VP → VBD NP PP NP → PRP + PRP → “I” NP → “I”

CKYアルゴリズム まずは終端記号のルールをスコア付きで展開 I saw him PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 0,2のノードを全て展開 I saw him S 0,2 SBAR 0,2 4.7 5.3 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 1,3のノードを全て展開 I saw him S 0,2 SBAR 0,2 VP 1,3 4.7 5.3 5.0 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 0,3のノードを全て展開 I saw him SBAR 0,3 S 0,3 6.1 5.9 S 0,2 SBAR 0,2 VP 1,3 4.7 5.3 5.0 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 文を全てカバーする「S」ノードを見つけて、エッジを 展開 I saw him SBAR 0,3 S 0,3 6.1 5.9 S 0,2 SBAR 0,2 VP 1,3 4.7 5.3 5.0 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 左の子、右の子を再帰的に展開 I saw him SBAR 0,3 S 0,3 6.1 5.9 S 0,2 SBAR VP 1,3 4.7 5.3 5.0 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 左の子、右の子を再帰的に展開 I saw him SBAR 0,3 S 0,3 6.1 5.9 S 0,2 SBAR VP 1,3 4.7 5.3 5.0 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 左の子、右の子を再帰的に展開 I saw him SBAR 0,3 S 0,3 6.1 5.9 S 0,2 SBAR VP 1,3 4.7 5.3 5.0 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

CKYアルゴリズム 左の子、右の子を再帰的に展開 I saw him SBAR 0,3 S 0,3 6.1 5.9 S 0,2 SBAR VP 1,3 4.7 5.3 5.0 PRP 0,1 NP 0,1 VP 1,2 VBD 1,2 PRP 2,3 NP 2,3 1.0 0.5 3.2 1.4 2.4 2.6 I saw him

構文木の出力 with a telescope 構文木の出力:「Penn Treebank形式」(S式) (PP (IN with) (NP (DT a) (NN telescope))) NP IN DT NN with a telescope

構文木の出力 I saw a girl with a telescope 再帰を使うと簡単に出力できる: ... print(S0,7) = “(S “ + print(NP0,1) + “ “ + print(VP1,7)+”)” S 0,7 print(NP0,1) = “(NP “ + print(PRP0,1) + ”)” print(PRP0,1) = “(PRP I)” VP 1,7 ... PP 4,7 NP 0,1 NP 2,4 NP 5,7 PRP 0,1 VBD 1,2 DT 2,3 NN 3,4 IN 4,5 DT 5,6 NN 6,7 I saw a girl with a telescope

擬似コード

CKY擬似コード: 文法の読み込み # “lhs \t rhs \t prob \n”形式の文法を読み込む make list nonterm # (左, 右1, 右2, 確率)の非終端記号 make map preterm # pre[右] = [ (左, 確率) ...] 形式のマップ for rule in grammar_file split rule into lhs, rhs, prob (with “\t”) # P(左→右)=確率 split rhs into rhs_symbols (with “ “)  if length(rhs) == 1: # 前終端記号 add (lhs, log(prob)) to preterm[rhs] else: # 非終端記号 add (lhs, rhs[0], rhs[1], log(prob)) to nonterm

CKY擬似コード: 前終端記号を追加 split line into words make map best_score # 引数=symi,j 値=最大対数確率 make map best_edge # 引数=symi,j 値=(lsymi,k, rsymk,j) # 前終端記号を追加 for i in 0 .. length(words)-1: for lhs, log_prob in preterm where P(lhs → words[i]) > 0: best_score[lhsi,i+1] = [log_prob]

CKY擬似コード: 非終端記号の組み合わせ for j in 2 .. length(words): # jはスパンの右側 for i in j-2 .. 0: # iはスパンの左側(右から左へ処理!) for k in i+1 .. j-1: # kはrsymの開始点 # 各文法ルールを展開:log(P(sym → lsym rsym)) = logprob for sym, lsym, rsym, logprob in nonterm: # 両方の子供の確率が0より大きい if best_score[lsymi,k] > -∞ and best_score[rsymk,j] > -∞: # このノード・辺の対数確率を計算 my_lp = best_score[lsymi,k] + best_score[rsymk,j] + logprob # この辺が確率最大のものなら更新 if my_lp > best_score[symi,j]: best_score[symi,j] = my_lp best_edge[symi,j] = (lsymi,k, rsymk,j)

CKY擬似コード:木を出力 print(S0,length(words)) # 文全体を覆う「S」を出力 subroutine print(symi,j): if symi,j exists in best_edge: # 非終端記号 return “(“+sym+” “ + print(best_edge[0]) + “ ” + + print(best_edge[1]) + “)” else: # 終端記号 return “(“+sym+“ ”+words[i]+“)”

演習課題

演習課題 実装 cky.py テスト 入力: test/08-input.txt 文法: test/08-grammar.txt 出力: test/08-output.txt 実際のデータに対して動かす data/wiki-en-test.grammar, data/wiki-en-short.tok 木を可視化 08-parsing/print-trees.py < wiki-en-test.trees (NLTKをインストールする必要あり: http://nltk.org/) チャレンジ 未知語に対処できるように改良

Thank You!