StarCoder附录A代码注释
附录A中的这段代码是用于过滤GitHub Issues中的自动化文本和机器人评论,以确保数据集中仅保留高质量的人类讨论内容。以下是各部分的详细解释:
1. 过滤自动化邮件文本(GITHUB_EMAILS)
GITHUB_EMAILS = [
re.compile(pattern, re.DOTALL)
for pattern in [
"(.*)From:.+Reply to this email directly.+view it on GitHub(.*)\n?(.*)",
"(.*)On.+notifications@github.com.+wrote:.+Reply to this email directly.+view it on GitHub(.*)\n?(.*)",
"(.*)Signed-off-by: .+<.+>(.*?)\n?(.*)",
]
]
- 目的:匹配并移除通过GitHub邮件系统自动回复的内容。
- 关键模式:
From:...Reply to this email directly:匹配邮件中的发件人信息和回复提示。On...notifications@github.com...wrote::匹配GitHub通知邮件的格式(如“On 2023-01-01 at 12:00, user wrote...”)。Signed-off-by: ...<...>:匹配提交签名(如Git提交中的签名)。
re.DOTALL标志:使正则表达式中的.匹配换行符,确保多行内容也能被匹配。- 示例匹配内容:
From: <EMAIL> Reply to this email directly at [link] or view it on GitHub.
2. 过滤邮件日期和分隔符(GITHUB_EMAIL_DATE 和 GITHUB_EMAIL_LINEBREAK)
GITHUB_EMAIL_DATE = re.compile("\d+/\d+/\d+ \d{2}:\d{2} [AP]M.+wrote")
GITHUB_EMAIL_LINEBREAK = re.compile("_{20,}")
GITHUB_EMAIL_DATE:匹配邮件中的日期格式(如12/31/2022 05:30 PM wrote)。GITHUB_EMAIL_LINEBREAK:匹配由20个以上下划线组成的分隔线(如____________________),这些通常是邮件中的格式分隔符。
3. 移除指定机器人作者的评论(BOT_AUTHORS)
BOT_AUTHORS = [
"Apache-HBase", "AutorestCI", "CLAassistant", "cmsbuild",
"codecov-io", "codecov-commenter", "coveralls", "danger-public",
"dnfclas", "msftclas", "PyDocTeur", "SparkQA", "karma-pr-reporter",
"danger-public", "claassistantio", "probot-stale"
]
- 目的:直接排除已知的自动化工具或机器人账户(如CLA助手、测试机器人)。
- 示例:用户名为
CLAassistant的评论会被过滤。
4. 按关键词过滤机器人评论(BOT_KEYWORDS)
BOT_KEYWORDS = ["[bot]", "botmanager", "bors-", "jenkins", "k8s-", "-test-", "travis"]
- 目的:如果评论作者的用户名包含这些关键词,则认为是机器人。
- 示例:
- 用户名包含
[bot](如dependabot[bot])。 - 用户名包含
jenkins(如ci-jenkins)。
- 用户名包含
5. 按后缀过滤机器人评论(BOT_SUFFIXES)
BOT_SUFFIXES = [
"-automaton", "-automation", "-benchmark", "-build", "-deployer",
"-cloud", "bot", "-ci", "-linter", "-teamcity", "-test", "-testing",
"-Service-Account"
]
- 目的:如果评论作者的用户名以这些后缀结尾,则认为是机器人。
- 示例:
- 用户名以
-bot结尾(如github-actions-bot)。 - 用户名以
-ci结尾(如circleci)。
- 用户名以
6. 过滤逻辑总结
- 移除自动化邮件内容:
使用GITHUB_EMAILS等正则表达式过滤掉通过邮件系统自动回复的内容。 - 移除机器人评论:
- 直接匹配
BOT_AUTHORS中的用户名。 - 检查用户名是否包含
BOT_KEYWORDS或以BOT_SUFFIXES结尾。
- 直接匹配
- 保留高质量人类讨论:
过滤后的数据仅包含真实开发者之间的技术讨论,避免机器人生成的噪声(如自动测试报告、CI状态更新)。
7. 为什么需要这些过滤?
- 数据质量:机器人评论通常是模板化内容(如“Build failed”),缺乏上下文关联性。
- 隐私合规:自动化邮件可能包含敏感信息(如内部日志)。
- 模型训练效率:减少冗余数据,提升模型对真实问题(如代码修复、需求讨论)的理解能力。
示例场景
假设一个GitHub Issue评论内容如下:
On 2023-01-01 12:00 PM, notifications@github.com wrote:
This is an automated test message.
Signed-off-by: Test Bot <<EMAIL>>
- 匹配规则:
- 被
GITHUB_EMAILS的第二个模式匹配(包含notifications@github.com)。 - 被
BOT_KEYWORDS的bot关键词匹配。
- 被
- 结果:该评论会被过滤,不进入训练数据集。
通过这些规则,The Stack 数据集确保了GitHub Issues部分的数据纯净度。
这段代码是用 Python 的 re 模块(正则表达式库)定义了一个列表 GITHUB_EMAILS,其中包含三个预编译的正则表达式模式。这些模式的目的是匹配并过滤 GitHub Issues 或 Pull Requests 中的自动化邮件内容,确保数据集中仅保留人类生成的高质量技术讨论。以下是逐层解析:
1. 代码结构
GITHUB_EMAILS = [
re.compile(pattern, re.DOTALL) # 编译正则表达式模式
for pattern in [ # 遍历三个模式字符串
# 第一个模式
"(.*)From:.+Reply to this email directly.+view it on GitHub(.*)\n?(.*)",
# 第二个模式
"(.*)On.+notifications@github.com.+wrote:.+Reply to this email directly.+view it on GitHub(.*)\n?(.*)",
# 第三个模式
"(.*)Signed-off-by: .+<.+>(.*?)\n?(.*)",
]
]
re.compile(pattern, re.DOTALL):
将字符串模式编译为正则表达式对象,re.DOTALL标志使.匹配包括换行符在内的所有字符。- 列表推导式:
对三个模式字符串分别编译,最终生成一个包含三个正则表达式对象的列表。
2. 每个模式的具体作用
(1) 第一个模式:匹配邮件发件人信息
"(.*)From:.+Reply to this email directly.+view it on GitHub(.*)\n?(.*)"
- 匹配内容:
GitHub 邮件系统自动回复的发件人信息和回复提示,例如:From: <EMAIL> Reply to this email directly at [link] or view it on GitHub. - 关键部分:
From:.+:匹配From:后的任意内容。Reply to this email directly:匹配固定的邮件回复提示。view it on GitHub:匹配 GitHub 链接提示。\n?(.*):匹配可选的换行符和后续内容(如果存在)。
(2) 第二个模式:匹配邮件通知格式
"(.*)On.+notifications@github.com.+wrote:.+Reply to this email directly.+view it on GitHub(.*)\n?(.*)"
- 匹配内容:
GitHub 通知邮件的格式(如“On 2023-01-01 at 12:00, user wrote...”),例如:On 2023-01-01 12:00 PM, notifications@github.com wrote: This is an automated test message. Reply to this email directly at [link] or view it on GitHub. - 关键部分:
On.+notifications@github.com:匹配日期和 GitHub 通知邮箱。wrote:.+:匹配“wrote:”后的任意内容。
(3) 第三个模式:匹配 Git 提交签名
"(.*)Signed-off-by: .+<.+>(.*?)\n?(.*)"
- 匹配内容:
Git 提交中的签名(如开发者签署的邮箱),例如:Signed-off-by: <NAME> <<EMAIL>> - 关键部分:
Signed-off-by: .+<.+>:匹配Signed-off-by:后的姓名和邮箱。(.*?)\n?(.*):匹配可选的换行符和后续内容(非贪婪匹配)。
3. 使用场景
这段代码用于 过滤 GitHub Issues 数据中的自动化邮件内容,属于 The Stack 数据集预处理的一部分。具体流程如下:
- 数据来源:GitHub Issues 和 Pull Requests 的讨论内容(包含邮件回复)。
- 过滤目标:移除机器人或自动化工具生成的内容(如 CI/CD 测试报告、邮件通知)。
- 实现方式:
- 遍历每条评论,使用
GITHUB_EMAILS中的正则表达式匹配自动化邮件内容。 - 若匹配成功,则过滤该评论(避免进入训练数据集)。
- 遍历每条评论,使用
4. 示例说明
假设一条 GitHub Issue 评论内容如下:
From: <EMAIL>
Reply to this email directly at [link] or view it on GitHub.
This is an automated test message.
Signed-off-by: Test Bot <<EMAIL>>
- 匹配结果:
- 第一个模式匹配
From: ...行。 - 第二个模式匹配
On ... notifications@github.com ...行。 - 第三个模式匹配
Signed-off-by: ...行。
- 第一个模式匹配
- 过滤逻辑:
该评论包含自动化邮件内容,会被标记为无效数据并移除。
5. 为什么需要这些过滤?
- 数据质量:机器人评论通常是模板化内容(如“Build failed”),缺乏上下文关联性。
- 隐私合规:自动化邮件可能包含敏感信息(如内部日志)。
- 模型训练效率:减少冗余数据,提升模型对真实问题(如代码修复、需求讨论)的理解能力。
总结
这段代码通过三个正则表达式模式,精准匹配 GitHub Issues 中的自动化邮件内容,并将其过滤,确保训练数据集仅包含高质量的人类技术讨论。这种预处理步骤对代码生成模型(如 StarCoder)的训练至关重要,能够显著提升模型生成代码的实用性和关联性。

浙公网安备 33010602011771号