BigQuery数据清洗:如何统一字段字体解决同值异字识别问题
BigQuery同语义异字体字段归一化清洗方法
这类花体、粗体、哥特体等特殊样式的字符本质是Unicode里分配在数学字母数字符号、字母式符号区段的装饰性变体,每个变体和对应常规拉丁字符语义完全一致,但因为编码值不同,BigQuery默认会判定为不同值,可通过以下方法完成统一清洗:
方法1:原生SQL自动归一化(优先推荐,无额外依赖)
直接用BigQuery内置的Unicode归一化函数搭配正则过滤即可实现,核心逻辑是通过兼容性分解把装饰字符拆成基础字符+格式标记,再剔除无用的格式标记,代码示例:
-- 字段清洗示例 WITH test_data AS ( SELECT 'ℂ𝕒𝕣𝕥𝕒𝕘𝕖𝕟𝕒' AS city_name UNION ALL SELECT 'Cartagena' AS city_name UNION ALL SELECT '𝐂𝐚𝐫𝐭𝐚𝐠𝐞𝐧𝐚' AS city_name -- 另一种粗体装饰字 ) SELECT city_name AS original_val, REGEXP_REPLACE( NORMALIZE(city_name, NFKD), r'[^\p{Latin}\p{Number}\p{P}\s]', '' ) AS normalized_val FROM test_data
参数说明:
NORMALIZE(字段, NFKD):使用Unicode NFKD兼容性分解模式,会自动把所有带字体装饰的变体字符拆解为对应的常规基础字符+字体格式标记,比如花体𝕒会被拆解为常规字符a+花体格式标记- 后续正则替换会剔除拆解后残留的格式标记,仅保留拉丁字母、数字、标点、空格,最终得到统一的常规格式文本
注意:该方案不会修改字符本身的语义,仅剥离字体装饰属性,带重音的非英语拉丁字符(如西语ñ、法语é)都会被完整保留,不会出现清洗后语义丢失的问题。
方法2:映射表兜底(适配稀有特殊字体场景)
如果存在极个别未纳入Unicode兼容性映射的稀有装饰字体,可先扫描全表提取特殊字符生成映射表做兜底:
- 第一步:扫描全表提取所有超出基础ASCII范围的特殊字符,统计出现频次
SELECT DISTINCT CHAR(code_point) AS special_char, COUNT(1) AS appear_times FROM `你的目标表`, UNNEST(TO_CODE_POINTS(待清洗字段)) AS code_point WHERE code_point > 127 GROUP BY 1 ORDER BY 2 DESC
- 第二步:对提取出的装饰字符手动匹配对应的常规字符,生成固定映射关系,清洗时先用方法1做自动归一化,剩余未匹配的特殊字符通过
TRANSLATE函数批量替换即可。
效果校验
清洗完成后可通过分组统计验证结果,原本被识别为多个不同值的同语义文本会被合并为同一分组,统计结果不再出现拆分误差。
内容的提问来源于stack exchange,提问作者IngButters
相关产品推荐
相关产品推荐

