如何用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)
重复处理流程
- 首次运行代码后,查看
new_fruit_terms中的未知词,手动补充到unique_fruits的Excel词库中 - 重新运行代码,直到
processed_fruit列不再出现UNKNOWN标记
注意事项
- 若词库存在大小写差异,可统一转小写(如
fruit_list = [f.lower() for f in fruit_list],处理字符串时同步转小写) - 如需更精细的未知词拆分(如
applebanana拆为apple和banana),可调整匹配失败时的逻辑,比如尝试逐个字符滑动匹配,但会增加复杂度
内容的提问来源于stack exchange,提问作者Ambitions
相关产品推荐
相关产品推荐

