
質問対応の効率化施策にネットワーク分析を活用してみた話
はじめに
こんにちは。ライフイズテックでデータサイエンティストをしているホンディーです。
ついに先日の大学入試共通テストで初めての情報Iの試験が実施されましたね。点数情報の提供に同意いただきました塾と生徒の皆様から結果を連携していただいていますが、みなさんの学習の成果がしっかり出たことが確認でき、とても嬉しいです。この後は国立大学の2次試験も控えていますし、まだまだ受験が続く人も多いと思いますので最後までしっかりと頑張ってください!
提供いただいた共通テストの成績に関する分析については、まずはご利用いただいている塾や予備校の皆様向けの講評会などを通して発信させていただきたいと思います。ということで、今回のnote記事は別の分析のお話です。
情報AIドリルの質問回答業務について
僕たちはすでに来年度に向けて学習塾向けの情報AIドリルのサービス改善に取り組んでいます。様々な施策が進んでいますが、その1つに質問対応の効率化があります。
情報AIドリルではご利用いただいている生徒の皆様からの質問を受け付ける機能があり、担当者が交代で回答にあたっています。
この質問回答結果はデータベースに蓄積され、質問に回答する際には過去の回答を参照して引用しています。毎回ゼロから回答を作成するのではなくデータベースを使うことによって回答の正確性を担保し、返信速度を上げ、担当者間の回答の品質を一定に保つことができます。
質問データベースの課題と対応策
この1年間で非常に多くの質問をいただき、質問のデータベースも莫大なものになったので、問題によっては1問で数百件の回答データがあるものも出てきました。
こうなってくると、データベースで問題を指定して過去の事例を検索したとしてもヒットする回答例が多すぎてどれを使うか選ぶのに時間がかかることがあります。

しかも、もし同じ内容の質問が頻発している問題であれば、その回答例はほぼ同じものになり、多くの前例が検索でヒットするメリットは少ないです。特に、パターンAの質問の回答例が30個、パターンBの質問の回答例が5個、のように偏ってデータがあるとき、これが画面にズラッと出てくるとパターンBの回答例を探すのは簡易的な検索機能があっても大変です。

また、同じ回答を引用していても、個々の質問に対してカスタマイズして回答していますのでどれが一番汎用的で引用しやすいものなのかはわかりにくく、担当者は毎回多くの回答例を読む必要があります。この検索作業を効率化したいというのが今回の取り組みです。
この対応策として、質問回答担当者が管理画面で質問を見たら、その問題の解答で流用しやすい回答例が質問と同じ画面に表示される、という状態を目指しています。先ほどの例で言えば、パターンAの回答例とパターンBの回答例がそれぞれ1個ずつ見られる状態にしておき、問題を指定してデータベースから検索する手間を減らします。

模範になる質問回答例の一覧を準備したい
さて、この施策を実施するためにはもちろん質問回答を行う管理画面に機能追加する開発が必要になりますが、それと同時に、表示する質問回答例のデータを準備しなければなりません。
情報AIドリルの問題は小問も数えると1000問を超えており、しかも同じ問題であっても複数パターンの質問が発生し得ます。そしてその模範となる回答例は今後頻繁に引用されていくので、高い品質を保って準備しなければなりません。この作業を少しでも効率化すべく工夫を考えました。
レーベンシュタイン距離(編集距離)を用いて回答間の引用を検出する
質問回答画面に表示する回答例は、やはりこれまで何度も引用された実績のあるテキストを元に準備するのが良いと考えました。
質問への回答はだいたい次の構成になっています。
質問を受けての一言(学習の姿勢を褒める、回答の方針を示す等の前置き)
疑問への回答の本文
担当者からの一言(今後の学習への励ましや、まだ疑問点があったら再度質問してね、といった締めの言葉)
これらのうち、2. の回答の本文の部分が回答の品質担保のためデータベースの回答事例を引用しつつ作成されています。(1.と3.は担当者が個別に書いており、質問の内容や回答者によって様々です。)
そこで、僕はこれまでの回答テキストの一覧から、最初と最後の部分を取り除き、回答の本文だけ残したデータを作成し、それらの類似度を計測して回答の引用関係を調査しました。
2の本文の部分に関しても、質問者の理解度に合わせて内容を調整されていたり、少しでも改善すべく言い回しや表記の微修正が加えられていることが多くありました。
そのため、テキストの完全一致を基準に引用を検出するのは難しかったので、レーベンシュタイン距離を用いて、テキストが似ているかどうかを判定しました。レーベンシュタイン距離というのは、ある文字列に対して、1文字の挿入、削除、置換を最低何回施せばもう一方の文字列に一致するかを示すものです。
さらに、元の文字列の長さも考慮した標準化レーベンシュタイン距離を使って、似ている回答のペアをリストアップしました。
似ている回答のグループを作りその中から代表例を選抜する
さて、レーベンシュタイン距離を使って回答の類似が判定できるようになったらそれを使って類似回答のグループを作ることを考えます。
「n個の回答があって全部がお互いにほとんど同じ」のようなグループであれば、その特定は比較的簡単です。しかし、そうはならない回答例のグループがたくさんあったのです。
例えば、ある質問に対する回答Aがあったとしましょう。また別の生徒の同じ問題の質問があった時、その生徒が前提からわかっていなかったら丁寧に加筆された回答Bが作成され、別の生徒は惜しいところまで理解しているとなると、要点を絞って簡素化した回答Cが作成される、といった事例があります。この場合、回答Aと回答B、回答Aと回答Cはそれぞれ似ているが回答Bと回答Cは差分が大きい、となったりします。

このような回答間の類似関係のバリエーションが非常に多彩でした。この記事のヘッダーの画像にいくつか事例を載せています。
そして、回答を類似しているものごとにグループにまとめて終了ではなく、各グループの中から引用しやすい代表的なものを選抜する作業まで行う必要がありましたが、いかんせんデータが多いのでこれらを全部目視で行うのは現実的ではありません。
ネットワーク分析の問題に帰着させてライブラリを活用する
作業量削減のために何らかの工夫をしたいと考えた時、回答とそれらの間の類似関係というデータ構造をグラフと見なすことで、ネットワーク分析の技術が使えるのではないかと考えました。
グラフというのは折れ線グラフや棒グラフのグラフではなく、「グラフ理論」のグラフです。
回答の一つ一つを頂点とし、類似している回答間に辺をつくるとグラフになるのです。このグラフを作る作業は非常にシンプルなコードで行うことができます。
そして、グラフのデータができてしまえば、ネットワーク分析の各種アルゴリズムが実装されたライブラリがあるので、非常に多彩な処理を手軽に行う事ができます。今回はPythonのネットワーク分析のライブラリでは一番メジャーだと思うNetworkXを使いました。
連結成分を検出する関数を呼び出すだけで類似グループを抽出でき、さらに一番重たい作業であったそれぞれのグループから代表となる回答例を選抜する作業も、中心性という指標を計算する関数を使って自動化できました。(中心性には複数の種類があります。数パターン実験して採用するものを決めました。)
最後は手作業で仕上げる
ここまでの作業でデータベースに蓄積された回答群から回答例として使えそうな候補が選抜できました。
ただ、ここで準備した回答は質問対応で何度も引用してくことになるのでその品質は非常に重要です。そのため、仕上げとしてこれらの回答例を使って目視かつ手作業で仕上げを行っていきます。今は共通テストが終わったばかりで質問が減っているので、質問回答の担当者が手分けして作業しています。
こちらの作業が終わったら実際に質問回答業務で活用し、回答例の改善や追加などを続けてブラッシュアップしていくことで、生徒の皆さんにできるだけ早く、わかりやすい回答を届けていけるようにしたいですね。
来年度に向けて
今年情報AIドリルを使ってくださった生徒の皆さんが共通テストで良い成績を残してくれたので、きっと来年度は今年以上に多くのかたに情報AIドリルを使っていただけて、より多くの質問が届くのではないかなと期待しています。
それに答えられる体制を整えていけるよう、今回の質問回答効率化に限らず様々な準備を進めていきます。
まとめ
今回はテキストデータを類似なもので分類してそれぞれのグループから代表的なものを探すという、一見自然言語処理で対処する課題に、ネットワーク分析の技術が使えたという事例を紹介しました。
作業の全体としては最後に手作業が残ってしまったので、途中の一部を簡略化できただけなのですが、それでも最初から全て目視で行う場合と比較すると読まなければならない文章量を10分の1以下にできたのではないかと思います。
今回は質問の回答文の分析でしたが、実は以前質問文の分析を行ったことが有り、その内容もnote記事にしています。
これもテキストの分類の話だったのですが、質問文の方は生徒のみなさんがそれぞれ書いているので、過去の例を引用することが多い回答文とは分析に使える手法が違うんですよね。
安易に質問文を分析したときと同じ方法で分析しようとせず、一旦立ち止まって最適な方法を探すことで工数削減ができたのかなと思います。
おしらせ
ライフイズテックでは一緒に働く仲間を募集しています。様々な事業、職種で募集しているのでこちらのサイトもぜひ見てください!