如何用enchant库提取Pandas DataFrame非英文单词并解决ValueError报错
你触发ValueError的核心原因是直接将pandas整列(Series对象)传入了设计用来处理单个字符串的校验函数,函数内部对Series执行布尔判断、调用str.split这类专属方法时,就会触发真值歧义的错误。另外原函数逻辑还存在两个可优化的问题:
- 单个单词校验和整行单词拆分的逻辑混淆,没有逐词判断
- 每次调用函数都重复创建enchant字典实例,20万行的量级下会严重拖慢运行速度
修正后的完整代码如下:
import pandas as pd import enchant import re # 提前创建所有英文词典实例,避免重复初始化提升性能 en_ls = ['en_NZ', 'en_US', 'en_AU', 'en_GB'] en_dicts = [enchant.Dict(lang) for lang in en_ls] # 初始化测试数据集 df = pd.DataFrame({'dundee': ["I love:Marae", "My Whanau is everything", "I lov Matauranga", "Tāmaki Makaurau is Whare", "AOD problem is common"]}) # 预处理:移除标点、转小写,新增regex=True适配新版pandas规范 df['dundee1'] = df['dundee'].str.replace(r'[^\w\s]+', ' ', regex=True) df['dundee1'] = df['dundee1'].str.lower() # 校验单个单词是否为英文的工具函数 def is_english(word): if not word.strip(): return True for dic in en_dicts: if dic.check(word): return True return False # 处理单行文本,返回所有非英文单词拼接结果 def extract_non_eng(text): words = text.split() non_eng_words = [word for word in words if not is_english(word)] return ', '.join(non_eng_words) # 逐行应用函数生成新列 df['non_english'] = df['dundee1'].apply(extract_non_eng)
运行后输出结果和预期一致:
| dundee | non_english | |
|---|---|---|
| 0 | I love:Marae | marae |
| 1 | My Whanau is everything | whanau |
| 2 | I lov Matauranga | lov, matauranga |
| 3 | Tāmaki Makaurau is Whare | tāmaki, makaurau, whare |
| 4 | AOD problem is common | aod |
如果需要保留非英文单词的原始大小写,仅需调整逻辑:从原始dundee列拆分单词,将单词转小写后校验,匹配到非英文词时保留原始大小写输出即可。
内容的提问来源于stack exchange,提问作者Bible Stands
相关产品推荐
相关产品推荐

