基于NLTK WordNet校验单词有效性,DataFrame新列赋值异常排查
问题诊断与解决
你的代码之所以会返回全False,核心问题出在循环中对整列赋值的操作上:每次循环里执行df['new'] = False时,都会把整个new列的所有行都设置为False,而不是只标记当前检查的那一行。哪怕前面有单词是有效的,后续循环也会覆盖掉之前的结果,最终整个列都变成False。
下面给你两种可行的解决方案:
方案1:修复循环遍历的写法
先初始化新列,然后通过索引定位到每一行来修改值:
from nltk.corpus import wordnet # 先把新列默认设为True(假设大部分单词是有效的) df['new'] = True # 用enumerate同时获取索引和单词 for idx, word in enumerate(df['word']): # 如果WordNet里没有该单词的同义词集,标记为False if not wordnet.synsets(word): df.loc[idx, 'new'] = False print(f'Not an English Word...: {word}')
方案2:更高效的Pandas风格写法(推荐)
Pandas不推荐用循环逐行处理,用apply方法会更简洁高效:
from nltk.corpus import wordnet # 定义判断函数:检查单词是否在WordNet中 def is_valid_english_word(word): # synsets返回空列表表示不存在,转成布尔值就是False return bool(wordnet.synsets(word)) # 直接对word列应用函数生成新列 df['new'] = df['word'].apply(is_valid_english_word) # 如果需要打印所有无效单词,可以单独筛选输出 invalid_words = df[~df['new']]['word'].tolist() for word in invalid_words: print(f'Not an English Word...: {word}')
这样处理后,new列就会根据每个单词的有效性正确显示True或False了。
内容的提问来源于stack exchange,提问作者spacedustpi
相关产品推荐
相关产品推荐

