You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动