解题思路
本题按顺序模拟五个清洗步骤即可。先把每篇文档中的连续空白合并成一个空格,并去掉首尾空格,然后判断长度是否合法;接着扫描规范化后的字符串,把连续的字母数字字符提取成小写单词;之后用哈希集合判断是否精确命中黑名单;再用哈希表统计每个连续三个单词组成的 3-gram,若某个 3-gram 出现次数超过 M,则丢弃;最后把整篇文档的单词序列作为语义指纹,放入哈希集合中去重,只保留第一次出现的文档。最终输出的是规范化后的字符串。
复杂度分析
设所有文档总长度为 S,提取出的单词总数为 W。
每篇文档只需要进行常数次线性扫描,3-gram 统计和去重也都是哈希操作,因此总时间复杂度为 O(S + W),可视为 O(S)。
P4870.第3题-大模型预训练语料清洗
题目内容
为了防止大语言模型(LLM)在生成时出现“复读机”现象,并确保训练语料的语义纯净,你需要模拟数据清洗引擎,模型给定 N 篇待清洗文档,你需要按顺序执行以下五大清洗规则,只有全部通过的文档,才会被保留并进入最终的训练集。
清洗规则:
- 空格规范化:首先对文档中所有连续的空白字符(空格、制表符等)合并为一个空格,并去除首尾空格。规范化后的字符串总长度必须在 [L,R] 的闭区间内,如果不满足,直接丢弃该文档。
注意:如果文档被保留,最终输出的必须是这个“规范化后”的字符串。
- 语义单词提取:将规范化后的文档按字母数字字符(即除了 a−z, A−Z, 0−9 以外的所有字符)进行分割,提取出所有的有效“单词”,并全部转化为小写。例如:"He is AI Spammer." 提取出的单词序列为 ["he", "is", "a", "spammer"]。
- 独立黑名单拦截:给定 K 个黑名单词汇。如果在第 2 步提取出的单词序列中,精确匹配到了任何一个黑名单词汇(不区分大小写),则丢弃该文档。
注意:必须是独立单词匹配,不能是子串匹配。例如黑名单中有 spam,但文档中的 spammer 可以是合法的。
- 3-gram复读惩罚:在提取出的单词序列中,任何连续的三个单词构成一个 3−gram。如果该文档中存在任何一个 3−gram 出现次数严格大于 M 次,则判定为复读机文本,直接丢弃。
例如:M=1 时,序列 ["a", "b", "c", "a", "b", "c"] 中,("a","b","c") 出现了 2 次,则应该丢弃。
- 规范化语义去重:如果两篇文档提取出的单词序列完全一致(即忽略了标点符号和大小写的差异),判定为语义重复,仅保留按输入顺序第一次出现的那篇文档。
输入描述
第 1 行包含 5 个整数:N,L,R,M,K,分别代表文档数、最小长度、最大长度、3−gram 最大允许出现次数、黑名单词汇数。
第 2 行包含 K 个由空格分隔的黑名单词汇(保证全为小写),如果 K=0,则跳过此行,直接进入到文档内容。
接下来的 N 行,每行包含一篇原始文档(可能包含各种标点、标点和多余空格)。
输出描述
按顺序输出所有通过清洗的高质量文档,每篇文档占一行。
样例1
输入
3 10 100 2 1
spam
Buy cheap SPAM!!!
He is a spammer
He is, A! Spammer.
输出
He is a spammer
说明
第 1 行表示:文档数为 3,最小长度为 10,最大长度为 100,3−gram 最大允许出现次数为 2,黑名单词汇数为 1。
第 2 行表示黑名单词汇为 spam。
文档 1:规范化后为 Buy cheap SPAM!!!,提取单词为 ["buy", "cheap", "spam"],精确命中了黑名单 spam,丢弃。
文档 2:规范化后为 He is a spammer.,单词为 ["he", "is", "a", "spammer"],spammer 不触发 spam 拦截,保留。
文档 3:规范化后为 He is, A! Spammer.,单词为 ["he", "is", "a", "spammer"],单词序列与文档 2 完全相同,触发去重,丢弃。
样例2
输入
2 10 200 2 0
a b c a b c a b c
a b c a b c
输出
a b c a b c
说明
第 1 行表示:文档数为 2,最小长度为 10,最大长度为 100,3−gram 最大允许出现次数为 2,黑名单词汇数为 0
黑名单词汇数为 0,所以从第 2 行开始为文档内容
文档 1:3−gram ["a", "b", "c"] 出现了 3 次,> 阈值 2 次,丢弃