統計的係り受け解析入門

14,299
-1

Published on

Published in: Technology, Business

統計的係り受け解析入門

  1. 1. © 2010 IBM Corporation 自然言語処理勉強会@東京 統計的係り受け解析入門 日本アイ・ビー・エム(株)東京基礎研究所 海野 裕也(@unnonouno) 自然言語処理勉強会@東京
  2. 2. © 2010 IBM Corporation IBM Research - Tokyo 2 自然言語処理勉強会@東京 第3回2010/11/07 自己紹介 (1/2) 海野 裕也(うんの ゆうや) –twitter: @unnonouno –blog: http://unnonouno.blogspot.com –NLPかプログラミングか写真の話題 日本アイ・ビー・エム 東京基礎研究所所属 –今はTRLという略称は使われていません:) –テキストマイニング,自然言語処理の研究開発 –主に,動的計画法と木構造と戯れている
  3. 3. © 2010 IBM Corporation IBM Research - Tokyo 3 自然言語処理勉強会@東京 第3回2010/11/07 自己紹介 (2/2) 読めない unno / no / uno –≠unnounno, unonono –たまにリプライ先を間違えられる 海野(うんの) / の / UNO –この文自体に特に意味はない かな漢字変換と分かち書きという日本語自然言語処理 特有の問題を表したID @unnonouno
  4. 4. © 2010 IBM Corporation IBM Research - Tokyo 4 自然言語処理勉強会@東京 第3回2010/11/07 今日のお話 係り受け解析とは何か知ろう いくつかの重要な用語,記法を知ろう 典型的なアルゴリズムを知ろう
  5. 5. © 2010 IBM Corporation IBM Research - Tokyo 5 自然言語処理勉強会@東京 第3回2010/11/07 目次 係り受け解析とは何か –用語の説明 –タスクの説明 手法の紹介 –Shift-reduce法 –Eisner法 –その他の手法 まとめ
  6. 6. © 2010 IBM Corporation IBM Research - Tokyo 6 自然言語処理勉強会@東京 第3回2010/11/07 目次 係り受け解析とは何か –用語の説明 –タスクの説明 手法の紹介 –Shift-reduce法 –Eisner法 –その他の手法 まとめ
  7. 7. © 2010 IBM Corporation IBM Research - Tokyo 7 自然言語処理勉強会@東京 第3回2010/11/07 係り受け解析とは何か? 各単語(or文節)の係り先を決定する 係り先とは何ぞや?という問題は割愛します :) 今日, 私は NLPの 発表を した。 ※日本語だと係り元から係り先を指すことが多い 紫の部分を当てる問題
  8. 8. © 2010 IBM Corporation IBM Research - Tokyo 8 自然言語処理勉強会@東京 第3回2010/11/07 海賊王に俺はなる! 海賊王に俺は なる! 名詞節 動詞節 文 海賊王に 俺は なる! 海賊王に俺は なる! 海賊王に 俺は なる! 係り受け(依存文法) 句構造文法 ? 文法を変える? 左の構造を変換 する? どちらも自然に 扱える 名詞節 動詞節 文法は適当です
  9. 9. © 2010 IBM Corporation IBM Research - Tokyo 9 自然言語処理勉強会@東京 第3回2010/11/07 係り受け解析の応用例 情報抽出に使う –「私は・・・発表を・・・した」を探す 今日, 私は NLPの 発表を した。 話した。私は 人と発表を した ○ × 私は 発表を した。 単なる単語共起ではゴミが多いときに有効
  10. 10. © 2010 IBM Corporation IBM Research - Tokyo 10 自然言語処理勉強会@東京 第3回2010/11/07 教科書の紹介 Dependency Parsing (Synthesis Lectures on Human Language Technologies) –S. Kubler, R. McDonald, J. Nivre –MSTパーザーのR. McDonaldとShift- ReduceパーザーのJ. Nivreの本 –読みやすいのでお勧め 言語と計算 (4) 確率的言語モデル –北 研二, 辻井 潤一 –この本にもEisner法と同等の手法が載ってる –最近の本を知っている人は教えてください
  11. 11. © 2010 IBM Corporation IBM Research - Tokyo 11 自然言語処理勉強会@東京 第3回2010/11/07 係り受け解析の用語 今日は,交差なし・双方向を中心にはなします 交差あり (non-projective) 交差なし (projective) 双方向 単方向 最近は交差を許す問題設定が多い ほとんどの場合,交差しない 英語など一般的には双方向 日本語書き言葉など一部の言語
  12. 12. © 2010 IBM Corporation IBM Research - Tokyo 12 自然言語処理勉強会@東京 第3回2010/11/07 問題の定式化 入力 –単語列 S = {w1, …, wn} 出力 –係り先 D = {d1, …, dn} –ただし,連結・非サイクルである必要アリ 長さnの単語列の各単語の係り先を出力 ラベル付きなどもあるが今回は無視 日本語の場合,文節単 位のことも多い 今日, 私は NLPの 発表を した。 国際的には矢印は逆向き
  13. 13. © 2010 IBM Corporation IBM Research - Tokyo 13 自然言語処理勉強会@東京 第3回2010/11/07 思いつくままにやってみる(品詞編) 係り関係になりそうな品詞組みを考える –名詞,→動詞 –名詞は→動詞 –名詞の→名詞 –名詞を→動詞 係り関係になる品詞対をルール化すればよさそう 今日, 私は NLPの 発表を した。
  14. 14. © 2010 IBM Corporation IBM Research - Tokyo 14 自然言語処理勉強会@東京 第3回2010/11/07 品詞だけでは解決できない例がすぐ思い浮かぶ 同じ名詞なのに係り先が異なる 本質的に曖昧な文も存在する –ex. 黒い目の大きな女の子 値段値段値段値段の 高い ワインを 飲んだ。 父父父父の 高い ワインを 飲んだ。
  15. 15. © 2010 IBM Corporation IBM Research - Tokyo 15 自然言語処理勉強会@東京 第3回2010/11/07 プログラミング言語の構文解析との違い プログラミング言語の文法は曖昧性がない –1つの文に対して高々1つの構文木しか存在しない –線形時間で必ず解析できるクラスに限定される 自然言語の文法は曖昧 –1つの文に対して解釈可能な構文木が複数存在する –一般的には文長の指数個候補が存在する ルールのみでは1つの構文木に決定できない
  16. 16. © 2010 IBM Corporation IBM Research - Tokyo 16 自然言語処理勉強会@東京 第3回2010/11/07 機械学習を使ってみよう それぞれの単語の係り先を多値分類 交差しないよう,全単語に対して繰り返す これで結構いい精度がでる –通称,相対モデル [工藤&松本04] –多値分類は最大エントロピー法を使う 今日, 私は NLPの 発表を した。 今日, 私は NLPの 発表を した。
  17. 17. © 2010 IBM Corporation IBM Research - Tokyo 17 自然言語処理勉強会@東京 第3回2010/11/07 係り受け解析の難しさ 先の手法は全候補を網羅していない 出力の候補は入力長の指数オーダー以上 –各単語の係り先候補がnくらいあるので,出力Dの候補は 大体nnくらいある これを解消するために色んなテクを駆使する –文法理論,機械学習,動的計画法,グラフ理論,整数計 画法 本質的には膨大な候補存在する ところをどう抑えるかが鍵
  18. 18. © 2010 IBM Corporation IBM Research - Tokyo 18 自然言語処理勉強会@東京 第3回2010/11/07 目次 係り受け解析とは何か –用語の説明 –タスクの説明 手法の紹介 –Shift-reduce法 –Eisner法 –その他の手法 まとめ
  19. 19. © 2010 IBM Corporation IBM Research - Tokyo 19 自然言語処理勉強会@東京 第3回2010/11/07 係り受け解析の2大派閥 膨大な候補から選ぶ戦略として2つの手法方向性がある Transition-based (局所最適型) –局所的な選択を繰り返すため,大域最適ではない –複雑な特徴量を使える –Shift-Reduce Graph-based (大域最適型) –全候補の中からスコア最大の木を選ぶ –単純な特徴量しか使えない –MST,Eisner
  20. 20. © 2010 IBM Corporation IBM Research - Tokyo 20 自然言語処理勉強会@東京 第3回2010/11/07 両者を比較する 局所最適 大域最適 ローカル素性 大域素性 Shift-Reduce MST Eisner Higher-order Eisner ILP 性能が良い 計算量を抑えながら大域素 性・大域最適を目指したい 性能が悪い 両方満たす代わり に解は近似解
  21. 21. © 2010 IBM Corporation IBM Research - Tokyo 21 自然言語処理勉強会@東京 第3回2010/11/07 今日紹介する手法 Shift-Reduce法 –Transition-basedの代表的な手法 –実装簡単,高速 Eisner法 –Graph-basedの代表的な手法の一つ –動的計画法は楽しい –※こっちがメインです
  22. 22. © 2010 IBM Corporation IBM Research - Tokyo 22 自然言語処理勉強会@東京 第3回2010/11/07 Shift-Reduce法 [Nivre03, Yamada&Matsumoto03] 前から順に読んで,未処理の単語をスタックに積む スタックと次の単語間に係り関係があったら消す 前から読んでいく人間の理解に近い(?) 例)今日,私はNLPの・・・ 今日, 私は NLPの 発表を した。 ※係り先が決まっていない単語 スタックスタックスタックスタック
  23. 23. © 2010 IBM Corporation IBM Research - Tokyo 23 自然言語処理勉強会@東京 第3回2010/11/07 Shift-Reduce法の特徴 積む(shift)か消す(reduce)の分類を繰り返す 利点 –高速(線形時間),作るのが簡単 –遠くの構造を素性に入れられる 欠点 –大域最適ではない(garden pathなどに弱い) –自明には交差に対応できない This This is is is a is a is pen is pen shift shift left shift shift left right
  24. 24. © 2010 IBM Corporation IBM Research - Tokyo 24 自然言語処理勉強会@東京 第3回2010/11/07 Shift-Reduceの詳細 [Nivre04] 入力をそのまま積む(shift) スタックの上2つに係り関係をつける(left / right) 操作の異なる亜種は多い これらの操作で生成される構造に交差はない This is a pen This This is is is a is a is pen is pen shift shift left shift shift left right
  25. 25. © 2010 IBM Corporation IBM Research - Tokyo 25 自然言語処理勉強会@東京 第3回2010/11/07 Swap操作で交差へ対応 [Nivre09] スタックの2番目の要素を戻すSwap操作を追加 A B C A A B A C A A B B shift shift shift swap right shift right A C B B swapされたノードは一 度入力列に戻される
  26. 26. © 2010 IBM Corporation IBM Research - Tokyo 26 自然言語処理勉強会@東京 第3回2010/11/07 Eisner法 動的計画法により大域最適を探す CKYアルゴリズムと同種の方法を使う –基本的に非交差しか扱えない 局所的な素性しか扱えない –“局所”の度合いで複雑度が異なる(cf. 高階Eisner)
  27. 27. © 2010 IBM Corporation IBM Research - Tokyo 27 自然言語処理勉強会@東京 第3回2010/11/07 おさらい:CKYアルゴリズム 句構造文法の構文解析手法 下図のような木構造を出力する 動的計画法で計算量はO(n3) 1:今日, 2:私は 3:NLPの 4:発表を 5:した。 非終端記号 は省略
  28. 28. © 2010 IBM Corporation IBM Research - Tokyo 28 自然言語処理勉強会@東京 第3回2010/11/07 チョムスキー標準形 (Chomsky Normal Form, CNF) 書き換え規則が2分割か,単語生成しかない文法 一般的には非終端記号( )にはラベルが振られてい る CKYアルゴリズムは文法がCNFである必要がある or w
  29. 29. © 2010 IBM Corporation IBM Research - Tokyo 29 自然言語処理勉強会@東京 第3回2010/11/07 CKYアルゴリズムの定式化 sequenceに対するViterbiアルゴリズムのtree版 局所的なスコアの総和が最大になるtreeを選択する treeの候補は指数なので,全列挙はできない 1:今日, 2:私は 3:NLPの 4:発表を 5:した。 各三角にスコアが割 り振られ,その総和 が全体のスコア
  30. 30. © 2010 IBM Corporation IBM Research - Tokyo 30 自然言語処理勉強会@東京 第3回2010/11/07 CKYアルゴリズムを再帰で理解する(1/3) 1:今日, 2:私は 3:NLPの 4:発表を 5:した。 (3-4) (3-5) (2-5) (1-5) 3番目から5番目の単語が 末端に来ることを示している (1-1) (2-2) (3-3) (4-4) (5-5) 領域に関して,以下のルールが成り立つ – (s, e) (s, k) + (k+1, e) – (s, s) 終端 左側の木と右側の木の境目を 再帰的に決定している
  31. 31. © 2010 IBM Corporation IBM Research - Tokyo 31 自然言語処理勉強会@東京 第3回2010/11/07 CKYアルゴリズムを再帰で理解する(2/3) s k k+1 e (k+1 - e) (s - e) (s - k) sからeの領域をkとk+1で分けたときの最大スコアは,sからkの領域の最大 と,k+1からeの領域の最大と,三角の局所スコアの和 kをsからe-1まで変化させて最大値をとるkを探す sからk,k+1からeの領域も再帰的に最大の構造を探す ・・・ ・・・
  32. 32. © 2010 IBM Corporation IBM Research - Tokyo 32 自然言語処理勉強会@東京 第3回2010/11/07 CKYアルゴリズムを再帰で理解する(3/3) 領域(s,e)の最大スコア f(s, e) は –f(s, e) = maxk {S(s,k,e) + f(s, k) + f(k+1, e)} –S(s,k,e) は (s,e) (s,k) (k+1,e) という規則に対す る局所的なスコア 領域(s,s)のスコア f(s,s) は –f(s, s)=0 上記再帰式をメモ化すればOK
  33. 33. © 2010 IBM Corporation IBM Research - Tokyo 33 自然言語処理勉強会@東京 第3回2010/11/07 係り受けと句構造の比較 なんとなく形が似ている気もする・・・ 今日, 私は NLPの 発表を した。 今日, 私は NLPの 発表を した。
  34. 34. © 2010 IBM Corporation IBM Research - Tokyo 34 自然言語処理勉強会@東京 第3回2010/11/07 関連の薄そうな2つは,以下の記号を導入すると・・・ 係り受けを句構造風に解釈するには? This is a pen ルール のところに係り受け w 句構造と同種の手法 (CKYやinside- outside)が使える気が してくる!
  35. 35. © 2010 IBM Corporation IBM Research - Tokyo 35 自然言語処理勉強会@東京 第3回2010/11/07 Eisner法を数式で書いてみる C(s, e) = maxk(C(s, k) + I(k, e)) I(s, e) = S(s, e) + maxk(C(k, s) + C(k+1, e)) –ただし,S(s, e)はsがeに係ることに対するスコア 上記再帰式をメモ化すればOK Complete span Incomplete span
  36. 36. © 2010 IBM Corporation IBM Research - Tokyo 36 自然言語処理勉強会@東京 第3回2010/11/07 Eisner法を擬似コードで書いてみる function comp(s, e): if s = e: return 0 elif (s, e) in comp_cache: return comp_cache[(s, e)] else: m = -INF for k in {s, …, e}: m = max(m, comp(s, k) + incomp(s, k)) return comp_cache[(s, e)] = m function incomp(s, e): if (s, e) in incomp_cache: return incomp_cache[(s, e)] else: m = -INF for k in {s, …, e-1}: m = max(m, S(s, e) + comp(k, s) + comp(k+1, e)) return incomp_cache[(s, e)] = m
  37. 37. © 2010 IBM Corporation IBM Research - Tokyo 37 自然言語処理勉強会@東京 第3回2010/11/07 Nベスト出力 [Jimenez&Marzal2000] スコアの高い上位N件を出力したい 元の論文はPCFGをN-best化する方法
  38. 38. © 2010 IBM Corporation IBM Research - Tokyo 38 自然言語処理勉強会@東京 第3回2010/11/07 ソート済み配列の足し算 ソート済み配列の足 し算をソートする priority queueを使 えば簡単に実現でき る 357101 6 10 12 2 810134 1214178 14161910 469 19 17 16 14 13 14 12 12 10
  39. 39. © 2010 IBM Corporation IBM Research - Tokyo 39 自然言語処理勉強会@東京 第3回2010/11/07 CKYもEisnerも足し算の塊 (1/2) C(0, 4) + k=1 + k=2 + k=3 C(0,1) I(1,4) C(0,2) I(2,4) C(0,3) I(3,4) + k=4 C(0,4) I(4,4) 1, 1 1, 1 1, 1 1, 1 C(s, e) = maxk(C(s, k) + I(k, e)) 1 1 1 1番目の候補を探すC(0, 1)の1番目, I(1, 4)の1番目の意 これがbest 再帰的に計算する
  40. 40. © 2010 IBM Corporation IBM Research - Tokyo 40 自然言語処理勉強会@東京 第3回2010/11/07 CKYもEisnerも足し算の塊 (2/2) C(0, 4) + k=1 + k=2 + k=3 C(0,1) I(1,4) C(0,2) I(2,4) C(0,3) I(3,4) + k=4 C(0,4) I(4,4) 1, 1 1, 1 1, 12, 1 1, 2 C(s, e) = maxk(C(s, k) + I(k, e)) 2 1 2 2番目の候補を探す 隣接候補を追加 これが2番 再帰的に計算する(I(2,4)は2番目を探す)
  41. 41. © 2010 IBM Corporation IBM Research - Tokyo 41 自然言語処理勉強会@東京 第3回2010/11/07 Higher order Eisner 以上は 1st order Eisner と呼ばれる –1st order とは,係り元と係り先しか見ない より多くの依存関係を同時に見たくなる –2nd order •同じ係り先の兄弟 –3rd order •祖父と親と子,あるいは親と子の兄弟 –いずれも多項式時間で実現できる
  42. 42. © 2010 IBM Corporation IBM Research - Tokyo 42 自然言語処理勉強会@東京 第3回2010/11/07 2nd order Eisner 兄弟に関する制約や素性を追加したい –例えば同じ格助詞を持つ文節は兄弟にしたくない 以下のノードを追加すると解決する 1st order 2nd order
  43. 43. © 2010 IBM Corporation IBM Research - Tokyo 43 自然言語処理勉強会@東京 第3回2010/11/07 2nd order Eisnerを直感的に理解する 木をたどる操作には2種類ある 1. 子ノードに遷移する 2. 兄弟ノードを遷移する 1st order は,いわば2を1で無理やり表現したため, 兄弟間の素性を設計できない 2nd order では2を直接表現しているため,兄弟間 の素性を設計できる 今日, 私は NLPの 発表を した。1 2
  44. 44. © 2010 IBM Corporation IBM Research - Tokyo 44 自然言語処理勉強会@東京 第3回2010/11/07 2nd order Eisnerを絵で理解する 1st order 2nd order (((w1, w2), w3), w4) 雰囲気としてはcar,cdrのような感じ w1 w2 w3 w4 w1 w2 w3 w4 兄弟関係を直接表現するノードがない
  45. 45. © 2010 IBM Corporation IBM Research - Tokyo 45 自然言語処理勉強会@東京 第3回2010/11/07 3rd order Eisner [Koo&Colins2010] 親子だけではなくて孫も同時に見たい –uni-gramからbi-gramにする感覚 親子と同時に子の兄弟も見たい –親と兄弟の3項関係 T. Koo and M. Collins, Efficient third-order dependency parsers. ACL 2010. 祖父を見ている 親と兄弟を同時に 見ている
  46. 46. © 2010 IBM Corporation IBM Research - Tokyo 46 自然言語処理勉強会@東京 第3回2010/11/07 1st, 2nd, 3rd の比較 1st order 親子のみ 2nd order 兄弟を追加 3rd order 祖父,親,孫を追加 親,兄弟を追加 表現できる素性がだんだん増えている
  47. 47. © 2010 IBM Corporation IBM Research - Tokyo 47 自然言語処理勉強会@東京 第3回2010/11/07 他の手法 簡単な紹介だけ MST ILP
  48. 48. © 2010 IBM Corporation IBM Research - Tokyo 48 自然言語処理勉強会@東京 第3回2010/11/07 MSTパーザー 最大全域木(Maximum Spanning Tree)アルゴリズ ムを使う 詳しく紹介しないが,現在主流の手法の一つ
  49. 49. © 2010 IBM Corporation IBM Research - Tokyo 49 自然言語処理勉強会@東京 第3回2010/11/07 MSTパーザーの特徴 [McDonald05] 最大全域木(Maximum Spanning Tree)アルゴリズムを使う 利点 –大域最適である –解析時の計算量がO(n2)と意外と小さい –交差を自然に解いてくれる 欠点 –直接の係り関係しか使えない –2nd order以上になるとNP hard This is a pen
  50. 50. © 2010 IBM Corporation IBM Research - Tokyo 50 自然言語処理勉強会@東京 第3回2010/11/07 ILP (Integer Linear Programming)パー ザーの特徴 [Riedel&Clarke06, Martins+09] MSTパーザーのスコアを線形の目的関数にする 「木である」条件をがんばって整数の線形式で書き表す 線形式の制約による,線形目的関数の最大化問題 線形式で書けさえすれば,大域的なスコアを目的関数 に入れたり,大域的な制約を入れられる 線形整数計画問題で解ける!
  51. 51. © 2010 IBM Corporation IBM Research - Tokyo 51 自然言語処理勉強会@東京 第3回2010/11/07 目次 係り受け解析とは何か –用語の説明 –タスクの説明 手法の紹介 –Shift-reduce法 –Eisner法 –その他の手法 まとめ
  52. 52. © 2010 IBM Corporation IBM Research - Tokyo 52 自然言語処理勉強会@東京 第3回2010/11/07 おさらい 係り受け解析とは? –単語の係り先を当てる問題 –構造を当てる問題なので,候補がたくさんあってタイヘン 主な手法は2つの派閥 –局所最適だが大域素性のTransition-based –大域最適だが局所素性のGraph-based 2つの手法を紹介した –Shift-Reduce法はスタックを使った方法 –Eisner法は動的計画法を使った方法
  53. 53. © 2010 IBM Corporation IBM Research - Tokyo 53 自然言語処理勉強会@東京 第3回2010/11/07 使ってみよう 日本語 –KNP (@黒橋研) •http://www-lab25.kuee.kyoto-u.ac.jp/nl-resource/knp.html •ルールベース –CaboCha (工藤さん) •http://chasen.org/~taku/software/cabocha/ •Cascaded Chunking Model 英語 –MSTParser (R. McDonald) •http://sourceforge.net/projects/mstparser/ •MST, Eisner –MaltParser (J. Nivre) •http://maltparser.org/ •Shift-Reduce
  54. 54. © 2010 IBM Corporation IBM Research - Tokyo 54 自然言語処理勉強会@東京 第3回2010/11/07 ご清聴ありがとうございました
  55. 55. © 2010 IBM Corporation IBM Research - Tokyo 55 自然言語処理勉強会@東京 第3回2010/11/07 参考文献 Shift-Reduce – [Nivre03] J. Nivre, An Efficient Algorithm for Projective Dependency Parsing. IWPT 003. – [Yamada&Matsumoto03] H. Yamada and Y. Matsumoto, Statistical Dependency Analysis with Support Vector Machines. IWPT 2003. – [Nivre04] J. Nivre, Incrementality in Deterministic Dependency Parsing. Workshop on Incremental Parsing 2004. – [Nivre09] J. Nivre, Non-Projective Dependency Parsing in Expected Linear Time. ACL-IJCNLP 2009. Eisner – [Eisner96] J. M. Eisner, Three New Probabilistic Models for Dependency Parsing: An Exploration. COLING 1996. – [Jimenez&Marzal01] V. Jimenez and A. Marzel, Computation of the N best parse trees for weighted and stochastic context-free grammars. Advances in Pattern Recognition. – [Koo&Colins10] T. Koo and M. Collins, Efficient third-order dependency parsers. ACL 2010.
  56. 56. © 2010 IBM Corporation IBM Research - Tokyo 56 自然言語処理勉強会@東京 第3回2010/11/07 参考文献 MST –[McDonald+05] R. McDonald, F. Pereira, K. Ribarov and J. Hajic, Non-projective Dependency Parsing using Spanning Tree Algorithms. f HLT-EMNLP 2005. ILP –[Riedel&Clarke06] S. Riedel and J. Clarke, Incremental Integer Linear Programming for Non-projective Dependency Parsing. EMNLP 2006. –[Martins et.al.09] A. F. T. Martins, N. A. Smith and E. P. Xing, Concise Integer Linear Programming Formulations for Dependency Parsing. ACL-IJCNLP 2009. その他 –[工藤&松本04] 工藤 拓, 松本 裕治. 相対的相対的相対的相対的なななな係係係係りやすさをりやすさをりやすさをりやすさを考慮考慮考慮考慮したしたしたした日本日本日本日本 語係語係語係語係りりりり受受受受けけけけ解析解析解析解析モデルモデルモデルモデル. SIGNL-162, 2004.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×