You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:42:47