使用NLTK去除CSV中的非英文单词
搞定你的NLTK过滤问题!
嘿,我一眼就看到你踩了个新手常犯的小坑——那个expected a String or a byte-like object错误,核心原因是你最后一行直接对整个Pandas Series用了nltk.word_tokenize(),这个函数只能处理单个字符串,没法直接怼整个Series,所以直接报错了。另外你的数据预处理环节也有点小问题,我一步步给你捋顺:
第一步:先把数据搞干净,确保tags列是正经字符串
你之前用applymap(str)把整个DataFrame转成字符串,其实没必要,只处理tags列就行,而且要先把空值处理掉(不然会把NaN转成字符串"nan",这可不是你想要的):
# 先删掉tags为空的行,或者用空字符串填充,选你需要的方式 df_clean = df_filtered_english_only.dropna(subset=['tags']).copy() # 把tags列转成字符串类型 df_clean['tags'] = df_clean['tags'].astype(str) # 验证下类型,应该返回True from pandas.api.types import is_string_dtype print(is_string_dtype(df_clean['tags']))
第二步:逐行过滤非英文标签
接下来要对每个tags字符串单独处理,这时候用apply就对了——它会帮你遍历Series里的每一个字符串,逐个处理。记得先下载NLTK的词库哦(第一次运行要下):
import nltk # 第一次运行必须下载这两个包 nltk.download('words') nltk.download('punkt') # 加载英文词库,转成集合方便快速查找 english_words = set(nltk.corpus.words.words()) # 写个小函数,专门处理单个tags字符串 def keep_only_english(tags_text): # 先把字符串分词 tokens = nltk.word_tokenize(tags_text) # 过滤:要么是英文单词,要么不是纯字母(比如数字、符号标签,你可以根据需求调整) filtered = [token for token in tokens if token.lower() in english_words or not token.isalpha()] # 把过滤后的词重新拼成字符串 return ' '.join(filtered) # 对整个tags列应用这个过滤函数,生成新的列 df_clean['filtered_tags'] = df_clean['tags'].apply(keep_only_english)
为啥你之前的方法没生效?
你之前转完字符串后用了filtered_new['tags'].dropna(inplace=True),但之后又用了原始的df_filtered_english_only["tags"],等于白处理了——一定要确保后续操作的是同一个处理后的DataFrame!而且最后一行直接对Series调用word_tokenize,这就是报错的直接原因,必须用apply逐行处理每个元素。
这样处理完,df_clean['filtered_tags']就是你想要的只保留英文单词的标签列啦~
内容的提问来源于stack exchange,提问作者Victoria S




