7本目!The Desing and Implementation of XioIce, an Empathetic Social Chatbot
さーて、ようやくやってまいりました、Microsoft謹製のChatbotである、XiaoIceです!
XiaoIceって聞いたことはないと思いますが、じつを言うとこの子は日本ではRinnaと呼ばれています。そうっ!あのRinnaに関しての論文ですっ!
ということで、程々に気合を入れてがんばりましょう!
Design Principle
RinnaのデザインのコンセプトとしてはIQ(Intelligent Quarity)とEQ(Emotinal Quarity)を統合したものだそうだ。IQによりユーザーの要求するタスク(質問とか)に答えて、EQによりユーザーの感動などの感情的欲求を満たすことができるらしい。これの元論文は A theory of human motivationっていう、なんと戦前の研究がもとになっている。余談だけど、バリバリこの研究とか徴兵令に利用されている気がする。
そして、このEQとIQを組み合わせたモデルにPersonalityを組み込んだものが、Rinnaとなる。
IQ + EQ + Personality
IQのコンポーネントに含まれるのは、知識と記憶のモデリング、画像と言語についての理解、意味づけ、生成、推測であるらしい。んで、Rinnaは2015年時点で230種類以上のこのIQに関するスキルを持っていたらしい。スゴっ!
まあ、一番重要なのは Open-Domainの会話をつづけるタスクらしいけど。 (Open-Domainはあらゆる質問って意味。)
EQは共感と社会的技能がコンポーネントに含まれるみたい。
Empathyは相手の感情を理解することで、このタスクの実行のために、感情の特定、感情の発展状況の特定、感情に起因するユーザの求めているものの特定、が行われているそうな。
社会的技能に関しては、ユーザのバックグラウンドやそのときに置かれている状況や個性に合わせて、ユーザーが喜ぶような解答をするらしい。あと、ユーモアだとかホメコトバとかもSocial Skillに含まれるそうで、また会話が途切れたときに新しい会話を始めるのもSocial Skillだそうだ。
Personality は個人に固有の特性のことで、信用と長期的なつながりを作るのに必要らしい。 個性の設計というか、XiaoIceの設定は18歳の信用でき、共感的で、愛情深くて、しかもユーモアのセンスもあるっていう、超絶最強ヒロインの設定にしたらしい。
まあ、男性好きの男性よりも女性好きの女性の方が多そうだし、人気の出そうな年齢と性別の最大尤度のところを取ったっぽいな。
あと、個人的な質問やセクハラ発言が来た場合はうまくスルーするように設計されているらしい。すげーな(笑)。
Social Chatbot Metrics: CPS
Meena ではSSAっていう、どれだけ具体的な会話が続けられるかっていうことを指標にしていたけど、Rinnaっではただ単にどのくらいの期間、どれだけの会話が続けられたのかってことを指標にしているらしい。
まあ、Meenaの目的がChatbotの問題点である、曖昧な解答をしがちっていうのを回避することだったけど、Rinnaの目的は長期的な会話の持続が目的だったから、その点では良いのかな?
Social Chat as Hierachical Decision-Making
Rinnaでは top-level process managerって言うのが、まずskillを選んで、会話モデルの制御をしているみたい。
まあ、このskillの選び方が気になる。
んで、このhierachical decision-making process をマルコフ決定仮定に置き換えるらしい。 ってことは強化学習か!
マルコフ決定の基本式はTを遷移関数、aを行動、sを状態、gを報酬として、
と表される。今回で言えば、sがユーザーの状態で、aがskillに当たるのかな? でも、報酬関数gの計算がわからん。gを計算して、どうTにフィードバックするんだっけ?
調べたら、すべての状態sと行動aについて、確率分布Qを予め作っておき、(この時点のでの、Q値の表はsの数をN個、aの数をM個として、NM個できる)、ある時点tにおいて、状態s_tと行動a_tが発生した場合、状態s_t+1に遷移する。そのときに、以下のようにQ値を更新するらしい。
まあ、ユーザーとの会話内容から、sをどうやって決めるのか?とか、aはどんだけあんのか?とか、Qの初期値はどうするんだ?とか報酬rの決め方はどうするんだ?とかQ値の更新後のactionの決め方はどうするんだ?とか色々と疑問は尽きない(笑)
actionの決め方についてはε-greedy方とか、ボルツマン選択とかあるらしい。
ε-greedy選択: εの確率でランダム。それ以外は最大のQ値を持つ行動の選択。
ボルツマン選択 : exp(Q(s,a)/ T)に比例した割合で、行動選択する。Tは時間とともに0に地下づくパラメータ。
状態s_t+1とQ値を使った行動選択はあんのかな?
ああ、でε-greedy法を使えば良いのかっ!
あと、多分εの確率で新しいskillやDialogue policyを提供するみたい。
System Architecture
User experience Layer
Full DuplexとMessage-based conversationがあるみたい。 Message-based conversationが普通に思い浮かべるRinnaとのLINEでの会話で、Full Duplexが2018年末ごろの「リンナと音声通話」っていう機能らしい。 全く知らんかった(笑)
Converstioan Engine layer
Dialogue Manager がMDPに基づいて、(1 - ε)の確率で、既存の skill か Core Chat を選ぶか、εの確率で新規のskillかCore Chatを選ぶかを決めているらしい。 んで、Empathetic Computing moduleでユーザの感情を測定し、Dialogue Managerのstateの選択に反映しているらしい。
Data layer
知識グラフだとか、Topic Indexだとか、検索ベース用のデータとか、ユーザープロフィールとか、Rinnaのプロフィールだとか、画像検索用のデータとかがあるみたい。 知識グラフとかどう使うねん(笑)。
Implementation of Conversation Engine
この会話エンジンはDialogue managerとempathetic computingとCore Chatとskillで構成されているみたい。
会話エンジンの実装の評価にはA/Bテストが用いられている。えっ?A/Bテストって?
なんか、新しく実装したパターンをいくつかランダムにユーザーに提示して、一番良かったやつを採用する手法らしい。評価方法はNumber of Active UsersとConversation-turns Per Sessionが用いられたみたい。
Dialogue Manager
Dialogue Manager
┣ Global State Tracker
┗ Dialogue Policy
┣ Selectiong either Core Chat or skill to activate
┣ A set of low-level policies for each skill
┗ Topic manager for Core Chat
まず、Dialogue Manager は基本的にマルコフ決定仮定に基づいているため、現在ある状態sにあるとして、方策πを用いて、 として、行動aを決定する。この行動aはskillの選択か、Core Chatで、ユーザーの入力やskill固有の方策による応答で決まるらしい。
よくわからん。
Global State Tracker
Global State Trackerはユーザーの入力とRinnaの応答を固有表現と感情のラベルを組み合わせて保存するらしい。
てか、なんの固有表現を抽出するんだ?名前?職業?
Dialogue Policy
2種類あって、skill か Core Chatを選ぶパターンと、skillを使用して、conversation segment にあったときに、skill 固有のactionを選ぶパターンみたい。
なんか、skill or Core Chat を選ぶときはskill triggerによって実行されるらしいんだが、このskill triggerってのがわからん。rule baseで候補を選んで、あとは確率をQ値で出して実行とか?ちゃうか...。
- ユーザーの入力
- keyword抽出
- まず、ユーザーの入力から、Topic Mangerとか、Domain Chat を呼び出す。
- keyword を用いて、rule ベースでskillを呼び出す。
low-level policies についてはCore Chatとskillについてのものがあるらしけど、違いがわからん。skill呼び出したら、そのskill内でpolicyを呼び出すってことでいいのかな?
疑問点として、何回かTurnが必要なskillとかがあったらどうすんだろう? そうしたら、次の方策を強制的にそのskillに変えるとか?
high level policyの流れ
- もし、ユーザの入力がテキストだった場合、Core Chatが開始され、Topic ManagerかGeneral Chatが応答される。
- ユーザの入力がビデオとか画像なら、Image Commentingのskill使用。
- 特定の入力と会話の文脈により、でTask Completion, Deep Engagement, Content Creation
- 複数のskillがTriggerされた場合、triggerの信用スコア、事前に設定した優先度、会話のsessionに基づいて決定するらしい。
会話のsessionってなんぞや?
Topic Manager
Topic Manager はNeural Networkによって、以下の条件を満たしたと判別される場合、実行されるらしい。
- Core Chatが失敗して、Editorial Responseってやつが実行された場合。
- Core Chat で生成された文章がユーザーの入力とおんなじだったり、ただの相槌の場合。
- ユーザーの入力が相槌だけだった場合。
英語だと、相槌は殆ど無いけど、日本語はかなり相槌が多いのはどうカスタマイズしてんだろう?
多分、このただの相槌の判定にNeural Networkが用いられているんだろうな。
んで、このtopicの選び方について。まず、Topicのデータベースって言うのがあるらしい。アメリカならInstagram, 中国なら Doubanらしい。日本はTwitterかな?知らんけど。 でも、どうやってTopicを集めたんだろう?Hashタグ?
empathetic computing moduleで作られた状態s = (Q_c, C, e_Q, e_R) にQueryとして、上位のtopicを選んで、その中でrankづけするらしい。rankづけのやり方は、
- 文脈とtopicとの関係性
- ニュースに関連するTopic の新鮮さ
- プロフィールに基づいたユーザーの興味
- インターネットやRinnaでのTopicの人気度
- Rinna全体にTopicが受け付けられた割合
以上に基づいてrankづけして、Adaboostで最適化されるらしい。
Empathetic Computing
- ユーザーの入力Qがあったとして、以前の文脈Cから補完して、Q_cに書き換える。
- ユーザの感情や状態を抜き出して、e_Qに書き出す。
- ボットの感情や状態を抜き出して、 e_Rに書き出す。
- 状態として、Dialogue Managerにぶち込む。
疑問としては、日本語の文章補完と、ユーザーの感情や状態って何を抜き出すのかってこと。
Contextual Query Understanding
ようするに、前の文章から情報を抜き出して、省略とか埋めましょうってやつ。
忖度が命の日本語ではそうとう難しいタスク(笑)
主語はほぼ省略するし、倒置法とか擬人化もバリバリ使う言語だし...(;_;)。
まあ、それはおいておいて基本的なタスクは3つ。
- 固有表現を抜き出して、メモリーに保存する。
- 「彼」とかの代名詞の共参照を置き換える。
- 前の文章を抜き出して、付け足す。
疑問点としては、固有表現の保存って何を保存するんだろう?
論文を呼んだ感じ、Occupationとか、Genderとかがそれに当たるのかな?多分違うな。わからん。
User Understandig
Q_cとCからe_Qを作るやつらしい。
e_Qっていうのは
みたいな表のことらしい。
それぞれの項目について、
Topic: 現在のTopicについて。論文だと、ユーザーが新しくTopicを始める場合があるっていうんだけど、その場合はどうやってTopicとか抽出してるんだろう? Dialogue Managerにはempathetic computing からできた状態sを入れるわけだから、topic manager でtopicの抽出をするわけじゃないし。
Intent: ユーザの対話行為の場合分け。挨拶だとか質問だとかetx...。 どうやって11種類に場合分けしてんだろう?ルールベースなわけないし、Neural Networkかな?
Sentiment : ユーザーの感情の場合分け。幸福、悲しみ、怒り、通常、感情の変化の合わせて、5種類。 疑問点としては、どうやって場合分けしてんのかってことと、感情の変化っていうひとくくりにして良いのかってこと。
Opiniton: ユーザのtopicに対する姿勢でpositive, negative, neuralの3種類あるみたい。 小説の話をしていて、この作家が嫌い(negative)とか好き(positive)とかの違いとか?
persona: AgeとかGenderとか。正直どう使うのかわからん。
persona以外の項目はデータの個数が決まっているから、
[e_Q = ([201, 5, 2, 1])]みたいになんのかな?
Topicの個数が決まっているのかは知らんけど。
なんか、どんどん疑問が増えていく(笑)
Interpersonal Response Generation
e_Rについて作成するコンポーネントらしい。
Topicは同じ、Opinionはpositive, Sentimentはhappyで作られているらしい。
でも、自分がnegativeかつsadのときに相手がめちゃくちゃpositiveかつhappyだと、くそムカつく気がする(笑)
Evaluation
構成としては、15種類のLABELの固有表現抽出機、共参照解決エンジン、ユーザーの理解機の3つで構成。というか、classifierってことはそれぞれ、sequenceの入力で、Labelの出力をしてんのか。
ユーザー理解機には10000個の会話セッションが教師データとして、使用されたみたい。 多分、固有表現抽出機と同じように学習したんかな?
ってことは、Topic抽出はもともとの教師データとして、ラベル付されていたってことか。
「明日[Time]は、ついに人生初の夏[Season]のコミケ[Topic]に参加して、Noesis[Named Entitie]のコーナーに行くんだ。」[Happy]
みたいな、教師データかな?
Core Chat
構成としてはGeneral ChatとDomain Chatの2つで構成されていて、General ChatはOpen Domeinの入力に対して、応答を返すらしい。
じゃあ、Domain Chatはなんぞやって言うと、Deep Conversations で使用されるやつで、音楽とかアニメとかの特定のDomainについての会話の制御を行うらしい。
特定のDomainについての会話はskillの方だと思ってたんだけど、ちゃうんかな?
General Chat と Domain Chat について、エンジンの実行方法は同じで、使用するDBだけが違うみたい。
っていうか、どうやってGeneral Chatか、Domain Chatなのかを決めてんだろう?
まあ、そういったことはおいておいて、一連の流れとしては、状態s = (Q_c, C, e_Q, e_R)の入力。応答の候補たちの出力。応答のrankづけと出力。となっている。
応答の候補は手動で作ったやつをDBから引っ張ってくるか、Neral Networkを使って出力するらしい。
というか、RNNやん。DecoderのHidden層にe_Qとe_Rの情報を埋め込んで、EncoderにQ_cを入力したあとの出力と
Retrieval-based Generator using Paired Data
会話のペアを用意して、それぞれのe_Q, e_Rを抜き出して、DBに(Q_c, R, e_Q, e_R)の組み合わせで、保存するらしい。
んで、このDBからデータを引っ張ってくるときは、Q_cをKeyとして、Luceneを使って、候補を400個まで引っ張ってくるらしい。
Lucenceをつかって。とあるが、実際はどういった仕組みで動いてんだろう?
ていうか、Rinnaの方はsentiment = happy, opinion = positiveっていう縛りがあるけど、こいつもどうしてんだろう? >> とりあえず、無視してRankづけのときに、sentiment = happy, opinion = positiveとなるような、回答候補を選ぶっぽい。
Q_cの固有表現?でも、それだけだと、文脈に沿っているかなんてわかんないし、わからん。
あと、基本的に Retrival-based Generator using Paired Dataが一番の候補で、それで決まらなかったら、Neural Reposne GeneratorかRetrival-based Generator using Unpaired Dataを使うっぽい。
Neural Response Generator
モデルはやっぱりRNNでGRU-RNNってモデルを使うみたい。LSTMやないんやね。
beam searchを使って、解答候補を20個ほど、生成するってあるけど、beam searchってなんなん?
- beam search *
今回の場合は20個の解答候補を取り出すのか。
まあ、例えば3トークンまで情報を保持していれば結果は変わるかもしれないけど、8000個の確率をいちいち計算するのも大変だし、2トークンまでの保持みたい。
Retrieval-based Generator using Unpaired Data
ペアになっていないデータから、DBを検索して解答候補を作るらしい。
Unpiared Dataからは(R, e_R)のデータしか作れんのにどうすんの?
何か、知識グラフを使用して、queryの拡大をするってあるけど...。知識グラフのデータは(head, relation, tail)ってあるけど、このheadとtailを利用するらしい。
Q_cにheadかtailのどっちかが含まれていたら、もう一方をkeyとして、Rから探し出すとか?
違ってた。
- Q_cのTopicを抜き出す。「進撃について教えて。」 >> topicが「進撃」
- 知識グラフから20個までの関連topicを取り出す。 「巨人」、「バハムート」、「中学生」、「アニメ」、「マガジン」、「ゲーム」・・・。
- Q_cの「進撃」と知識グラフの「巨人」を検索keyとして、e_RのTopicを検索して、Rを400個まで取り出す。
でも、これって結構的はずれなこと言いそうな気がする。でも、Neural Networkを使用したGenerator短くてそっけない応答よりも、長くて有益な情報を含んだ回答を返すらしい。
つまり、品質的には Paired Data > Unpaired Data > Neural Networkの順みたい。
Response Candidate Ranker
3つのGenerator (Retrieval-based using Paired Data, Retrieval-based using Unpaired Data, Neural Response Generator)から、生成された回答をランキング付する機構。boosted tree rankerってのを使っているらしい。論文はAdapting boosting for information retrieval measureesっていうやつ。時間があったらみてみよう。っていうか、これAdaBoostじゃね?
与えられた情報は状態s = (Q_c, C, e_Q, e_R)と回答候補 R' 。この R' の中から、応答を選ばないといけない。どうやって?
会話ペア間の一貫性の評価。 R' 中のそれぞれの回答候補に対して、Q_cとの関連性を調べるらしい。
文脈間での一貫性の評価。
R' 中のそれぞれの回答候補に対して、(Q_c, C)との関連性を調べるらしい。 とくに、Q_cが「確かに」、「そうだね。」みたいな、曖昧で短い入力のときに有効らしい。
- 共感性の適合率
R' 中の回答候補rに対して(r, e_r)を計算して、Rinnaのペルソナと比較するらしい。つまり、Rinnaのpersonaである、sentiment = happy, opinion = positiveに近い候補を取り出すってことか。
- 検索の適合率
Paired Dataから作られた回答候補のみに適用するやつらしい。単語単位でQ_cとデータの(Q_c, R)の比較をするらしい。でも、Q_cを入力として、DBから回答を引っ張ってきてんだから、なんかめちゃくちゃ違和感がある。
上記の4つのscoring system を使って、回答候補を3段階に分けるらしい。
- 0 : つまんない回答。というか、話を聞いていない時の頓珍漢な回答。
- 1: ふつうの回答
- 2: Rinnaの性格に適合していて、かつユーモアあふれる回答
Adaboostを使うってことは、それぞれweak classiferとして登録して、各回答候補に対して0~2をscoringして、そいつをAdaboostに突っ込むんだな。きっと。
0と1が応答される可能性があるってことは、Rinnaの性格にあってない回答をする可能性も十分にありえるのか(笑)。
でも、実際に使用しているユーザーの意見としては、0の回答をよく返されている気がする(笑)。
Editorial Respose
Core Chatが回答候補の生成に失敗したときに返されるやつ。
ユーザーの入力が「わけわかんない」や「興味ない」みたいな回答だったり、性的な質問だったり、すべてのGeneratorが失敗した時用。「どう思っているの?」とか、「別の話をしよう!」みたいな、回答になるらしい。
そういえば、これはRinnaにスタンプ爆弾したときになった(´・ω・`)。
Evaluation
Core Chatに関しては検索ベースと生成ベースの2つを組み合わせたHybrid Systemで作った回答が一番2の評価を得やすかったらしい。というか、Paired Dataだけで、結構2の評価の2/3を占めてるってすごいな。
あと、pearsona を組み合わせただけで、大幅にBLEU scoreが向上知るのもびっくり!
Image Commenting
画像についてのコメント付けで、skillのひとつ。 なんか、画像についてのDescriptionするコメントだけでは不十分で、画像を上げた人の感情とかを読み取ったコメントが必要らしい。
自撮り画像をuploadして、「うーん、ハンサムだね。」とか、コメントせにゃならんらしい。マジか。 人間でも難しいのにwww。
Image Commenting のArchitectureはCore Chatとほぼ同じで、画像からコメントの候補を生成して、そこコメントをランキング付けしてから、選び出すらしい。んで、コメントの候補の生成方法も検索ベースと生成ベースの2つともしようするそうだ。
検索ベースの生成方法では、まずInstagramとかFacebookから、画像とコメントのペアを選び出すらしい。 ここでのコメントは他人からのコメントなのかな? それから、コメントについてpositiveでhappyなものだけを選び出すらしい。 実際に使用するときはCNNを通して、最も近い画像を3つ選んで、そのコメントを回答候補とするそうだ。
生成ベースのやり方では、画像テキスト生成のGeneratorを使っているらしい。Microsoft Image Captioning system に感情とスタイルの制御機構を積んだらしい。スタイルの抽出ってことはモデルはGANのなんかだな。
回答候補のランキングづけもCore Chatとおんなじように、4つのScoring Systemを使った、Adaboostによる最適化をしているらしい。ただ、入力のQ_cは画像だから、Deep Multimodal Similarity Modelってやつで、R'とかの近似度を図っているらしい。
っていうか、Global CoherenceのCはどうすんだべ?データ取得時にCも含めて、Scrapingすりゃいいか。
Evaluation
Image Commentingのあると、画像が登場するChatの長さが2倍になるらしい。ってことは、画像の話をしたら、他の話には発展しづらいのかな?
RinnaはこれとおんなじことをLINE STAMP でもやればいいのに。
Dialogue Skills
XioIceは230のskillを持っていて、コンテンツの作成(content creation)、深い対話(deep engagement)、タスクの実行(task completion)の3つのカテゴリに分類できるそうな。
Evaluation
Dialogue skillっていうのはとっても限定的なものらしいね。ほぼほぼ、手作りのDialogue PolicyとAIMLみたいなテンプレートベースの応答使っているらしい。
評価方法はCore Chatみたいに毎回のようにCallされるものじゃないから、ユーザーの満足度と1日単位や1週間単位でのskillのtriggerされる割合で評価したみたい。
Content Creation
詩の作成、歌を歌ったり読み聞かせの作成、童話の作成とか...。
何やっとんねん(笑)。でも、こういうのを呼び出すときは「make an FM program for [name]」とか「kids story factory」っていうコマンドをいちいち入力せにゃならんらしい(笑)。
Deep Engagement
特定のTopicや設定に対して、ユーザーと深く関わることを目的として作られているらしい。
食べ物の写真からカロリーの計算をするシステム、ちょーネガティブな発言をしたらめちゃくちゃ慰めてくれるシステム、寝るときに羊を数えてくれるシステム、早口言葉を言ってくれるシステムとかいろいろあるらしい。
というか、中国でも寝るときに羊数えんだ(笑)。
Task Completion
いわゆるAlexsaとかCortanaとかGoogle AssistantとかSiriとかのアシスタントボットに追加されている機能。「東京・渋谷の天気は?」とか「10分ほど音楽を流して」とかのリクエストに対して答えるやつ。
ここにKnowledge-Baseの質問も入るらしい。「日本の面積は世界で何番目ですか?」とかの質問。
Open-Domain Questionの一種やないんや。どうやって、他の質問と識別してんだろう?「何番目」とかのKeyword質問とかかな?
わからないこと一覧。
- 方策πについて。skillとCore Chatについて、actionを選んでいるらしいけど、どういった感じでactionを選んでいるんだろう? Triggerが発火したやつから、確率論で選んでいるのかな?
でも、skillはめちゃくちゃ Domain-specificだから、確率論もクソもない気がするんだけど。
skill についてもDialogue Policyというか方策がそれぞれあるみたいな書き方がしてあんだけど、どういうこと?
Full Duplex(全二重通信)のときのシステムの概要がさっぱりわからん(笑)
Global State Trackerはtextと伴に 固有表現 と 感情ラベル がつくらしいんだけど。こいつらをどう使っているのかがわからん。
Topic ManagerがTopicを検出しているのか、Empaty Computing がTopicを検出してんのかわからん。
なんか、Core Chat用のtopicはempathy computingが検出して、 skillのTask CompletionとかContent Creatioとか、Image CommentingのtopicはDialogue Managerが検出している気がする。
- Topic ManagerのTopicを選ぶ時のrankづけがいまいちわからん。状態sを使うってあるけど、状態s = (Q_c, C, e_Q, e_R)の何を使ってTopicをDBから選んでるんやろう?
TopicがRになるわけだから、Q_cによる検索もなんか違う気がするし、わからん。ユーザーの興味はe_Qに入っているから、それを使ったり?
empathetic computingのtopicがわからん。Topic DBにあるやつのTopicを取り出してるのかな? 論文を見ると、大ドメインと小ドメインの2つにわかれている感があるけど。でも、どんなやり方でinstagramとか、doubanのHashタグから抜き出すんだろう?固有表現抽出?
e_Qとe_Rで使用されるIntent、Setiment、Opinionはどうやって識別してんだろう? それぞれ、別の学習機からの出力?
Intentで使われるDialogue Actsって2000年のDialogue Act Modeling for Automatic Taggin and Recogntion of Conversational Speechが元論文になっている気がするんだけど、この論文のDialogue Actsって42種類もあるから、こっから11種類をどうやって選んだのかわからん。
Sentimentは感情の変化をひとくくりにしているけど、「怒り->通常」とか、「悲しみ->怒り」とかもおんなじ扱いになるのが気になる。 あと、論文の図ではsad, nervusっていう項目があるけど、このnervusって何者?
Opinionは普通にQ_cのnegative, positive, neuralを識別するだけかな?一度でも、negative or positiveになったら、つぎにneural が来てもそのままで行く気がするが。
topic, sentiment, intent, entityについて調べてみた。
- Entity (Google Cloud と Azureで()がついていないのは共通)*
- Unknown (G)
- Person (GA)
- PersonType (A)
- Location (GA)
- Organization (GA)
- Event (GA)
- Product (A)
- Skill (A)
- Adress (GA)
- Phone Numer (GA)
- Email (A)
- URL (A)
- IPAdress (A)
- DateTime (GA)
- Quantity (A)
- Work of Art (G)
- Cosumer good (G)
- Other (G)
Price (G)
Topic (Google Cloud) *
多いのでURLだけ貼っておく
もとの論文っぽそうなのが Topic Aware Neural Response Generationっていう論文。
- Opinion (Google Cloud)
テキスト中のEntityについてpositive, negative, neuralを識別するAPI。EntityにTopicが含まれていれば、それがOpinionになるってことか。
- Opinion (Azure)
テキストそのものがpositive, negative, neuralかを判定するやつ。topicにはnegativeでも、文章全体がpositiveなら、positiveになるっぽい。 あと、Googleみたいに各Entityに対して、OpinionをつけるのはOpinion Miningっていうやつでやれるみたい。
- Sentiment (Google Cloud)
テキストそのものがpositive, negative, neuralかを判定するやつ。AzureのOpinitonとおんなじ。
とりあえず、Big5のAPIでEmotionを識別するやつは見つかんなかった。 一応、Indico APIっていう英語だけだけど、'anger', 'joy', 'fear', 'sadness', 'surprise'の5つを識別できるっぽい。でも、日本の美しき感情に嬉し泣きっていうのがあるから、そいつはどう判定されんのやろう?
- Retrival-Generatorで使用されるluceneってなに? >> Elastic Searchの内部エンジン。あーElastic Searchで検索してんのか。なんとなくわかった気がする。
元論文である Learning Distributed Representations of data in Community question Answering for Question Retrival のAbstractによると、文章のカテゴリと単語を分散表現で表して、これをQueryにして検索をかけるみたい。つまり、Q_c内のEntityとe_Q内のTopicをvectorになおして、ElasticSearchで検索しているみたい。
- Retrival-Generatorで引っ張ってきたResponseのQueryとの関連性とかどうやって計算してんだろう?
Learning deep structured semantic models for web search using clickthrough datalってやつで実装はここなんだけど、見た感じ文章の一貫性を判別するやつじゃない気がする。
なんか、気になるから調べてみるか...。