Dieses Projekt war ursprünglich für einen KI-Kurs an der Universität Sofia gedacht. Während der Ausführung war ich unter Zeitdruck und konnte nicht alle Ideen umsetzen, die ich hatte, aber ich habe vor, weiter daran zu arbeiten ... und ich habe das Thema für meine Masterarbeit aufgegriffen und T5-Transformatoren verwendet, um Fragen zu generieren. Antwortpaare zusammen mit Ablenkern . Schauen Sie es sich im Question-Generation-Transformers-Repository an.
Der Ansatz zur Identifizierung von Schlüsselwörtern, die als Zielantworten verwendet werden, wurde auf der RANLP2021-Konferenz – Generating Answer Candidates for Quizzes and Answer-Aware Question Generators – akzeptiert.
Die Idee besteht darin, Multiple-Choice-Antworten aus Text zu generieren, indem dieses komplexe Problem in einfachere Schritte aufgeteilt wird:
Um Konflikte mit Python-Paketen aus anderen Projekten zu vermeiden, empfiehlt es sich, eine virtuelle Umgebung zu erstellen, in der die Pakete installiert werden. Wenn Sie dies nicht möchten, können Sie die nächsten Befehle überspringen und direkt die Datei „requirements.txt“ installieren.
Erstellen Sie eine virtuelle Umgebung:
python -m venv venv
Betreten Sie die virtuelle Umgebung:
Windows:
. .venvScriptsactivate
Linux oder MacOS
source .venvScriptsactivate
Installieren Sie ipython im venv:
ipython kernel install --user --name=.venv
Installieren Sie Jupyter Lab im Venv:
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
Bevor ich etwas dazu sagen konnte, wollte ich mehr darüber verstehen, wie Fragen gestellt werden und welche Art von Wörtern die Antworten sind.
Ich habe den SQuAD 1.0-Datensatz verwendet, der etwa 100.000 aus Wikipedia-Artikeln generierte Fragen enthält.
Die Erkenntnisse, die ich gewonnen habe, können Sie im Jupyter-Notizbuch „Data Exploration“ nachlesen.
Ich ging davon aus, dass Wörter aus dem Text gute Antworten auf Fragen wären . Ich musste nur entscheiden, welche Wörter oder kurzen Sätze gut genug sind, um zu Antworten zu werden.
Ich beschloss, jedes Wort im Text einer binären Klassifizierung zu unterziehen. spaCy hat mir beim Wort-Tagging wirklich geholfen.
Ich musste so ziemlich den gesamten Datensatz für die binäre Klassifizierung erstellen. Ich habe jedes Non-Stop-Wort aus den Absätzen jeder Frage im SQuAD-Datensatz extrahiert und einige Funktionen hinzugefügt, wie zum Beispiel:
Und die Beschriftung lautetAntwort – ob das aus dem Absatz extrahierte Wort mit der Antwort auf die SQuAD-Frage identisch ist und sich an derselben Stelle befindet.
Einige andere Funktionen wie der TF-IDF- Score und die Kosinusähnlichkeit zum Titel wären großartig, aber ich hatte keine Zeit, sie hinzuzufügen.
Abgesehen davon ist es unserer Vorstellungskraft überlassen, neue Funktionen zu erstellen – sei es am Anfang, in der Mitte oder am Ende eines Satzes, Informationen zu den ihn umgebenden Wörtern und mehr ... Bevor wir jedoch weitere Funktionen hinzufügen, wäre es schön, sie zu haben eine Metrik zur Beurteilung, ob die Funktion nützlich sein wird oder nicht.
Ich fand das Problem ähnlich wie bei der Spam-Filterung , wo ein üblicher Ansatz darin besteht, jedes Wort einer E-Mail als aus einer Spam-E-Mail stammend oder nicht als Spam-E-Mail zu kennzeichnen.
Ich habe den Gaussian Naive Bayes -Algorithmus von scikit-learn verwendet, um jedes Wort daraufhin zu klassifizieren, ob es eine Antwort ist.
Die Ergebnisse waren überraschend gut – auf den ersten Blick klassifizierte der Algorithmus die meisten Wörter als Antworten. Diejenigen, die es nicht schafften, waren tatsächlich ungeeignet.
Das Coole an Naive Bayes ist, dass man für jedes Wort die Wahrscheinlichkeit erhält. In der Demo habe ich das verwendet, um die Wörter von der wahrscheinlichsten zur unwahrscheinlichsten Antwort zu ordnen.
Eine andere Annahme, die ich hatte, war, dass der Satz einer Antwort leicht in eine Frage umgewandelt werden könnte . Wenn ich einfach ein Leerzeichen an der Stelle der Antwort im Text einfüge, erhalte ich eine „Lückentextfrage“ (Satz mit einem Leerzeichen für das fehlende Wort).
Antwort: Sauerstoff
Frage: _____ ist ein chemisches Element mit dem Symbol O und der Ordnungszahl 8.
Ich kam zu dem Schluss, dass es sich nicht lohnt, die Lückenfrage in einen eher fragenden Satz umzuwandeln, aber ich kann mir vorstellen, dass dies mit einem seq2seq-Neuronalen Netzwerk möglich wäre, ähnlich wie bei der Übersetzung von Text von einer Sprache in eine andere.
Das Teil ist wirklich gut geworden.
Für jede Antwort, die ich erstelle, werden mithilfe von Worteinbettungen und Kosinusähnlichkeit die ähnlichsten Wörter generiert.
Die meisten Wörter sind völlig in Ordnung und könnten leicht mit der richtigen Antwort verwechselt werden. Aber es gibt einige, die offensichtlich nicht angemessen sind.
Da ich keinen Datensatz mit falschen Antworten hatte, griff ich auf einen klassischeren Ansatz zurück.
Ich habe die Wörter entfernt, die nicht der gleichen Wortart oder der gleichen benannten Entität wie die Antwort entsprachen, und etwas mehr Kontext aus der Frage hinzugefügt.
Ich möchte einen Datensatz mit Multiple-Choice-Antworten finden und prüfen, ob ich ein ML-Modell erstellen kann, um bessere falsche Antworten zu generieren.
Nach dem Hinzufügen eines Demo-Projekts eignen sich die generierten Fragen nicht wirklich für den sofortigen Einsatz in einem Klassenzimmer, sind aber auch nicht schlecht.
Das Coole ist die Einfachheit und Modularität des Ansatzes, bei dem man herausfinden kann, wo es schlecht läuft ( z. B. bei der Klassifizierung von Verben ) und eine Lösung einbauen kann.
Ein komplexes neuronales Netzwerk ( wie alle Artikel zu diesem Thema ) wird wahrscheinlich besser funktionieren, insbesondere in der Zeit, in der wir leben. Aber das Tolle, was ich an diesem Ansatz herausgefunden habe, ist, dass er für einen Softwareentwickler mit seiner softwaretechnischen Denkweise wie ein Tor ist, in den Bereich der KI einzusteigen und aussagekräftige Ergebnisse zu sehen.
Ich finde dieses Thema sehr interessant und mit viel Potenzial. Ich würde wahrscheinlich weiterhin in diesem Bereich arbeiten.
Ich habe mich sogar für einen Master of Data Mining eingeschrieben und werde wahrscheinlich einige ähnliche Projekte durchführen. Ich werde hier alles Nützliche verlinken.
Ich habe bereits etwas mehr Zeit in die Fertigstellung des Projekts investiert, möchte es aber eher in ein Tutorial über den Einstieg in den Bereich der KI umwandeln und gleichzeitig die Möglichkeit haben, es problemlos um neue benutzerdefinierte Funktionen zu erweitern.
Update – 29.12.19: Das Repository erfreut sich großer Beliebtheit, daher habe ich ein neues Notizbuch ( Demo.ipynb ) hinzugefügt, das alle Module vereint und Fragen für jeden Text generiert. Ich habe die anderen Notizbücher neu bestellt und den Code dokumentiert (etwas besser).
Update – 09.03.21: Eine Datei „requirements.txt“ mit Anweisungen zum Ausführen einer virtuellen Umgebung hinzugefügt und der Fehler a mit ValueError behoben: Operanden konnten nicht zusammen mit Formen übertragen werden (230, 121) (83, )
Ich habe auch mit der Arbeit an meiner Masterarbeit mit einem ähnlichen Thema der Fragegenerierung begonnen.
Update - 27.10.21: Ich habe den Code für meine Masterarbeit im Question-Generation-Transformers-Repository hochgeladen. Ich empfehle Ihnen dringend, es sich anzusehen.
Darüber hinaus wurde der Ansatz, bei dem ein Classfier zur Auswahl der Antwortkandidaten verwendet wird, als Studentenarbeit auf der RANLP2021-Konferenz angenommen. Papier hier.