このプロジェクトはもともとソフィア大学の AI コースを対象としたものでした。実行中は時間に制約があり、すべてのアイデアを実装することはできませんでしたが、今後も作業を続けるつもりです...そして、 T5 トランスフォーマーを使用して質問を生成し、修士論文のテーマを選択しました。解答のペアと注意をそらすもの。 Question-Generation-Transformers リポジトリで確認してください。
ターゲット回答として使用されるキーワードを特定するアプローチは、RANLP2021 カンファレンス「クイズの回答候補の生成と回答を意識した質問ジェネレーター」で承認されました。
この複雑な問題をより単純なステップに分割することで、テキストから多肢選択の回答を生成するという考え方です。
他のプロジェクトの Python パッケージとの競合を避けるために、パッケージがインストールされる仮想環境を作成することをお勧めします。これを望まない場合は、次のコマンドをスキップして、requirements.txt ファイルを直接インストールできます。
仮想環境を作成します。
python -m venv venv
仮想環境に入ります。
Windows:
. .venvScriptsactivate
Linux または MacOS
source .venvScriptsactivate
ipython を venv 内にインストールします。
ipython kernel install --user --name=.venv
venv 内に jupyter lab をインストールします。
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
何かをする前に、質問がどのように作られ、それがどのような言葉で答えられるのかをもっと理解したいと思いました。
私は、Wikipedia の記事から生成された約 100,000 の質問を含む SQuAD 1.0 データセットを使用しました。
私が見つけた洞察については、データ探索jupyter ノートブックで読むことができます。
私の思い込みは、本文中の単語が質問に対する優れた答えになるだろうと考えていました。私がしなければならなかったのは、どの単語または短いフレーズが答えになるのに十分であるかを判断することだけでした。
テキストの各単語に対して二項分類を行うことにしました。 spaCy は単語のタグ付けに非常に役立ちました。
バイナリ分類用のデータセット全体を作成する必要がありました。 SQuAD データセット内の各質問の段落から各ノンストップ ワードを抽出し、次のような機能を追加しました。
そして、ラベルはAnswerです- 段落から抽出された単語がSQuADの質問の答えと同じで同じ場所にあるかどうかです。
TF-IDFスコアやタイトルとのコサイン類似度など、他の機能もあれば素晴らしいと思いますが、それらを追加する時間がありませんでした。
それ以外に、新しい機能を作成するかどうかは私たちの想像力次第です - おそらく文の先頭、中間、または末尾、文の周囲の単語に関する情報など... 機能を追加する前に、機能が役立つかどうかを評価するための指標。
私は、スパム フィルタリングに似た問題を発見しました。一般的なアプローチは、メールの各単語にスパムメールから来たものであるか、スパムメールではないものとしてタグ付けすることです。
scikit-learn のGaussian Naive Bayesアルゴリズムを使用して、各単語が答えであるかどうかを分類しました。
結果は驚くほど良好で、一目見ただけで、アルゴリズムはほとんどの単語を回答として分類しました。そうでないものは実際には不適合でした。
Naive Bayesの優れた点は、各単語の確率が得られることです。デモでは、これを使用して、最も可能性の高い答えから最も可能性の低い答えまで単語を並べ替えました。
私が抱いていたもう 1 つの仮定は、答えの文章は簡単に質問に変わる可能性があるということでした。本文中の答えの位置に空白を入れるだけで「詰め込み問題」 (足りない単語を空白にした文章)が得られる
答え:酸素
質問: _____ は、記号 O、原子番号 8 の化学元素です。
私は、cloze の質問をより質問っぽい文に変換するのは価値がないと判断しましたが、テキストをある言語から別の言語に翻訳するのと同じように、 seq2seq ニューラル ネットワークを使用して実行できるのではないかと考えています。
その部分は本当にうまくいきました。
それぞれの回答に対して、単語の埋め込みとコサイン類似度を使用して、最も類似した単語を生成します。
ほとんどの単語は問題なく、正しい答えと間違われる可能性があります。しかし、明らかに適切ではないものもいくつかあります。
不正確な答えを含むデータセットがなかったため、より古典的なアプローチに戻りました。
回答と同じ品詞や名前付きエンティティではない単語を削除し、質問からコンテキストを追加しました。
多肢選択の回答を含むデータセットを見つけて、より適切な不正解を生成するためのML モデルを作成できるかどうかを確認したいと考えています。
デモ プロジェクトを追加した後、生成された質問は教室ですぐに使用できるものではありませんが、悪くはありません。
優れているのは、このアプローチのシンプルさとモジュール性です。どこが悪いのか (動詞の分類など) を見つけて修正を組み込むことができます。
(このトピックに関するすべての論文と同様に) 複雑なニューラル ネットワークを使用すると、特に私たちが生きている時代では、おそらくより良い結果が得られるでしょう。しかし、このアプローチについて私が気づいた素晴らしい点は、ソフトウェア エンジニアがソフトウェア エンジニアリングの考え方を持って AI の分野に参入し、有意義な結果を見るための入り口のようなものであるということです。
このテーマは非常に興味深く、大きな可能性を秘めていると思います。おそらく私はこの分野で働き続けるでしょう。
私はデータ マイニング修士号にも登録しており、おそらく同様のプロジェクトをいくつか行うことになるでしょう。役立つものはここにリンクします。
プロジェクトを完成させるためにすでにもう少し時間を費やしていますが、新しいカスタム機能で簡単に拡張できる機能を備えながら、AI の分野に参入するためのチュートリアルにさらに変えたいと考えています。
更新 - 29.12.19:このリポジトリはかなり人気になったので、すべてのモジュールを結合し、任意のテキストに対する質問を生成する新しいノートブック ( Demo.ipynb ) を追加しました。他のノートブックを並べ替えて、コードを文書化しました (少し改善しました)。
更新 - 09.03.21:仮想環境を実行する手順を含むrequirements.txtファイルを追加し、 ValueError: オペランドをシェイプと一緒にブロードキャストできないというバグを修正しました (230, 121) (83, )
私も同様の質問生成というテーマで修士論文に取り組み始めました。
更新 - 27.10.21:修士論文のコードを Question-Generation-Transformers リポジトリにアップロードしました。ぜひチェックしてみてください。
さらに、分類器を使用して回答候補を選択するアプローチは、RANLP2021 カンファレンスの学生論文として採択されました。ここに紙を。