附录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)的训练至关重要,能够显著提升模型生成代码的实用性和关联性。