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

如何用Pandas拆分无空格拼接字符串列?含自定义词库匹配需求

Pandas列拆分:基于自定义词库的无空格字符串分词(优先匹配长词)

核心逻辑

  • 先将词库按词长降序排序,确保长词(如pineapple)优先匹配,避免被错误拆分为pine+apple
  • 针对不同类型的输入做差异化处理:
    • 空值直接保留
    • 已有空格的内容,拆分后逐个验证是否在词库
    • 无空格字符串,循环匹配词库,匹配到就截取,剩余部分继续处理
  • 提取未匹配的未知词,手动补充到词库后重复执行,直到全部内容处理完成

代码实现

1. 导入依赖并读取数据

import pandas as pd
import re

# 读取词库和待处理数据(替换为你的Excel路径)
unique_fruits = pd.read_excel("fruit_dictionary.xlsx")
my_fruits = pd.read_excel("fruits_to_process.xlsx")

# 提取词库列表并按词长降序排序(关键:优先匹配长词)
fruit_list = unique_fruits["fruit_name"].dropna().tolist()
fruit_list.sort(key=lambda x: len(x), reverse=True)
# 生成正则匹配模式,确保长词优先被匹配
fruit_pattern = re.compile(r'(' + '|'.join(re.escape(fruit) for fruit in fruit_list) + r')')

2. 编写拆分处理函数

def split_fruit_string(s):
    # 处理空值
    if pd.isna(s):
        return s
    
    s_str = str(s).strip()
    # 处理已有空格的内容
    if ' ' in s_str:
        parts = s_str.split()
        known_terms = [p for p in parts if p in fruit_list]
        unknown_terms = [p for p in parts if p not in fruit_list]
        
        if unknown_terms:
            return f"KNOWN: {' '.join(known_terms)} | UNKNOWN: {' '.join(unknown_terms)}"
        else:
            return ' '.join(known_terms)
    
    # 处理无空格的拼接字符串
    matched_terms = []
    remaining = s_str
    
    while remaining:
        match = fruit_pattern.match(remaining)
        if match:
            matched_word = match.group(1)
            matched_terms.append(matched_word)
            remaining = remaining[len(matched_word):]
        else:
            # 标记未匹配的未知内容
            matched_terms.append(f"UNKNOWN:{remaining}")
            break
    
    return ' '.join(matched_terms)

3. 应用函数并提取未知词

# 假设待处理列名为"fruit_column",生成处理后的列
my_fruits["processed_fruit"] = my_fruits["fruit_column"].apply(split_fruit_string)

# 提取所有未知词,用于补充词库
unknown_rows = my_fruits[my_fruits["processed_fruit"].str.contains("UNKNOWN:", na=False)]
extracted_unknown = []
for item in unknown_rows["processed_fruit"]:
    unknown_part = item.split("UNKNOWN:")[-1].strip()
    extracted_unknown.extend(unknown_part.split())

# 去重后得到需要补充的新词
new_fruit_terms = pd.Series(extracted_unknown).drop_duplicates().tolist()
print("需补充到词库的新词:", new_fruit_terms)

重复处理流程

  1. 首次运行代码后,查看new_fruit_terms中的未知词,手动补充到unique_fruits的Excel词库中
  2. 重新运行代码,直到processed_fruit列不再出现UNKNOWN标记

注意事项

  • 若词库存在大小写差异,可统一转小写(如fruit_list = [f.lower() for f in fruit_list],处理字符串时同步转小写)
  • 如需更精细的未知词拆分(如applebanana拆为apple和banana),可调整匹配失败时的逻辑,比如尝试逐个字符滑动匹配,但会增加复杂度

内容的提问来源于stack exchange,提问作者Ambitions

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:16