Power Query(Excel独立版):识别并去除重复子串中的通用词
解决方法:Power Query M代码实现词根级重复词去重
思路拆解
针对你遇到的「词根重复(而非整词重复)」的文本清理需求,核心思路是先识别单词共享的词根,再每组保留最具特异性的单词(比如排除"Nuts"/"Berries"这类通用词,优先保留"Hazelnut"/"Raspberry"这类具体词):
- 将文本拆分为单个单词的列表
- 为每个单词标记对应的核心词根(nut/berry)
- 按词根分组,每组筛选移除通用词,保留最具体的单词
- 合并筛选后的单词为最终文本
具体步骤 & M代码
假设你的目标列名为[TextColumn],可以直接在Power Query中添加自定义列,粘贴以下代码:
let // 替换为你的目标列名 InputText = [TextColumn], // 拆分文本为单词列表 WordList = Text.Split(InputText, " "), // 为每个单词匹配词根(不区分大小写) TaggedWords = List.Transform(WordList, (word) => [ Word = word, Root = if Text.Contains(Text.Lower(word), "nut") then "nut" else if Text.Contains(Text.Lower(word), "berry") then "berry" else null ]), // 按词根分组,收集同词根的单词 GroupedByRoot = Table.Group(Table.FromList(TaggedWords, Splitter.SplitByNothing()), "Root", {{"Words", each [Word]}}), // 定义筛选逻辑:移除通用词,保留最具体的单词 KeepSpecificWord = (wordList as list) => let // 可自定义扩展需要排除的通用词 GenericWords = {"Nuts", "Berries", "Nut", "Berry"}, FilteredList = List.RemoveItems(wordList, GenericWords), // 过滤后有内容就取最长的(通常更具体),否则取原列表最长词 Result = if List.Count(FilteredList) > 0 then List.Max(FilteredList, (w) => Text.Length(w)) else List.Max(wordList, (w) => Text.Length(w)) in Result, // 对每个词根组应用筛选 FilteredGroups = Table.AddColumn(GroupedByRoot, "SpecificWord", each KeepSpecificWord([Words])), // 收集最终单词并合并 FinalWords = FilteredGroups[SpecificWord], ResultText = Text.Combine(FinalWords, " ") in ResultText
自定义调整说明
- 如果需要排除更多通用词,直接在
GenericWords列表里添加即可(比如"Nutty"这类泛称) - 要支持更多词根(比如"fruit"),在
TaggedWords的Root判断分支里增加对应条件 - 代码默认忽略大小写,不用担心"Nut"和"nut"的匹配问题
用你的示例输入Hazelnut Berries Nuts Raspberry测试:
拆分后同词根组为{"Hazelnut", "Nuts"}(nut词根)和{"Berries", "Raspberry"}(berry词根),筛选后自动移除通用词,最终输出Hazelnut Raspberry,完全符合需求!
内容的提问来源于stack exchange,提问作者Lana B
相关产品推荐
相关产品推荐

