Power Query中基于模糊分组实现相似文本值重命名(无需参考列)
在Power Query中无参考表实现相似文本标准化
完全可以做到,不需要额外的参考表格。核心思路是基于文本包含关系和自动识别基准词来完成相似文本的标准化映射,以下是具体实现方案:
实现步骤(以列名为「原始名称」为例)
1. 预处理原始文本
先清理文本中的干扰字符(比如括号、数字后缀、特殊符号),统一格式,减少匹配误差:
// 添加预处理列:转小写、移除特殊符号和数字 = Table.AddColumn(源, "预处理文本", each Text.Lower( Text.Remove([原始名称], {"(", ")", "[", "]", "-", "_", "0".."9"}) ) )
2. 自动生成基准词列表
从预处理后的文本中提取唯一值,再筛选出最通用的候选基准词(这里优先取最短文本,因为简化版本通常更简洁):
// 提取唯一预处理文本 唯一预处理文本 = List.Distinct(表[预处理文本]) // 按文本长度升序排序,优先选择短文本作为基准 基准词列表 = List.Sort(唯一预处理文本, (x) => Text.Length(x))
3. 建立相似文本映射
回到原始表,添加自定义列,将每个原始文本匹配到对应的基准词:
= Table.AddColumn(原始表, "标准化名称", each let 当前预处理文本 = [预处理文本], // 筛选出被当前文本包含的基准词(确保基准词是当前文本的子集) 匹配候选 = List.Select(基准词列表, (x) => Text.Contains(当前预处理文本, x)), // 取最长的匹配项(避免短词误匹配,比如"app"匹配到"apple"而非"app") 最终基准词 = if List.Count(匹配候选) > 0 then List.Max(匹配候选, (x) => Text.Length(x)) else [原始名称] in // 转回首字母大写格式(按需调整) Text.Proper(最终基准词) )
4. 优化:基于词频选择基准词
如果想进一步提升精准度,可以统计每个候选词的出现次数,取频率最高的作为基准:
// 统计每个预处理文本的出现次数 词频统计 = Table.Group(预处理后的表, {"预处理文本"}, {{"出现次数", each Table.RowCount(_), Int64.Type}}) // 按出现次数降序排序,优先选择高频词作为基准 基准词列表 = List.Sort(词频统计[预处理文本], (a,b) => let a_count = Table.SelectRows(词频统计, (x) => x[预处理文本] = a)[出现次数]{0}, b_count = Table.SelectRows(词频统计, (x) => x[预处理文本] = b)[出现次数]{0} in b_count - a_count )
示例效果
假设原始数据如下:
| 原始名称 |
|---|
| Apple Pro Max |
| Apple Air |
| Apple |
| Banana 2024 |
| Banana Premium |
处理后得到的「标准化名称」列:
| 标准化名称 |
|---|
| Apple |
| Apple |
| Apple |
| Banana |
| Banana |
注意事项
- 完全不相关的文本会保留原始值,避免错误替换;
- 可根据实际文本特点调整预处理规则(比如移除特定后缀、处理连字符等);
- 若需要复杂模糊匹配,可结合
Text.JaroDistance函数计算文本相似度来匹配基准词。
内容的提问来源于stack exchange,提问作者Sam R.
相关产品推荐
相关产品推荐

