トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索   ヘルプ   最終更新のRSS

雑談対話システム の変更点

Top / 雑談対話システム

#freeze
#contents

*雑談対話・自由対話システム [#qac2076d]

-2014年7月現在
--あらゆる状況で自然に雑談を継続できる対話システムは、まだ実現できていない
--[[NTTドコモ 雑談対話API:https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=3]] は現時点でかなり有力?
---[[雑談対話API test:http://shinzan.human.waseda.ac.jp/~yoshito/apps/dialogue3/index.php]] (早大 小川義人氏)

--先行研究では、ある程度トピックを限定した雑談をテーマに、ウェブから大量に事例を集めて、統計学習にかける、というアプローチが多い
---[[柴田雅博, 冨浦洋一, 西口友美, "雑談自由対話を実現するためのWWW上の文書からの妥当な候補文選択手法", 人工知能学会論文誌 24(6), 507-519, 2009.:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf]]
---[[水野淳太, 乾健太郎, 松本裕治, "ウェブニュースを利用した雑談対話システム", 言語・音声理解と対話処理研究会 55, 1-6, 2009.:http://www2.nict.go.jp/univ-com/info_analysis/member/junta-m/slud55_slides.pdf]]
---などなど。

--近年では、学習アルゴリズムは「部分観測マルコフ決定過程(POMDP)」が多い((早大菊池先生のご指摘による。))。
---[[吉野幸一郎, 河原達也, "ユーザの焦点に適応的な雑談型音声情報案内システム", 言語処理学会第18回年次大会, C5-4, 2014.:http://www.anlp.jp/proceedings/annual_meeting/2014/pdf_dir/C5-4.pdf]]

**[[柴田, 冨浦 & 西口, 2009.:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf]] 提案のシステムを作ってみる [#ca259137]
-&color(red){''注:このプログラムは2009年に作成したもので、2014年現在、Yahooウェブ検索APIの仕様が変わったためそのままでは動きません。''};

-[[柴田雅博, 冨浦洋一, 西口友美, "雑談自由対話を実現するためのWWW上の文書からの妥当な候補文選択手法", 人工知能学会論文誌 24(6), 507-519, 2009.:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf]] はウェブから雑談対話のテキストを拾ってきて、自然な雑談対話文を生成するシステムを提案している。このシステムをJavaで実装してみる。

***[[柴田, 冨浦 & 西口, 2009.:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf]] システム概要 [#i9f40357]
-&color(red){''注:以下は、[[柴田, 冨浦 & 西口, 2009.:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf]] からの引用、また一部解釈に基づきます。''};

+''候補文コーパス作成''
++コーパスのジャンルを決める(例:「映画」)
++メインテーマを決める(例:「ゴッドファーザー」)
++YahooAPIを使ってWebページを収集する(クエリ:「映画 ゴッドファーザー」)。このとき、HTMLのタイトルにメインテーマを含むもののみを対象にする。
++各文を切り出して、メインテーマ、文書ID(URL)、文ID(その文書の何番目の文か)を付加して書き出す。
+''センタリング理論'':ある文の話題の中心となる語を選ぶ規則
++ゼロ代名詞のときの、前の文の「~が」「~は」の名詞。以下の ii,iii,iv がないとき、その文はゼロ代名詞であると判断している。
++「~は」の名詞
++「~が」の名詞
++「~を」の名詞
+''対話処理''
++まず、ユーザに話させる(「映画の話をしましょう」などとジャンル名を言って、ユーザにメインテーマを決めさせる)
++ユーザ発話の話題の中心語を調べる(なければ i に戻る)。ユーザ発話がゼロ代名詞だった場合、直前のシステム発話の中心語が中心語になる。
++ユーザ発話と同じ中心語の文を選び、後述する方法で一つの文を決め、返答する。ここで、一度使った文はもう使わない。システムが「へー」を返した場合、「へー」前後のユーザ発話をまとめて一つの発話と判断して、次の返答文を計算する。
++以上を繰り返す。
+''意味的整合度''
++ユーザ発話の内容語(名詞、動詞、形容詞、形容動詞)ωと、システム発話の内容語ω'の意味的整合度は、~
r(ω,ω') = logP(ω'|ω) - logP_D(ω') 
で決まる([[論文のp.512、式(1):https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf#page=6]])。
---P(ω'|ω) は、ωを含む文があらわれたとき、その次の文がω'を含む確率で、最尤推定によって求める
---P_D(ω') は、文書集合Dの中で、ω'を含む割合 df(ω')/|D| ここで、Dはウェブページ単位
++ωを含む文の数が4以下なら、r(ω,ω')= -∞ として扱う([[論文のp.512、右段上:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf#page=6]])。
+''候補文選択'':ユーザ発話文に対して「意味的整合度」が高く、「(ユーザにとって)有意味である」ものが良い、とのこと
++候補文コーパスの中から、前のユーザ発話の中心語と同じ中心語をもつ文を選ぶ。
---「~が」「~は」「~を」の~がユーザ発話の中心語と同じ文、またそれに2回まで後続する文で、ゼロ代名詞の文
++ユーザ発話文と上記の候補文に対して、「中心語以外の内容語」の各組について意味的整合度を求める。
---このとき、内容語が3に満たない候補文は除外する。((ユーザ発話の内容語が3に満たない場合、どうするかはよく分からなかった。))
++意味的整合度の値が大きかった上位3組を合計し、これを「ユーザ発話文と候補文の間の意味的整合度」とする。
++文書間の意味的整合度が最も高く、かつその値が -2.5 以上の文が、候補文に選ばれる。
---条件を満たす文がなかった場合、メインテーマを中心語にして候補文選択をやりなおす。
---それでも条件を満たす文がなかった場合、システム発話は「へー」となる。
++選ばれた文をゼロ代名詞化する。
++選ばれた文の冒頭に接続詞があった場合、「ちなみに」「それにしても」「そういえば」「例えば」「そりゃ」「本当は」を除いて除去する

***実装 [#fcc283c7]

-プログラム((2010/12/16 早稲田の学内から使いたい場合は、SenSample.java と MakeCorpus.java のインターネット接続部分で、プロキシを通す必要がある。'''[[proxy_java.txt:http://shower.human.waseda.ac.jp/~m-kouki/pass/proxy_java.txt]]'''を参照(内部限定公開))) &ref(20091210_OpenDialogSystem_v0.6.zip);
--HariboteDialogSystem.java はSenもコーパスも使わないハリボテです(常に「へーそうですか」を返します)。
---入出力部分だけ本プログラムと同じにしてあります。詳しい使い方はソースコードをお読み下さい。
--&color(red){''注:2014年現在、MakeCorpus.java でWebコーパスを作ることはできません。''};

-Webコーパスサンプル &ref(web_corpus.zip);
--&color(red){''個人サイトのテキスト、URLを含みます。もしも問題がございましたら、すぐにリンクを削除いたしますのでお知らせ下さい((連絡先 : m-kouki@moegi.早稲田.jp (半角英数に書き換えてください) ))。''};
--ユーザの入力した内容語を含む文が必要なので、&color(red){十分に多くのテキストをクローリングして保持しておく必要があります。};この量では全然足りないと思われます。

***使い方 [#ob674b83]
+Senの実行環境をインストール
--はじめに、[[Senで形態素解析/インストール/Windows:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?Sen%E3%81%A7%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90#l285c8ca]] を参考に、Senの実行環境をインストールしておきます。ここで、sen.jar と commons-logging.jar にクラスパスを通しておく必要があります。((eclipseではクラス名を右クリックして「ビルド・パス」>「外部アーカイブの追加」、Linuxでは[[こんな感じ:http://shower.human.waseda.ac.jp/~m-kouki/pg/mysearch_classpath.txt]]、Windowsでは[[こんな感じ:http://www.javaroad.jp/java_basic2.htm]]))
--また、話題にしたいメインテーマの名詞(アーティスト名など)は、全てSenの辞書に登録しておきます。
---[[Senで形態素解析/辞書に単語を追加:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?Sen%E3%81%A7%E5%BD%A2%E6%85%8B%E7%B4%A0%E8%A7%A3%E6%9E%90#dcbacfec]]
--SenSample.java の System.setProperty("sen.home","c:/sen"); の行(二箇所あります)の、「c:/sen」のところを、自分の環境で sen をインストールしたディレクトリのパスに書き換えておきます。
+HTMLパーサーをインストール
--[[ブログ検索システム/HTMLパース:http://shower.human.waseda.ac.jp/~m-kouki/pukiwiki_public/index.php?%E3%83%96%E3%83%AD%E3%82%B0%E6%A4%9C%E7%B4%A2%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0#db98246a]] を参考に、ParseHTML.java を使えるようにしておきます。
+Webから情報を収集してコーパスを作ります。
--はじめに、メインテーマリストファイル(例えば mainTheme_zoids.txt)をつくり、話題にしたいメインテーマの一覧(そのメインテーマで話題になりそうな名詞の一覧)を1行1語で列挙しておきます。
--クローリングを開始します。
 java MakeCorpus ゾイド ./corpus ./mainTheme_zoids.txt UTF-8 300
---第一引数はジャンル名
---第二引数はコーパスファイルの出力先ディレクトリ名
---第三引数はメインテーマリストファイル
---第四引数はメインテーマリストファイルの文字コード(UTF-8にしておいてください)
---第五引数は検索結果を何件まで取得するか
+対話を試します。(&color(red){※[[柴田, 冨浦 & 西口, 2009.:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf]] の仕様を一部省略してしまったので、応答の不自然さが残ります。};)((例えば、[[柴田, 冨浦 & 西口, 2009.:https://www.jstage.jst.go.jp/article/tjsai/24/6/24_6_507/_pdf]]では候補文の文体の整形や、前の文と同じ主語は代名詞に置き換えたりしているのですが、本ページのプログラムでは(制作時間の都合で)行っていません(引用元のウェブサイトのテキストをそのまま表示します)。))

 java DialogSystem ゾイド ./mainTheme_zoids.txt ./output.txt
 >> システム : ゾイドの話をしましょう。 (1)()
 
 java DialogSystem ゾイド ./mainTheme_zoids.txt ./output.txt アイアンコングが好きでした。
 >> システム : 隣町の祭りでLBアイアンコングが叩き売りされてたので入手 (2)(アイアンコング)()
 
 java DialogSystem ゾイド ./mainTheme_zoids.txt ./output.txt 今も売っているんですね。
 >> システム : 強力なゾイドは気性が荒いせいで操縦が難しい機種が多いが、アイアンコングは比較的性質がおとなしく、加えて複座型にし、パイロットと射撃手を分担することにより、操縦は容易である (2)(アイアンコング)(アイアンコング)
 
--第一引数はジャンル名
--第二引数はメインテーマリストファイル
--第三引数はシステム発話文を書き出すファイル名

--outputSystemSpeak.txt にシステムの発話文が書き出されます。
--log.txt に対話のログが書き出されます。
--その他、システムの内部処理用に以下が書き出されます。
---used.txt は対話に使った候補文のリストです。
---theme.txt は今回のメインテーマです。
---center.txt は直前の対話の中心語です。
---cache.txt は意味的整合度の計算過程で出力した候補文一覧です。

-以上です。未実装・独自解釈で作った点はコード中にメモしてあります。