最近,国外小哥KartikGodawat和DeepakRawat开发了一个Jupyter插件Text2Code,可以将自然语言查询转化为相关的Python数据分析代码。如果你能创建一个桌面软件,将自然语言直接翻译成相关的Python数据分析代码,那工作起来会更容易。这不,有两个“好东西”的程序员耐不住寂寞做出了这个工具。受GPT-3启发,自然语言直接转化为代码2020年6月,OpenAI推出了GPT-3,它不仅有很多与未来NLP相关的功能,还可以生成React代码和shell命令。两人从中得到启发。他们意识到,在做数据分析时,我们经常会忘记一些不常用的pandas命令或语法,需要从StackOverflow中搜索、复制代码,然后需要相应地修改变量名和列名。最初他们试图将这个问题作为聊天机器人来解决,并尝试使用Rasa,但由于缺乏合适的训练数据而中止。他们决定开发一种监督学习模型,可以吃掉相应的自然语言和代码语料库,然后进行训练。完整的管道包括以下步骤:生成训练数据来模拟终端用户想要查询系统的内容,我们开始尝试用英语描述一些命令的格式。例如:显示一个线图,显示y轴上的$colname和x轴上的$colname来自$varname然后我们通过用一个非常简单的生成器替换$colname和$varname来生成数据以获得变量。意图匹配需要在生成数据后针对特定意图映射到一个唯一的“intentid”,并使用通用的sentenceencoder获取用户query的embedding,然后使用我们预定义的intentquery(生成的数据)来得到余弦距离。《UniversalSentenceEncoder》——UniversalSentenceEncoder类似于word2vec,会生成对应的embeddings。唯一的区别是这里的嵌入是针对句子而不是单词。命名实体识别生成的相同数据可用于训练自定义实体识别模型,该模型检测列、变量和库的名称。为此,作者也研究了HuggingFace模型,但最终决定使用Spacy来训练模型,主要是因为HuggingFace模型是基于Transformer的模型,与Spacy相比有点过于复杂和笨重。填充模板一旦实体被正确识别并且意图被正确匹配,填充模板就变得非常容易。例如,查询“show5rowsfromdf”将生成两个实体:一个变量和一个值。这个模板代码写起来非常简单。与Jupyter集成是最复杂的步骤,因为为Jupyter编写如此复杂的扩展有点棘手,而且几乎没有文档或示例参考。经过一些实验并参考了现有的扩展,他们最终将所有内容包装到一个可以通过pip直接安装的Python包中。不能直接使用单个Python包,因此他们创建了一个前端和一个在jupyternotebook启动时加载的服务器扩展。前端向服务器发送生成的模板代码的查询,然后将其插入到笔记本的相应单元格中并执行。Text2Code的demo模型也会失败,但是数据分析师真的省事和很多机器学习模型一样,有时候意图匹配和命名实体识别会表现很差,即使意图对人类来说很简单。有时无法识别意图,无法生成正确的代码。笔者还考虑使用以下方法进一步提升插件的效果。收集/生成高质量的英语训练数据,考虑从quroa和StackOverflow爬取更多好评答案,尝试用不同的方式描述相同的内容,增强数据;收集真实世界的变量名称和库名称而不是随机生成,尝试使用基于Transformer的模型进行命名实体识别。如果这个模型训练得足够好,可以为数据分析师省去很多麻烦。项目开源地址:https://github.com/deepklarity/jupyter-text2code
