{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/skcoder-a-sketch-based-approach-for-automatic","title":"SkCoder: A Sketch-based Approach for Automatic Code Generation","arxiv_id":"2302.06144","date":"2023-02-13","proceeding":null,"authors":["Jia Li","Yongmin Li","Ge Li","Zhi Jin","Yiyang Hao","Xing Hu"],"abstract":"Recently, deep learning techniques have shown great success in automatic code generation. Inspired by the code reuse, some researchers propose copy-based approaches that can copy the content from similar code snippets to obtain better performance. Practically, human developers recognize the content in the similar code that is relevant to their needs, which can be viewed as a code sketch. The sketch is further edited to the desired code. However, existing copy-based approaches ignore the code sketches and tend to repeat the similar code without necessary modifications, which leads to generating wrong results. In this paper, we propose a sketch-based code generation approach named SkCoder to mimic developers' code reuse behavior. Given a natural language requirement, SkCoder retrieves a similar code snippet, extracts relevant parts as a code sketch, and edits the sketch into the desired code. Our motivations are that the extracted sketch provides a well-formed pattern for telling models \"how to write\". The post-editing further adds requirement-specific details to the sketch and outputs the complete code. We conduct experiments on two public datasets and a new dataset collected by this work. We compare our approach to 20 baselines using 5 widely used metrics. Experimental results show that (1) SkCoder can generate more correct programs, and outperforms the state-of-the-art - CodeT5-base by 30.30%, 35.39%, and 29.62% on three datasets. (2) Our approach is effective to multiple code generation models and improves them by up to 120.1% in Pass@1. (3) We investigate three plausible code sketches and discuss the importance of sketches. (4) We manually evaluate the generated code and prove the superiority of our SkCoder in three aspects.","url_abs":"https://arxiv.org/abs/2302.06144v4","url_pdf":"https://arxiv.org/pdf/2302.06144v4.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"links_only","authors_date_abstract":"arXiv metadata, CC0 1.0 (https://info.arxiv.org/help/license), from the Kaggle arXiv metadata snapshot of 2026-09-12"},"code_links":[{"paper_slug":"skcoder-a-sketch-based-approach-for-automatic","repo_url":"https://github.com/lj2lijia/skcoder","is_official":1,"mentioned_in_paper":1,"mentioned_in_github":1,"framework":"pytorch","reach":null}],"tasks":[],"methods":[],"datasets_introduced":[],"methods_introduced":[],"results":[],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2302.06144","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2302.06144"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/lj2lijia/skcoder","reach":null}],"summary":{"ran_honours":3,"ran_draft_wrong":1,"unverified":1},"by_repo_kind":{"official":{"samples":5,"ran":4,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":5,"samples":[{"code_sha256_prefix":"e32a90fcc9a0b683","entry":"common_tokens","repo":"lj2lijia/skcoder","repo_kind":"official","path":"sketcher/preprocess.py","file_url":"https://github.com/lj2lijia/skcoder/blob/HEAD/sketcher/preprocess.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"e32a90fcc9a0b683"}},{"code_sha256_prefix":"cafcfcda93eeda0b","entry":"get_args_by_task_model","repo":"lj2lijia/skcoder","repo_kind":"official","path":"editor/sh/run_exp.py","file_url":"https://github.com/lj2lijia/skcoder/blob/HEAD/editor/sh/run_exp.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"cafcfcda93eeda0b"}},{"code_sha256_prefix":"81a7ca4a470ce7c9","entry":"get_cmd","repo":"lj2lijia/skcoder","repo_kind":"official","path":"editor/sh/run_exp.py","file_url":"https://github.com/lj2lijia/skcoder/blob/HEAD/editor/sh/run_exp.py","link_basis":"first_harvest_node","language":"python","status":"ran_draft_wrong","verification_level":1,"contract_check":"OUTPUT_MISDECLARED","metamorphic_tier":"deterministic","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"81a7ca4a470ce7c9"}},{"code_sha256_prefix":"6b3281c277e7c8ba","entry":"longest_common_subsequence","repo":"lj2lijia/skcoder","repo_kind":"official","path":"sketcher/preprocess.py","file_url":"https://github.com/lj2lijia/skcoder/blob/HEAD/sketcher/preprocess.py","link_basis":"first_harvest_node","language":"python","status":"ran_honours","verification_level":1,"contract_check":"HONOURS","metamorphic_tier":"well_formed","behaviour_fingerprint":true,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"6b3281c277e7c8ba"}},{"code_sha256_prefix":"a8126a3c1e97ffd2","entry":"process_line","repo":"lj2lijia/skcoder","repo_kind":"official","path":"sketcher/preprocess.py","file_url":"https://github.com/lj2lijia/skcoder/blob/HEAD/sketcher/preprocess.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"NONE","inline_ok":false,"mcp_get_code":{"code_sha256":"a8126a3c1e97ffd2"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}