如何使用KBBI印尼语词典过滤文本中的非词典词汇?
解决KBBI词典过滤印尼语拼写错误的问题
你的代码报错是因为KBBI是类类型,不是可迭代的集合对象,直接用word in KBBI会触发类型错误——类不能被当作可迭代容器来判断成员归属。
以下是两种可行的解决方案:
方案一:使用异常捕获直接验证单词(最直接)
kbbi库在查询不存在的单词时会抛出KBBIError异常,我们可以利用这一点判断单词是否属于词典:
from kbbi import KBBI, KBBIError import pandas as pd # 定义单词有效性检查函数 def is_valid_kbbi_word(word): try: # 尝试创建KBBI实例,成功则说明单词有效 KBBI(word) return True except KBBIError: # 抛出异常则说明单词不在词典中 return False def remove_typo(text): # 过滤出有效单词 return [word for word in text if is_valid_kbbi_word(word)] # 应用到DataFrame df['after'] = df['before'].apply(remove_typo)
这个方案不需要额外预处理,直接调用库的查询逻辑,能准确匹配kbbi库的词汇范围,比如你示例中的alhmdllh会被正确识别为有效词汇。
方案二:预加载词典到集合(适合大数据集)
如果你的评论数据集很大,频繁调用KBBI()实例化会影响性能。可以先将KBBI词典导出为本地TXT文件(每行一个单词),然后加载为集合,通过集合的O(1)查询提升效率:
步骤1:准备KBBI词汇文件
假设你已经将所有KBBI词汇导出到kbbi_words.txt文件(每行一个单词)。
步骤2:加载并过滤
import pandas as pd # 预加载词典到集合 with open('kbbi_words.txt', 'r', encoding='utf-8') as f: kbbi_words = set(word.strip() for word in f) def remove_typo(text): return [word for word in text if word in kbbi_words] # 应用到DataFrame df['after'] = df['before'].apply(remove_typo)
这种方式查询速度远快于方案一,适合处理大规模数据。
内容的提问来源于stack exchange,提问作者Dewani
相关产品推荐
相关产品推荐

