🚀 CodeT5-base代碼摘要生成模型
CodeT5-base是一個用於代碼摘要生成的模型。它基於CodeT5-base,在CodeSearchNet數據集上進行了多語言(Ruby、JavaScript、Go、Python、Java、PHP)的微調訓練。該模型由Yue Wang、Weishi Wang、Shafiq Joty和Steven C.H. Hoi等人在2021年的EMNLP會議論文CodeT5: Identifier-aware Unified Pre-trained Encoder-Decoder Models for Code Understanding and Generation中提出。更多詳情請查看此倉庫。
🚀 快速開始
以下是使用該模型的示例代碼:
from transformers import RobertaTokenizer, T5ForConditionalGeneration
if __name__ == '__main__':
tokenizer = RobertaTokenizer.from_pretrained('Salesforce/codet5-base-multi-sum')
model = T5ForConditionalGeneration.from_pretrained('Salesforce/codet5-base-multi-sum')
text = """def svg_to_image(string, size=None):
if isinstance(string, unicode):
string = string.encode('utf-8')
renderer = QtSvg.QSvgRenderer(QtCore.QByteArray(string))
if not renderer.isValid():
raise ValueError('Invalid SVG data.')
if size is None:
size = renderer.defaultSize()
image = QtGui.QImage(size, QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(image)
renderer.render(painter)
return image"""
input_ids = tokenizer(text, return_tensors="pt").input_ids
generated_ids = model.generate(input_ids, max_length=20)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
📦 安裝指南
文檔未提及安裝步驟,如需使用該模型,請參考transformers庫的安裝說明。
💻 使用示例
基礎用法
from transformers import RobertaTokenizer, T5ForConditionalGeneration
if __name__ == '__main__':
tokenizer = RobertaTokenizer.from_pretrained('Salesforce/codet5-base-multi-sum')
model = T5ForConditionalGeneration.from_pretrained('Salesforce/codet5-base-multi-sum')
text = """def svg_to_image(string, size=None):
if isinstance(string, unicode):
string = string.encode('utf-8')
renderer = QtSvg.QSvgRenderer(QtCore.QByteArray(string))
if not renderer.isValid():
raise ValueError('Invalid SVG data.')
if size is None:
size = renderer.defaultSize()
image = QtGui.QImage(size, QtGui.QImage.Format_ARGB32)
painter = QtGui.QPainter(image)
renderer.render(painter)
return image"""
input_ids = tokenizer(text, return_tensors="pt").input_ids
generated_ids = model.generate(input_ids, max_length=20)
print(tokenizer.decode(generated_ids[0], skip_special_tokens=True))
📚 詳細文檔
微調數據
我們使用了來自CodeXGLUE基準測試的過濾版本的CodeSearchNet數據[Husain et al., 2019]進行代碼摘要生成的微調。數據使用我們預訓練的特定於代碼的BPE(字節對編碼)分詞器進行分詞。可以使用codet5-base的詞彙文件,通過RobertaTokenizer
為模型準備文本(或代碼)。
數據統計
編程語言 |
訓練集 |
驗證集 |
測試集 |
Python |
251,820 |
13,914 |
14,918 |
PHP |
241,241 |
12,982 |
14,014 |
Go |
167,288 |
7,325 |
8,122 |
Java |
164,923 |
5,183 |
10,955 |
JavaScript |
58,025 |
3,885 |
3,291 |
Ruby |
24,927 |
1,400 |
1,261 |
訓練過程
我們在多任務學習設置下,對這六種編程語言(Ruby、JavaScript、Go、Python、Java、PHP)進行了codet5-base
的微調。我們採用了平衡採樣的方法,以避免偏向高資源任務。更多詳細信息請參考論文。
評估結果
與論文中允許為不同編程語言(PL)選擇不同的最佳檢查點不同,這裡我們對所有PL使用一個檢查點。此外,我們在訓練和推理中移除了指定PL的任務控制前綴。測試集上的結果如下:
模型 |
Ruby |
JavaScript |
Go |
Python |
Java |
PHP |
總體 |
Seq2Seq |
9.64 |
10.21 |
13.98 |
15.93 |
15.09 |
21.08 |
14.32 |
Transformer |
11.18 |
11.59 |
16.38 |
15.81 |
16.26 |
22.12 |
15.56 |
RoBERTa |
11.17 |
11.90 |
17.72 |
18.14 |
16.47 |
24.02 |
16.57 |
CodeBERT |
12.16 |
14.90 |
18.07 |
19.06 |
17.65 |
25.16 |
17.83 |
PLBART |
14.11 |
15.56 |
18.91 |
19.30 |
18.45 |
23.58 |
18.32 |
CodeT5-small |
14.87 |
15.32 |
19.25 |
20.04 |
19.92 |
25.46 |
19.14 |
CodeT5-base |
15.24 |
16.16 |
19.56 |
20.01 |
20.31 |
26.03 |
19.55 |
CodeT5-base-multi-sum |
15.24 |
16.18 |
19.95 |
20.42 |
20.26 |
26.10 |
19.69 |
📄 許可證
本項目採用BSD 3-Clause許可證。
🔗 引用
@inproceedings{
wang2021codet5,
title={CodeT5: Identifier-aware Unified Pre-trained Encoder-Decoder Models for Code Understanding and Generation},
author={Yue Wang, Weishi Wang, Shafiq Joty, Steven C.H. Hoi},
booktitle={Proceedings of the 2021 Conference on Empirical Methods in Natural Language Processing, EMNLP 2021},
year={2021},
}