如何实现带斜杠标签的文本词条去重及同词根标签合并处理
带斜杠标签的词条特殊去重处理
核心规则
- 存储词条的文本文件存在重复内容,常规
sort -u仅能完成字面意义的全局去重,无法满足带斜杠标签的词条特殊处理逻辑 - 基础处理逻辑:若同一词根下同时存在「无斜杠的纯短词条」和「带斜杠标签的长词条」,需删除对应的无斜杠短词条,仅保留带标签的长词条
- 多标签场景要求:同一词根对应多个不同标签的词条时,需要完整保留所有不同标签的长词条,不能只留存第一个遇到的带标签条目
- 延伸可选需求:支持将同一词根下的所有标签合并,输出为
词根/合并后的标签串格式的单一条目
效果演示
单标签词根场景
原始输入文件内容:
test/e this/x word/p and some more/q test this and some
执行常规sort -u t1.txt的输出结果:
and more/q some test test/e this this/x word/p
该结果不符合预期:无标签的test、this均存在对应带斜杠标签的版本,需要被删除。正确输出应为:
and more/q some test/e this/x word/p
多标签词根场景
更新后的输入文件内容:
test/e this/x word/p and some more/q test this and some more/n word/n
之前尝试的错误命令awk -F/ '!seen[$1]++{rows[$0]} END {for (i in rows) print i}'会因为遇到第一个同词根带标签词条就标记已处理,漏录后续同词根的其他标签条目,输出缺失more/n、word/n,不符合要求。
正确预期输出需包含所有带标签的长词条:
and more/q more/n some test/e this/x word/p word/n
实现命令
基础需求实现:删除无标签短词条、完整保留所有多标签长词条
awk -F/ ' { root = $1 if (NF > 1) { # 标记当前词根存在带标签版本,将词条存入待输出数组 has_tag[root] = 1 tagged[$0] = 1 } else { # 暂存所有无斜杠的纯短词条 plain[$0] = 1 } } END { # 输出全部带标签的长词条 for (entry in tagged) print entry # 输出没有对应带标签版本的纯短词条 for (entry in plain) if (!has_tag[entry]) print entry }' t1.txt | sort
该命令不会遗漏同词根的多标签条目,最终输出经过排序,和常规sort -u的输出风格保持一致。
延伸需求实现:同词根合并所有标签为单一条目
awk -F/ ' { root = $1 if (NF > 1) { tag = $2 # 收集当前词根下的所有非重复标签,避免重复拼接 if (!(tag in tag_visit[root])) { tag_visit[root][tag] = 1 tags_of[root] = tags_of[root] tag has_tag[root] = 1 } } else { plain[root] = 1 } } END { # 输出合并标签后的长词条 for (root in tags_of) print root "/" tags_of[root] # 输出无对应标签的纯短词条 for (root in plain) if (!has_tag[root]) print root }' t1.txt | sort
该命令会将同一词根下的所有标签去重后拼接,输出如word/np、more/nq格式的合并条目,无需逐行保留拆分的带标签词条。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

