该项目最初是为索非亚大学的人工智能课程设计的。在执行过程中,我受到时间限制,无法实现我的所有想法,但我计划继续研究它......并且我确实选择了我的硕士论文主题,使用T5 Transformers 生成问题 -答案与干扰项配对。在 Question-Generation-Transformers 存储库中查看它。
用于识别用作目标答案的关键字的方法已被 RANLP2021 会议接受 - 为测验生成候选答案和答案感知问题生成器。
这个想法是通过将这个复杂的问题分解为更简单的步骤,从文本中生成多项选择答案:
为了避免与其他项目中的 python 包发生任何冲突,最好创建一个将安装这些包的虚拟环境。如果您不想这样做,您可以跳过接下来的命令并直接安装requirements.txt 文件。
创建虚拟环境:
python -m venv venv
进入虚拟环境:
视窗:
. .venvScriptsactivate
Linux 或 MacOS
source .venvScriptsactivate
在 venv 中安装 ipython:
ipython kernel install --user --name=.venv
在 venv 中安装 jupyter lab:
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
在我做任何事之前,我想更多地了解问题是如何提出的以及答案是什么样的。
我使用了 SQuAD 1.0 数据集,其中包含从维基百科文章生成的大约 100 000 个问题。
您可以阅读我在数据探索jupyter 笔记本中找到的见解。
我的假设是文本中的文字可以很好地回答问题。我所需要做的就是决定哪些单词或短语足以成为答案。
我决定对文本中的每个单词进行二元分类。 spaCy 在单词标记方面确实帮了我很大的忙。
我非常需要为二元分类创建整个数据集。我从 SQuAD 数据集中每个问题的段落中提取了每个不间断的单词,并在其上添加了一些功能,例如:
标签isAnswer - 从段落中提取的单词是否与 SQuAD 问题的答案相同且位于同一位置。
其他一些功能(例如TF-IDF分数和与标题的余弦相似度)会很棒,但我没有时间添加它们。
除此之外,创建新功能取决于我们的想象力 - 也许无论是在句子的开头、中间还是结尾,有关它周围的单词的信息等等......尽管在添加更多功能之前最好有评估该功能是否有用的指标。
我发现这个问题类似于垃圾邮件过滤,其中常见的方法是将电子邮件的每个单词标记为来自垃圾邮件或不是垃圾邮件。
我使用 scikit-learn 的高斯朴素贝叶斯算法来对每个单词是否是答案进行分类。
结果出人意料地好——乍一看,算法将大部分单词分类为答案。那些没有做到的实际上是不适合的。
朴素贝叶斯的最酷之处在于您可以获得每个单词的概率。在演示中,我使用它来对单词进行排序,从最有可能的答案到最不可能的答案。
我的另一个假设是答案的句子可以很容易地变成一个问题。只需在文本中答案的位置放置一个空格,我就会得到一个“完形填空”问题(句子中缺少单词的空格)
答案:氧气
问题: _____是一种化学元素,符号为O,原子序数为8。
我认为将完形填空问题转换为更像问题的句子是不值得的,但我想这可以通过seq2seq 神经网络来完成,类似于将文本从一种语言翻译成另一种语言的方式。
这部分结果非常好。
对于每个答案,我使用单词嵌入和余弦相似度生成最相似的单词。
大多数单词都很好,很容易被误认为是正确答案。但也有一些明显不合适的。
由于我没有包含错误答案的数据集,因此我采用了更经典的方法。
我删除了与答案不同词性或相同命名实体的单词,并从问题中添加了更多上下文。
我想找到一个包含多项选择答案的数据集,看看是否可以创建一个ML 模型来生成更好的错误答案。
添加 Demo 项目后,生成的问题不太适合立即进入课堂,但也不错。
最酷的事情是该方法的简单性和模块化,您可以找到它做得不好的地方(比如它对动词进行分类)并插入修复程序。
拥有一个复杂的神经网络(就像所有有关该主题的论文一样)可能会做得更好,尤其是在我们生活的时代。但我发现这种方法的伟大之处在于,它就像软件工程师以软件工程思维进入人工智能领域并看到有意义的结果的门户。
我发现这个话题很有趣并且有很大的潜力。我可能会继续在这个领域工作。
我什至参加了数据挖掘硕士课程,并且可能会做一些类似的项目。我将在这里链接任何有用的内容。
我已经投入了更多时间来完成该项目,但我想将其更多地转变为有关进入人工智能领域的教程,同时能够使用新的自定义功能轻松扩展它。
更新 - 29.12.19:存储库变得非常流行,因此我添加了一个新笔记本( Demo.ipynb ),它组合了所有模块并为任何文本生成问题。我重新排序了其他笔记本并记录了代码(好一点)。
更新 - 09.03.21:添加了一个requirements.txt 文件,其中包含运行虚拟环境的说明,并修复了ValueError 的错误:操作数无法与形状一起广播 (230, 121) (83, )
我也开始写我的硕士论文,主题是类似的“问题生成”。
更新 - 21.10.27:我已将硕士论文的代码上传到 Question-Generation-Transformers 存储库中。我强烈建议您检查一下。
此外,使用分类器来选择候选答案的方法已被 RANLP2021 会议接受为学生论文。纸在这里。