11本目!Question retrieval using combined queries in community question answering

ではでは、恒例(?)のXioaIceで使われていた論文シリーズに参りたいと思います。

XioaIceでは生成ベース、検索ベース、ルールベースが使われていましたが、こいつはそのうちの検索ベースで使われていたやつ。 具体的にはPaired Dataに対して、(Question, Answer)としてデータベースに保存しているところを、Questionで検索してAnswerを持ってくるのにこのモデルが使われていたね。

特にCore ChatにおけるCPSの2/3の高精度を占めているのがPaired Dataの検索モデルの結果だから心してかかろう(笑)

まあ、こいつが何をやっているのかを一言で言うと、Questionがあった時、Yahoo知恵袋とかのアーカイブデータから、もっとも答えっぽい回答を抜き出すためのシステムらしい。 っていうか、Yahoo知恵袋とかってCommunity question answering(cQA)っていうのね。

なんか、このシステムでは検索するときに、keywordsではなくsentenceで検索できるっぽい。まじで、どうやんの?

queryに関連した文から、(a)でquestionだけがドキュメントにあるパターンと(b)でquestionとanswerが両方共ドキュメントにある場合の2つのパターンでやってるっぽい。

(b)のやり方がわからん。 あと、IR(Information Retrieval) modelっていうので、Queryを引っ張ってるらしいんだけど、verctor space ,Okapi, language mdoelっていろいろあるのね。

よくわからんが、見ていこう!

まあ、よく見る単語入力の場合。転置インデックスとフレーズクエリっていうのを使うらしい。

転置インデックスっていうのが、いわゆる逆引きのことで、ドキュメントにどの単語が使われているのかを知るのがインデックス(Transormferのconvert_tokens_to_idsとかのイメージ)。単語がどのドキュメントに使われているのかを知るのが転置インデックスらしい。

なんか、聞いたことあるなって思ったら、Googleページランクとかの技術の一部らしい。

んで、単語を組み合わせて、n-gramとしてインデックスを作って、検索する方法は1998年にはあったぽい。まじかー20年以上も昔やん。

疑問点としては転置インデックスをつくる単語って全部っぽいけど計算量とかどうなんだろう?

っていうか、単語の種類が1000あるとして、n-gramの単語長さで考えると、それだけで1000000000のインデックスが必要になるし、マジでどうゆう仕組みなんだろう?

Question retrieval from FAQs

こいつは多分検索フォームとかに打ち込んで調べるやつ。よくある質問(Frequent Answers and Questions)の検索システムみたい。 ここで、クエリ検索の最も一番大きな問題は類義語。 QuestionとAnswer間の単語の違いとが重要らしい。WHY? 「君の心臓を喰らいたい」と「あなたのハートを食べてしまいたい」が意味的には同じって判断できるのに、コンピューターでは判断できないことか。 技術としてはQuestionの拡大や統計学の使用、メタデータの使用、フィッシャーカーネルフレームワークっていうよく知らんやつの使用、SVM、翻訳モデル、トピックモデルの使用、etc... Wow!どれを使えば良いんだ?

Question retrieval in cQA

こいつは多分、ドキュメントから質問を検索する技術 検索モデルは4つのVSM, Okapi Model, Language Model, translation modelの4種類があるっぽい。 translation modelで、質問の構成をTree構造で解析して、ルートからマッチングを行うのかな?全く想像がつかん。 Important phraseってあるけど、Tree構造のどこにあたるんだろう?そもそもTree構造から検索するシステムがわからん。

調べた感じ、重要な単語(Categoryに多く出てくるが、Docuemntsでは珍しい単語。いわゆるTopic モデルのやつ)から順番にTree構造に直して、最もTreeが近いものを検索するためのQuestionにしているっぽい。

その後の技術では、ドキュメントそのものをベクトル表現になおして、QueryとAnswerを組み合わせたベクトルに近いドキュメントを検索するみたい。統計情報と意味情報でQuestionとクエリの類似性を調べているみたい。まあ、RNNつかってるけど。

Using classification for question retrieval in cQA

前述のTree構造をどうやって作るのかが問題。Topic分類を使ってTreeを作るんだけど、ではどうやってTopicを分類して文章を集めましょうかってこと。 一般的な文章からどうやって分類をするのかが問題。 すぐに思いつくのが、Yahoo のTopicとかを教師データにしてあとはガンガンWebデータをぶち込んでいく方法 or sent2vecでドキュメントのベクトルでどうにかする方法だけど...。

SVM, Okapi Model, Translate model, syntactic tree matchingとか色々あるっぽい。 あと、加重および疑似関連性フィードバック手法っていうよくわからない方法で文章の分類だけでなく補完できるっぽい。

Use of combined queries for question retrieval in cQA

Information Retrievalのシステムでは単語を使って検索している。 んで、やっぱ基本は単語の頻度分析らしい。TF-IDFだよね。まあ、データを集めるのが大変だけど。

この研究ではcombined indexes と nextword indexesを使って検索した結果の比較みたい。phrase queryってなんだ?

Architecture of proposed methodology

検索モデルは、ドキュメントの表現、クエリの表現、検索関数の3つが重要みたい。 検索関数って検索して引っ張ってくる関数なのか、検索結果をランキング付する関数なのか、それとも両方なのか?

まあ、QAペアをどうやって集めるのかが大事みたいだけど。

Query and Document representation

ドキュメントとクエリの表現は一般的には term-document matrixを使って表現していたみたい。

f:id:kaya-takashiro:20210912021756p:plain

こいつに各マスに重みをつけて、単語の重みの合計値が最も近いドキュメントを引っ張ってくるみたい。 問題点としては文中の単語の位置情報や単語間の関係性が表現できないことらしい。 で、これを解決する方法は syntactic phrases 、graph-theoric approach 、 combined queries とかがあるみたい。

sytactic phrases は重要な単語から枝を伸ばしていって構造木を作り、クエリに最も近い木をさがす方法らしい。まあ、構造木の作り方は TF-IDF で重要度を測って一番重要なやつからつなぐとか?でも、そうすると、助詞とかの情報が取れないんだよね。どうするんだろう?

graph-theoric approach は単語間でグラフを作って、文の構造を解析し、クエリに最も近いドキュメントを取ってくる方法らしい。 どうやって重みつけるの?とか、解析のやりかたは?とかわからないこともあるけど、この論文では載ってない。

combined queriesはこの研究でやってる方法で、inverted indexes と nextword indexesの2つのデータ構造を使って、クエリとドキュメントの表現をしているみたい。

Inverted indexes

Information Retrieval Systemでよく使われている方法みたい。 検索keyにはboolean, position, phraseとかあるって書いてあるけど、どうやってんの?

Inverted indexって

(ドキュメントの番号, ドキュメント中の単語tの出現合計数, [ドキュメント中の位置のリスト]) で表されるみたい。これを 例えば「何」って単語のidを1125として、

1125,(<1, 1, [1]>, <8, 1, [10]>, <15, 2, [1, 5]>,...)

みたいな感じで表されるみたい。

Nestword list

Nextword listは単語と次の単語の組み合わせごとに id を振る方法らしい。 たとえば、「本 を」, 「本 に」, 「本 が」のidをそれぞれ 6, 19, 20として振る感じだね。

Combined inverted and nextword indexes

Combined queryでは、rare wordにはnextword listを使わずに、rare word以外ではそのまま idを振る感じだね。 例えば「何 を」「何 が」「コーヒー」にそれぞれ id を109, 23, 432 を振る感じ。 「コーヒー」は珍しいからそのままでidを振って、「何」は頻出単語だから nextword listと組み合わせてid振る。

Information retrieval methods

クエリとドキュメントについて数学的に表現して、検索するみたいだけど、クエリに対してスコアをつける方法がわからん。 combined queryをどうやって数学的に表現しよう?

Vector space model

Nをすべてのドキュメントの合計値、 f _ tを単語tの合計値、 t( f _ {t, d})wpドキュメントdにおける単語tの合計値とする。 各ドキュメンtにおいて、 W _ {q, t}は単語tにおける IDFで  W _ {d, t}は単語tにおけるTFとして計算するみたい。

んで、この式にぶち込むと。

f:id:kaya-takashiro:20210912204705p:plain
vsm

うーん。類義語とか単語の文章中の位置とかは考慮しないのか...。

Okapi BM25 model

Okapi BM25は Okapiのモデルに重み付けしたやつらしい。 こんな感じ。

f:id:kaya-takashiro:20210912211308p:plain
okapi

Language model

言語モデルを使ったやつ。

ドキュメントDの中で単語tが発生する確率は、すべてのドキュメントのコレクションで単語tが発生する確率とドキュメントDで単語tが発生する確率の合わせたやつで、これをクエリ中のすべての単語に対して行って、クエリのドキュメントDでの発生確率をだすみたい。

まあ、それぞれの発生確率はベイズ理論を用いて出すみたいだけど。

Expriments

まあ、実験結果を見た感じ、VSM + combined queries で作ればいい感じ。

でも、結局word2vecとかのやつで検索するやつはなかった。XioaIceがただの単語idしか使わないとは思わないし、多分もう一方の論文で、べつの検索関数でランキング付してるんだろうな。

Sentence BERTっていう、類似度検索をBertをFine-Tuningしてできるやつがあるから、あとで見てみよう。