许柏炎,蔡瑞初,梁智豪
(广东工业大学计算机学院,广州 510006)
目前,代码托管平台Github 的提交量已达10 亿,涉及337 种编程语言,但是其中大量代码缺乏可读的自然语言注释[1]。代码注释是软件开发的重要环节,可大幅提高代码的可读性,但是其过程十分耗时[2]。随着深度学习技术的应用,自然语言生成任务得到快速发展,其中典型代表有机器翻译[3-4]和文本摘要生成[5-7]等任务。代码自动注释是自然语言生成中最具挑战性的任务之一,目标是基于输入代码生成相应的可理解的自然语言注释或描述。
早期的研究人员将代码注释生成建模为源代码序列到自然语言注释序列的翻译任务,但是不足之处在于其仅提取源代码中的文本信息而忽略了结构信息。近年来,学者们考虑引入源代码的结构化输入,如抽象语法树(Abstract Syntax Tree,AST),并采用机器学习的方法或模型来提取源代码中结构信息的语义表达。然而,这些研究工作未充分考虑如何从结构化数据输入中复制提取关键信息。代码注释生成的目标注释中通常会出现目标词典中不存在的单词(Out Of Vocabulary,OOV),如数值型、字符型等变量单词,从而导致生成的自然语言注释输出不完整。为解决该问题,研究人员在代码注释生成模型中引入指针网络[8],指针网络通过在单位时间步输出指向输入序列的某一个单词,从而形成一种复制机制。但是,经典的指针网络只支持代码的序列化输入,不支持代码的结构化输入,从而难以利用源代码的结构化信息。……