你是一个成熟的AI了,应该自己学会补全Python代码了

时间:2019-07-14 来源:www.olivebali.com

新澳博官网

机器之心整理

参与:思源,一鸣

在项目开发中,优秀的代码自动补全工具可以提升工作效率。然而,近来的IDE基本都使用搜索方法进行补全,在一些场景下效果不佳。近日,有开源项目用深度学习模型进行代码补全,显示出非常有潜力的效果。

f3ae932fa70e45ae9307e5e23cfc5090

近日,Reddit上的一篇帖子引起了网友的热议。帖子作者「mlvpj」称:

「我们使用深度学习完成了一个简单的项目,可以自动进行Python代码补全。」

根据介绍,该项目基于LSTM模型,训练后,负责对代码的缺失部分进行补全。评价模型的方法是判断节省了多少的按键信息即模型给出长度为L的代码建议,如果和真实的代码匹配,则节省L - 1个键入操作。实验结果说明,大约有30%-50%的键入成本可以节省下来。

作者在帖子中表示,他们接下来会尝试不同的架构,并提高推断的表现。而现在的模型推断很慢,不能实际使用。作者已在GitHub开源了项目代码:

链接地址:

和IDE的自动补全有什么区别

该项目对Python代码的自动补全与传统IDE(如PyCharm)等不同.IDE补全基于检索方法,需要从已有代码中进行搜索。

XX以PyCharm中的Basic Completion方法为例。基本完成有助于补充可见区域的类,方法和关键字代码。在使用时,PyCharm分析完成使用情况并提供当前位置的可能选择。如果您正在完成空格,参数或变量声明,PyCharm会根据类别提供可能的名称列表。

f3ef2f1789654654b9d04d5534796d20

当定义的类,函数,模块和变量出现时,将启动基本完成。

此外,PyCharm还提供其他完成功能,如智能完成,但基本上都需要搜索现有文本,并根据位置和类型判断完成方法。这些方法都没有配置机器学习模型。

Pycharm的自动完成介绍:

深入学习如?蚊植谷笔У腡F代码

最常见的PyCharm自动完成可以节省大量工作,但它需要IDE来检索您的代码文件或库,并且完成提供了多种可能的选项。但是,在该项目实验的工具中,LSTM将根据上下文语义确定最可能调用的函数,因此可以节省更多成本。作者说,如果你使用捆绑搜索,你可以一次预测超过10个字符,但这对于实际使用来说效率有点低。

在训练深度补充模型之前,我们需要首先构建训练集。开发人员将在清除注释,注释和空行后构建更清晰的Python代码。然后,该模型对这些数据进行训练和预测。在数据预处理中,开发人员发现通过对Python代码进行标记,模型的性能优于BPE编码的字符级预测。作者提供了一个简单的预训练模型,该模型在整个TensorFlow项目的模型代码中进行了训练。

下图是作者验证测试的验证样本。绿色字符表示自动完成的起始位置,用户需要按Tab键选择开始完成。绿色和突出显示的灰色字符是自动完成的结果。

7a405f383a694756a5d9a882dc55154a

如上所示,验证了样品中的自动完成效果。与代码生成类似,它看起来像一个粗略的外观,但实际上有很多不合理的东西。但有趣的是,自动完成中的所有字符串只有一个占位符操作,这是一种非常合理的方法。

样本中自动完成的开始和结束位置是随机的,这意味着代码可能完成“tensorfl”并且不会完成完整标识符“tensorflow”。这在实际场景中非常有限,因此作者通过限制生成结束来终止令牌来解决问题。目前自动完成可以完成各种运算符,当我们增加包搜索的长度时,它将更长时间地完成代码。

整个模型的主体是LSTM,它在TensorFlow模型代码库中训练后捕获非常丰富的TensorFlow API。自动完成模型的主要代码如下所示,基本上是一个简单的LSTM:

deb9782a40af4b2d906345995dd0a332

用户评论

该项目开源后,一些网友质疑了作者:

c6c0145a914847839ba64252f254f278

“我们已经有很多很好的自动完成工具,比如风筝(可以在IDE上使用的插件),为什么还要使用机器学习模型?”

在讨论中,有人建议一些不道德的自动完成工具会悄悄地将代码上传到他们的服务器(自我训练深度学习模型没有这样的问题)。

还有人建议不必使用LSTM模型,隐马尔可夫模型适用于处理序列数据。

9471f567cb3043528da8cc383a5c9ca4

此外,一些网友建议使用CuDNN来加速LSTM的推理过程。这极大地提高了推理速度,并集成到IDE中。

机器核心的读者如何考虑使用深度学习来自动完成代码?欢迎留言。