Pandas tweets_tokenize列停用词移除首函数失效次函数正常原因求解
两个停用词移除函数运行效果差异的原因
两个函数的核心差异在于第一个函数错误覆盖了入参,导致逻辑完全偏离预期:
pandas的apply()方法作用于Series时,会逐行将列中每个元素(这里是单条推文的分词结果列表)作为参数传入待调用函数的形参。- 第一个函数内部第一行执行了
words = df['tweets_tokenize'],直接把传入的「单条推文的分词列表」参数,覆盖为了整个tweets_tokenize列的全部数据,进而引发三个问题:- 每次处理任意一行时,函数返回的都是整个列的全部分词结果,所以所有行的输出完全重复
- 遍历的对象是列中每个元素(即每条推文的分词列表),而非分词列表中的单个词语,无法匹配停用词表,停用词移除逻辑完全不生效
- 最终每行返回的结果是「多个分词列表组成的大列表」,所以会出现双层方括号的嵌套结构
- 第二个函数没有覆盖传入的
words参数,直接遍历当前行的单个分词列表中的每个词语做停用词匹配,逻辑完全正常。
相关代码说明
两个函数的差异点如下:
from nltk.corpus import stopwords stopwords_indonesia = stopwords.words('indonesian') # 存在问题的第一个函数 def stopwords_remover(words): words = df['tweets_tokenize'] # 该行是错误来源,覆盖了传入的参数 tweets_stopwords = [] for word in words: if word not in stopwords_indonesia: tweets_stopwords.append(word) return tweets_stopwords # 逻辑正常的第二个函数 def stopwords_remover(words): tweets_stopwords = [] for word in words: if word not in stopwords_indonesia: tweets_stopwords.append(word) return tweets_stopwords df['tweets_tokenize'].apply(stopwords_remover) df.head()
内容的提问来源于stack exchange,提问作者caeruleum
相关产品推荐
相关产品推荐

