やさしい日本語言い換えシステムを支える技術
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

やさしい日本語言い換えシステムを支える技術

  • 357 views
Uploaded on

coinsLT #1で話した(けど途中までしか話せなかった)内容。ルールベースの言い換えシステムの効率的な実装の内部を説明。

coinsLT #1で話した(けど途中までしか話せなかった)内容。ルールベースの言い換えシステムの効率的な実装の内部を説明。

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
357
On Slideshare
326
From Embeds
31
Number of Embeds
2

Actions

Shares
Downloads
4
Comments
0
Likes
7

Embeds 31

https://twitter.com 30
https://tweetdeck.twitter.com 2

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. やさしい日本語への 言い換えシステムを 支える技術 情報科学類4年 えりっく
  • 2. やさしい日本語への 言い換えシステムを 支える技術 情報科学類4年 えりっく 自然言語処理研究室
  • 3. やさしい日本語への 言い換えシステムを 卒研でない 支える技術 情報科学類4年 えりっく 自然言語処理研究室
  • 4. やさしい日本語への 言い換えシステムを 支える技術 情報科学類4年 えりっく 趣味 自然言語処理研究室
  • 5. やさしい日本語への 言い換えシステムを 支える技術 情報科学類4年 えりっく 趣味 自然言語処理研究室
  • 6. やさしい日本語への 言い換えシステムを 支える技術 ?
  • 7. やさしい日本語とは
  • 8. やさしい日本語とは 日本語弱者のための日本語
  • 9. やさしい日本語とは  こども  外国人 日本語弱者のための日本語
  • 10. やさしい日本語とは  こども  外国人 日本語弱者のための日本語 より具体的に言えば、 日本語能力試験の3級以下の語彙
  • 11. やさしい日本語への 言い換えシステムを 支える技術 !
  • 12. やさしい日? 本語への 言い換えシステムを 支える技術
  • 13. 言い換えとは(3行で)
  • 14. 言い換えとは(3行で) 意味を変えずに
  • 15. 言い換えとは(3行で) 意味を変えずに 別の表現に
  • 16. 言い換えとは(3行で) 意味を変えずに 別の表現に 置き換える
  • 17. 言い換えシステムとは 例えば「しずかったー」
  • 18. 言い換えシステムとは 例えば「しずかったー」 罵詈雑言を きれいな言葉に 言い換えてくれる
  • 19. やさしい日! 本語への 言い換えシステムを 支える技術
  • 20. やさしい日本語への 言い換えシステムを 支える技術
  • 21. きっかけ • 東京国際大学の川村教授が考案 • 先輩が過去にこのシステムを作っていた • 「引き継がないか」と言われて引き継いだ • 引き継いだ結果全部書き直した • 月2回の出勤で5万円
  • 22. きっかけ • 東京国際大学の川村教授が考案 • 先輩が過去にこのシステムを作っていた • 「引き継がないか」と言われて引き継いだ • 引き継いだ結果全部書き直した • 月2回の出勤で5万円
  • 23. きっかけ • 東京国際大学の川村教授が考案 • 先輩が過去にこのシステムを作っていた • 「引き継がないか」と言われて引き継いだ • 引き継いだ結果全部書き直した • だれか引き継がない?
  • 24. Q. 書き換えって 単語で辞書引いて 置換するだけじゃ...
  • 25. と思うじゃん?
  • 26. ぼくも最初は思ったよ。
  • 27. 朝食 → 朝ごはん わかる 名詞 名詞
  • 28. 朝食 → 朝ごはん 培え ば → 育てれ ば まあ わかる 動詞(仮定) 動詞(仮定)
  • 29. 朝食 → 朝ごはん 培え ば → 育てれ ば 獲得 し て → 得 て 2語か... サ変名詞 動詞 (連用) 動詞 (連用)
  • 30. 朝食 → 朝ごはん 培え ば → 育てれ ば 獲得 し て → 得 て 読書 し て → 読ん で !?
  • 31. 朝食 → 朝ごはん 培え ば → 育てれ ば 獲得 し て → 得 て 読書 し て → 読ん で の 列挙 → を 並べる こと !? !?
  • 32. A. 意外とめんどい
  • 33. 今回の言い換えシステムの仮定 ・局所最適化(フレーズ単位で言い換え)すれば、  全体最適化される(意味の通る文章になる) ・文の先頭からルールにマッチさせて  変換できる (back-­‐trackなし)
  • 34. 言い換えの流れ 1 フィルタ処理   ・名詞列の言い換え回避   ・連語の連結 ルール適用 2 ルールベースの置き換え
  • 35. 言い換えの流れ 1 フィルタ処理   ・名詞列の言い換え回避   ・連語の連結 こちらだけ 説明 ルール適用 2 ルールベースの置き換え
  • 36. これから話す内容(in Haskell) trait_label :: Word → Label type Rule = [Word] → Int × [Word] prefix_match :: [Label] → Rule × Int simplify :: [Word] → [Word] simplify seq = simplify' seq [] simplify' :: [Word] → [Word] → [Word] simplify' [] applied = applied simplify' seq applied = let trait_seq = map (e -> trait_label e) seq let (rule, len) = prefix_match trait_seq in let (chunk, offset) = rule (take seq len) in simplify' (drop (len - offset)) (applied ++ chunk)
  • 37. 「・・・は?」
  • 38. ちょっとまって逃げないで わかりやすく説明するから... (´;ω;`)ウッ…
  • 39. 紹介する3つの概念 特徴ラベル関数 trait_label 言い換えルール型 Rule 前方一致検索関数 prefix_match
  • 40. 特徴ラベル関数 trait_label
  • 41. 特徴ラベル関数 単語から特徴ラベルへの全射的な関数
  • 42. 特徴ラベル関数 後述 単語から特徴ラベルへの全射的な関数
  • 43. 特徴ラベル関数 単語から特徴ラベルへの全射的な関数 表層形・原形・品詞などで決定する
  • 44. 特徴ラベル関数 単語から特徴ラベルへの全射的な関数 表層形・原形・品詞などで決定する ルールマッチ時の分岐の煩雑さを 解消するために勝手に導入した
  • 45. 特徴ラベル関数 単語から特徴ラベルへの全射的な関数 表層形・原形・品詞などで決定する ルールマッチ時の分岐の煩雑さを 解消するために勝手に導入した ※型注釈で言うと  trait_label :: Word → Label
  • 46. 特徴ラベル関数の例 trait_label(    ) = :m_proper 固有名詞 coins trait_label( 食 べ る ) = :d_other ※型注釈で言うと  trait_label :: Word → Label 動詞(その他) trait_label( す る  ) = :d_suru 動詞(スル) 全29種類(有限集合)。 d_itdk, d_kdsr, d_nsr, d_other, d_rrrrr, d_srssr, d_suru, go, j_de, j_ga, j_hkm, j_ni, j_no, j_other, j_te, j_trdr, j_woto, jd_aru, jd_kako, jd_na, jd_nai, jd_spe_da, jd_zu, keiyoshi, m_gokan, m_other, m_proper, m_sahen, m_teki
  • 47. 特徴ラベル関数の例 trait_label(    ) = :m_proper 固有名詞 coins これが 特徴ラベル trait_label( 食 べ る ) = :d_other ※型注釈で言うと  trait_label :: Word → Label 動詞(その他) trait_label( す る  ) = :d_suru 動詞(スル) 全29種類(有限集合)。 d_itdk, d_kdsr, d_nsr, d_other, d_rrrrr, d_srssr, d_suru, go, j_de, j_ga, j_hkm, j_ni, j_no, j_other, j_te, j_trdr, j_woto, jd_aru, jd_kako, jd_na, jd_nai, jd_spe_da, jd_zu, keiyoshi, m_gokan, m_other, m_proper, m_sahen, m_teki
  • 48. 言い換えルール型 Rule
  • 49. 言い換えルール型 単語部分列を受け取って、 言い換えた単語部分列とオフセット(後述) を返すような関数の型
  • 50. 言い換えルール型 単語部分列を受け取って、 言い換えた単語部分列とオフセット(後述) を返すような関数の型 これの型に属する関数がルールになる
  • 51. 言い換えルール型 単語部分列を受け取って、 言い換えた単語部分列とオフセット(後述) を返すような関数の型 これの型に属する関数がルールになる ※型注釈で言うと  type Rule = [Word] → [Word] × Int
  • 52. 言い換えルール型に属する関数の例 sahen_rule([読書,する]) = ([本,を,読む], 2) m_suffix_rule(悪性,の]) = ([悪い], 2) m_suffix_rule([悪性,と]) = ([悪い], 1) ※型注釈で言うと  type Rule = [Word] → [Word] × Int
  • 53. 前方一致ルール検索 prefix_match
  • 54. 前方一致ルール検索 ラベル列を受け取って、 先頭からマッチする一番長いルールと そのルールがとる部分列の長さ を返す関数
  • 55. 前方一致ルール検索 ラベル列を受け取って、 先頭からマッチする一番長いルールと そのルールがとる部分列の長さ を返す関数 ※型注釈で言うと  prefix_match :: [Label] → Rule × Int
  • 56. 前方一致ルール検索の例 以下のルールが定義されているとする [:j_ni] [:m_other] [:m_other, :j_no] [:j_wo, :m_sahen] [:m_sahen, :d_suru] [:m_sahen, :d_suru, :j_te] [:m_sahen, :d_suru, :jd_ta] nothing noun noun_suffix sahen_prefix sahen_suru sahen_suru_te sahen_suru_speda
  • 57. 前方一致ルール検索の例 prefix_match([:m_other, :j_no, :m_other]) [:j_ni] [:m_other] [:m_other, :j_no] [:j_wo, :m_sahen] [:m_sahen, :d_suru] [:m_sahen, :d_suru, :j_te] [:m_sahen, :d_suru, :jd_ta] nothing noun noun_suffix sahen_prefix sahen_suru sahen_suru_te sahen_suru_speda
  • 58. 前方一致ルール検索の例 prefix_match([:m_other, :j_no, :m_other]) [:j_ni] [:m_other] [:m_other, :j_no] [:j_wo, :m_sahen] [:m_sahen, :d_suru] [:m_sahen, :d_suru, :j_te] [:m_sahen, :d_suru, :jd_ta] nothing noun noun_suffix sahen_prefix sahen_suru sahen_suru_te sahen_suru_speda 2件 hit
  • 59. 前方一致ルール検索の例 prefix_match([:m_other, :j_no, :m_other]) [:j_ni] [:m_other] [:m_other, :j_no] [:j_wo, :m_sahen] [:m_sahen, :d_suru] [:m_sahen, :d_suru, :j_te] [:m_sahen, :d_suru, :jd_ta] nothing noun noun_suffix sahen_prefix sahen_suru sahen_suru_te sahen_suru_speda 1件 hit
  • 60. 前方一致ルール検索の例 prefix_match([:m_other, :j_no, :m_other]) [:j_ni] [:m_other] [:m_other, :j_no] [:j_wo, :m_sahen] [:m_sahen, :d_suru] [:m_sahen, :d_suru, :j_te] [:m_sahen, :d_suru, :jd_ta] nothing noun noun_suffix sahen_prefix sahen_suru sahen_suru_te sahen_suru_speda 1件 hit 2単語
  • 61. 前方一致ルール検索の例 prefix_match([:m_other, :j_no, :m_other]) = (noun_suffix, 2) [:j_ni] [:m_other] [:m_other, :j_no] [:j_wo, :m_sahen] [:m_sahen, :d_suru] [:m_sahen, :d_suru, :j_te] [:m_sahen, :d_suru, :jd_ta] nothing noun noun_suffix sahen_prefix sahen_suru sahen_suru_te sahen_suru_speda 2単語
  • 62. 特徴ラベル関数 trait_label 言い換えルール型 Rule 前方一致検索関数 prefix_match
  • 63. trait_label :: Word → Label type Rule = [Word] → Int × [Word] prefix_match :: [Label] → Rule × Int simplify :: [Word] → [Word] simplify seq = simplify' seq [] simplify' :: [Word] → [Word] → [Word] simplify' [] applied = applied simplify' seq applied = ここの説明が終わった let trait_seq = map (e -> trait_label e) seq let (rule, len) = prefix_match trait_seq in let (chunk, offset) = rule (take seq len) in simplify' (drop (len - offset)) (applied ++ chunk)
  • 64. trait_label :: Word → Label type Rule = [Word] → Int × [Word] prefix_match :: [Label] → Rule × Int simplify :: [Word] → [Word] simplify seq = simplify' seq [] simplify' :: [Word] → [Word] → [Word] simplify' [] applied = applied simplify' seq applied = これからここを 日本語で説明 let trait_seq = map (e -> trait_label e) seq let (rule, len) = prefix_match trait_seq in let (chunk, offset) = rule (take seq len) in simplify' (drop (len - offset)) (applied ++ chunk)
  • 65. 言い換えのアルゴリズム
  • 66. 言い換えのアルゴリズム 1 入力単語列からprefix_matchでルール適用範囲を得る
  • 67. 言い換えのアルゴリズム 1 入力単語列からprefix_matchでルール適用範囲を得る 2 得たルールでその範囲を言い換えて出力単語列に追加
  • 68. 言い換えのアルゴリズム 1 入力単語列からprefix_matchでルール適用範囲を得る 2 得たルールでその範囲を言い換えて出力単語列に追加 3 入力単語列をオフセットぶん切り落とす
  • 69. 言い換えのアルゴリズム 1 入力単語列からprefix_matchでルール適用範囲を得る 2 得たルールでその範囲を言い換えて出力単語列に追加 ここで使う 3 入力単語列をオフセットぶん切り落とす
  • 70. 言い換えのアルゴリズム 1 入力単語列からprefix_matchでルール適用範囲を得る 2 得たルールでその範囲を言い換えて出力単語列に追加 3 入力単語列をオフセットぶん切り落とす これを入力単語列がなくなるまで繰り返す
  • 71. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た この文章を言い換えてみる
  • 72. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た 単語に分割
  • 73. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 特徴ラベルを求める
  • 74. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako noun (noun_suffix) (noun_teki) (noun_teki_na)
  • 75. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako noun_suffix
  • 76. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い noun_suffix([悪性,の]) = ([悪い], 2)
  • 77. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 2 悪い noun_suffix([悪性,の]) = ([悪い], 2)
  • 78. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い noun (noun_suffix) (noun_teki) (noun_teki_na)
  • 79. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い noun_suffix
  • 80. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 辞書にHitせず noun_suffix([腫瘍,の]) = ([腫瘍], 1)
  • 81. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 1 noun_suffix([腫瘍,の]) = ([腫瘍], 1)
  • 82. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 nothing (noun_prefix) (verb_prefix)
  • 83. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 noun_prefix
  • 84. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 を 取り除くこと noun_prefix([の,除去]) = ([を,取り除くこと], 2)
  • 85. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 2 悪い 腫瘍 を 取り除くこと noun_prefix([の,除去]) = ([を,取り除くこと], 2)
  • 86. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako nothing (sahen_prefix) (verb_prefix) 悪い 腫瘍 を 取り除くこと
  • 87. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako sahen_prefix 悪い 腫瘍 を 取り除くこと
  • 88. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 を 取り除くこと に sahen_prefix([に, 成功]) = ([に], 1) 「成功」は「に」を置換しない
  • 89. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 1 悪い 腫瘍 を 取り除くこと に sahen_prefix([に, 成功]) = ([に], 1)
  • 90. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 を 取り除くこと に sahen (sahen_suru) (sahen_suffix) (sahen_suru_kako)
  • 91. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 を 取り除くこと に sahen_suru (sahen_suffix) (sahen_suru_kako)
  • 92. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 を 取り除くこと に sahen_suru_kako
  • 93. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 悪い 腫瘍 を 取り除くこと に うまくいっ た sahen_suru_kako([成功,し,た]) = ([うまくいっ,た], 3)
  • 94. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 3 悪い 腫瘍 を 取り除くこと に うまくいっ た sahen_suru_kako([成功,し,た]) = ([うまくいっ,た], 3)
  • 95. 言い換えのアルゴリズム 悪性 の 腫瘍 の 除去 に 成功 し た m_other j_no m_other j_no m_sahen j_ni m_sahen d_suru jd_kako 完成ヽ(=́▽`=)ノ 悪い 腫瘍 を 取り除くこと に うまくいっ た
  • 96. デモ