雑談対話システム
Last-modified: 2014-07-08 (火) 08:50:38
Top / 雑談対話システム
雑談対話・自由対話システム †
- 2014年7月現在
- あらゆる状況で自然に雑談を継続できる対話システムは、まだ実現できていない
- NTTドコモ 雑談対話API は現時点でかなり有力?
- 雑談対話API test (早大 小川義人氏)
- 先行研究では、ある程度トピックを限定した雑談をテーマに、ウェブから大量に事例を集めて、統計学習にかける、というアプローチが多い
- 近年では、学習アルゴリズムは「部分観測マルコフ決定過程(POMDP)」が多い*1。
柴田, 冨浦 & 西口, 2009. 提案のシステムを作ってみる †
- 注:このプログラムは2009年に作成したもので、2014年現在、Yahooウェブ検索APIの仕様が変わったためそのままでは動きません。
- 柴田雅博, 冨浦洋一, 西口友美, "雑談自由対話を実現するためのWWW上の文書からの妥当な候補文選択手法", 人工知能学会論文誌 24(6), 507-519, 2009. はウェブから雑談対話のテキストを拾ってきて、自然な雑談対話文を生成するシステムを提案している。このシステムをJavaで実装してみる。
柴田, 冨浦 & 西口, 2009. システム概要 †
- 注:以下は、柴田, 冨浦 & 西口, 2009. からの引用、また一部解釈に基づきます。
- 候補文コーパス作成
- コーパスのジャンルを決める(例:「映画」)
- メインテーマを決める(例:「ゴッドファーザー」)
- YahooAPIを使ってWebページを収集する(クエリ:「映画 ゴッドファーザー」)。このとき、HTMLのタイトルにメインテーマを含むもののみを対象にする。
- 各文を切り出して、メインテーマ、文書ID(URL)、文ID(その文書の何番目の文か)を付加して書き出す。
- センタリング理論:ある文の話題の中心となる語を選ぶ規則
- ゼロ代名詞のときの、前の文の「~が」「~は」の名詞。以下の ii,iii,iv がないとき、その文はゼロ代名詞であると判断している。
- 「~は」の名詞
- 「~が」の名詞
- 「~を」の名詞
- 対話処理
- まず、ユーザに話させる(「映画の話をしましょう」などとジャンル名を言って、ユーザにメインテーマを決めさせる)
- ユーザ発話の話題の中心語を調べる(なければ i に戻る)。ユーザ発話がゼロ代名詞だった場合、直前のシステム発話の中心語が中心語になる。
- ユーザ発話と同じ中心語の文を選び、後述する方法で一つの文を決め、返答する。ここで、一度使った文はもう使わない。システムが「へー」を返した場合、「へー」前後のユーザ発話をまとめて一つの発話と判断して、次の返答文を計算する。
- 以上を繰り返す。
- 意味的整合度
- ユーザ発話の内容語(名詞、動詞、形容詞、形容動詞)ωと、システム発話の内容語ω'の意味的整合度は、
r(ω,ω') = logP(ω'|ω) - logP_D(ω') で決まる(論文のp.512、式(1))。- P(ω'|ω) は、ωを含む文があらわれたとき、その次の文がω'を含む確率で、最尤推定によって求める
- P_D(ω') は、文書集合Dの中で、ω'を含む割合 df(ω')/|D| ここで、Dはウェブページ単位
- ωを含む文の数が4以下なら、r(ω,ω')= -∞ として扱う(論文のp.512、右段上)。
- ユーザ発話の内容語(名詞、動詞、形容詞、形容動詞)ωと、システム発話の内容語ω'の意味的整合度は、
- 候補文選択:ユーザ発話文に対して「意味的整合度」が高く、「(ユーザにとって)有意味である」ものが良い、とのこと
- 候補文コーパスの中から、前のユーザ発話の中心語と同じ中心語をもつ文を選ぶ。
- 「~が」「~は」「~を」の~がユーザ発話の中心語と同じ文、またそれに2回まで後続する文で、ゼロ代名詞の文
- ユーザ発話文と上記の候補文に対して、「中心語以外の内容語」の各組について意味的整合度を求める。
- このとき、内容語が3に満たない候補文は除外する。*2
- 意味的整合度の値が大きかった上位3組を合計し、これを「ユーザ発話文と候補文の間の意味的整合度」とする。
- 文書間の意味的整合度が最も高く、かつその値が -2.5 以上の文が、候補文に選ばれる。
- 条件を満たす文がなかった場合、メインテーマを中心語にして候補文選択をやりなおす。
- それでも条件を満たす文がなかった場合、システム発話は「へー」となる。
- 選ばれた文をゼロ代名詞化する。
- 選ばれた文の冒頭に接続詞があった場合、「ちなみに」「それにしても」「そういえば」「例えば」「そりゃ」「本当は」を除いて除去する
- 候補文コーパスの中から、前のユーザ発話の中心語と同じ中心語をもつ文を選ぶ。
実装 †
- プログラム*3 20091210_OpenDialogSystem_v0.6.zip
- HariboteDialogSystem.java はSenもコーパスも使わないハリボテです(常に「へーそうですか」を返します)。
- 入出力部分だけ本プログラムと同じにしてあります。詳しい使い方はソースコードをお読み下さい。
- 注:2014年現在、MakeCorpus.java でWebコーパスを作ることはできません。
- HariboteDialogSystem.java はSenもコーパスも使わないハリボテです(常に「へーそうですか」を返します)。
- Webコーパスサンプル web_corpus.zip
- 個人サイトのテキスト、URLを含みます。もしも問題がございましたら、すぐにリンクを削除いたしますのでお知らせ下さい*4。
- ユーザの入力した内容語を含む文が必要なので、十分に多くのテキストをクローリングして保持しておく必要があります。この量では全然足りないと思われます。
使い方 †
- Senの実行環境をインストール
- はじめに、Senで形態素解析/インストール/Windows を参考に、Senの実行環境をインストールしておきます。ここで、sen.jar と commons-logging.jar にクラスパスを通しておく必要があります。*5
- また、話題にしたいメインテーマの名詞(アーティスト名など)は、全てSenの辞書に登録しておきます。
- SenSample.java の System.setProperty("sen.home","c:/sen"); の行(二箇所あります)の、「c:/sen」のところを、自分の環境で sen をインストールしたディレクトリのパスに書き換えておきます。
- HTMLパーサーをインストール
- ブログ検索システム/HTMLパース を参考に、ParseHTML.java を使えるようにしておきます。
- Webから情報を収集してコーパスを作ります。
- はじめに、メインテーマリストファイル(例えば mainTheme_zoids.txt)をつくり、話題にしたいメインテーマの一覧(そのメインテーマで話題になりそうな名詞の一覧)を1行1語で列挙しておきます。
- クローリングを開始します。
java MakeCorpus ゾイド ./corpus ./mainTheme_zoids.txt UTF-8 300
- 第一引数はジャンル名
- 第二引数はコーパスファイルの出力先ディレクトリ名
- 第三引数はメインテーマリストファイル
- 第四引数はメインテーマリストファイルの文字コード(UTF-8にしておいてください)
- 第五引数は検索結果を何件まで取得するか
- 対話を試します。(※柴田, 冨浦 & 西口, 2009. の仕様を一部省略してしまったので、応答の不自然さが残ります。)*6
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 は意味的整合度の計算過程で出力した候補文一覧です。
- 以上です。未実装・独自解釈で作った点はコード中にメモしてあります。
*1 早大菊池先生のご指摘による。
*2 ユーザ発話の内容語が3に満たない場合、どうするかはよく分からなかった。
*3 2010/12/16 早稲田の学内から使いたい場合は、SenSample.java と MakeCorpus.java のインターネット接続部分で、プロキシを通す必要がある。proxy_java.txtを参照(内部限定公開)
*4 連絡先 : m-kouki@moegi.早稲田.jp (半角英数に書き換えてください)
*5 eclipseではクラス名を右クリックして「ビルド・パス」>「外部アーカイブの追加」、Linuxではこんな感じ、Windowsではこんな感じ
*6 例えば、柴田, 冨浦 & 西口, 2009.では候補文の文体の整形や、前の文と同じ主語は代名詞に置き換えたりしているのですが、本ページのプログラムでは(制作時間の都合で)行っていません(引用元のウェブサイトのテキストをそのまま表示します)。