Abstract & Introduction & Related Work
-
研究任务
识别代码token和软件相关的实体 -
面临挑战
- 这些命名的实体往往是模糊的,并且对所附的代码片段有隐含的依赖性
-
创新思路
- 我们提出了一个命名实体识别器(NER),它利用多层次的注意力网络将文本上下文与代码片段知识结合起来
-
实验结论
SoftNER比BiLSTM-CRF高了9.73的F1分数
Annotated StackOverflow Corpus
对于每个问题,对四个答案进行了标注,包括被接受的答案、投票最多的答案,以及两个随机选择的答案(如果存在的话)
Annotation Schema
定义二十种细粒度实体
StackOverflow/GitHub Tokenization
提出了一种叫 SOTOKENIZER 的新分词器,专门为计算机编程领域社区定制,我们发现,标记化并不简单,因为许多与代码相关的标记被现有的网络文本标记器错误地分割了
Named Entity Recognition
模型总览图
- embedding抽取层
- 多级注意力层
- BiLSTM-CRF
Input Embeddings
抽取ELMo representation 和两个特定领域的 embedding
Code Recognizer,表示一个词是否可以成为一个代码实体的一部分,而不考虑上下文
Entity Segmenter,预测一个词是否是给定句子中任何命名实体的一部分
In-domain Word Embeddings
软件工程领域的文本包含编程语言标记,如变量名称或代码段,并与自然语言词汇穿插。这使得在一般新闻网文本上预训练的输入表示不适合软件领域。因此,我们在StackOverflow的10年档案中对不同的域内词嵌入进行了预训练,包括ELMo、BERT和GloVe向量的23亿个标记
Context-independent Code Recognition
输入的特征包括两个语言模型(LMs)的unigram word 和 6-gram char 概率,这两个语言模型是在Gigaword语料库和StackOverflow 10年档案中的所有代码片段上分别训练的
我们还使用这些代码片段预训练了FastText(Joulin等人,2016)的词嵌入,其中一个词向量被表示为其字符n-grams的总和。我们首先使用高斯分档法(Maddela和Xu,2018)将每个n-gram概率转化为一个k维向量,这已被证明可以提高使用数字特征的神经模型的性能(Sil等人,2017;Liu等人,2016;Maddela和Xu,2018)。然后,我们将矢量特征送入线性层,将输出与FastText字符级嵌入相连接,并通过另一个具有sigmoid激活的隐藏层。如果输出概率大于0.5,我们就预测该标记是一个代码实体
Entity Segmentation
将ELMo embedding,和两个手工特征,word frequency 和 code markdown concat起来作为输入,丢到BiLSTM-CRF模型中判断一个token是否是一个实体mention
Word Frequency
代表训练集中的单词出现次数。由于许多代码token是由个人用户定义的,它们的出现频率比正常的英语单词要低得多。事实上,在我们的语料库中,代码和非代码token的平均频率分别为1.47和7.41。此外,既可以是代码也可以是非代码实体的模糊标记的平均频率要高得多,为92.57。为了利用这一观察结果,我们将词频作为一个特征,通过高斯分档将标量值转换为一个k维的向量
Code Markdown
表示给定的token是否出现在Stack Overflow的 <code>
标签里面 值得注意的是,一个<code>
标签是有噪音的,因为用户并不总是在hcodei标签中包含内联代码,或使用该标签来突出非代码文本。然而,我们发现将markdown信息作为一个特征包括在内是很有帮助的,因为它提高了我们分割模型的性能
Multi-Level Attention
对于每一个word,使用ELMo embedding, Code Recognizer, Entity Segmenter作为原始输入,丢到BiGRU里面,得到对应表示,然后通过一个线性层,接上tanh激活函数,引入一个 embedding级别的上下文向量, u e u_e ue,在训练过程中学习,然后通过一个softmax函数得到对应的分数 a i t a_{it} ait
最终每一个word的embedding是
word level embedding跟embedding level attention一样,也引入了一个可训练的向量
u
w
u_w
uw
最后得到
w
o
r
d
i
=
a
i
h
i
word_i = a_ih_i
wordi=aihi,随后丢到BiLSTM-CRF层中做预测
Evaluation
Conclusion
我们开发了一个新的NER语料库,包括来自StackOverflow的15,372个句子和来自GitHub的6,510个句子,并注有20个细粒度的命名实体
我们证明了这个新的语料库是一个理想的上下文词表征的基准数据集,因为有许多具有挑战性的歧义,往往需要长距离的上下文来解决。我们提出了一个新的基于注意力的模型,名为SoftNER,它在这个数据集上的表现超过了最先进的NER模型
此外,我们研究了代码识别这一重要的子任务。我们的新型代码识别模型在基于字符的ELMo之外捕获了额外的拼写信息,并持续地提高了NER模型的性能。我们相信我们的语料库和基于StackOverflow的命名实体标记器将有助于各种语言和代码任务,如代码检索、软件知识库提取和自动答疑等
Remark
我觉得主要贡献是搞了个新的数据集,模型的话算是中规中矩,搞好数据集也能发顶会!