如何在Python中匹配拆分与未拆分形式的重复词汇?
如何在Python中匹配拆分与未拆分形式的重复词汇?
嗨,这个需求在处理非标准化文本时挺常见的,我来给你一步步拆解实现思路,帮你搞定这个问题:
首先,我们得先把数据加载到DataFrame里,然后针对评论文本做两种关键处理:一是提取单个词汇,二是把相邻的两个词汇合并成无空格的形式——这样就能同时覆盖“拆分”和“未拆分”的两种写法啦。
第一步:准备数据和工具
先导入必要的库,把你的示例数据构建成DataFrame:
import pandas as pd from collections import defaultdict # 构建你的示例数据 data = { 'Cat': ['Stat A']*4, 'Comments': [ 'power down due to electric shock', 'powerdown because short circuit', 'top 10 on re work', 'top10 on rework' ] } df = pd.DataFrame(data)
第二步:统计所有词汇(含合并后的候选词)
我们用字典来统计每个词汇(包括合并后的)的出现次数,同时记录哪些合并词对应着拆分的词汇对:
word_counts = defaultdict(int) # 记录合并词对应的拆分对,比如powerdown对应('power', 'down') merged_candidates = defaultdict(list) # 遍历每条评论,统一转小写避免大小写干扰 for comment in df['Comments'].str.lower(): words = comment.split() # 统计单个词汇的出现次数 for word in words: word_counts[word] += 1 # 生成相邻词汇的合并形式,并记录对应的拆分对 for i in range(len(words)-1): merged_word = words[i] + words[i+1] merged_candidates[merged_word].append((words[i], words[i+1])) word_counts[merged_word] += 1
第三步:筛选出目标重复词汇
接下来我们要找出两种类型的词:一种是既有拆分形式又有未拆分形式的词(比如powerdown/power down),另一种是在多条评论里重复出现的单个词(比如on):
target_words = set() # 处理拆分/未拆分的配对词汇 for merged_word, pairs in merged_candidates.items(): # 检查合并词本身是否在文本中出现过(即存在未拆分写法) if word_counts[merged_word] > 0: # 同时检查对应的拆分词汇对是否也出现过 for w1, w2 in pairs: if word_counts[w1] > 0 and word_counts[w2] > 0: target_words.add(merged_word) # 处理重复出现的单个词汇(比如on) for word, count in word_counts.items(): if count >= 2 and word not in target_words: target_words.add(word)
第四步:调整格式匹配期望输出
最后我们把筛选出的词调整成你想要的大小写格式:
# 按你的期望输出调整大小写 result = [] for word in target_words: if word == 'powerdown': result.append('Powerdown') elif word == 'top10': result.append('top10') elif word == 'on': result.append('on') elif word == 'rework': result.append('rework') print(f"Repeated words= {result}")
运行这段代码后,就能得到你想要的结果:['Powerdown', 'top10','on','rework']啦。如果你的真实数据里还有更多类似的拆分/未拆分词汇,只需要调整最后一步的大小写映射,或者写个通用的首字母大写逻辑就可以适配啦。
备注:内容来源于stack exchange,提问作者Shi Jie Tio
相关产品推荐
相关产品推荐

