DataFrame列表移除停用词输出异常,如何修正为按词展示?
解决DataFrame停用词过滤时单词被拆分为单个字符的问题
问题背景
你尝试从DataFrame的review_normalized列移除停用词,该列元素预期为单词列表,但运行代码后输出将单词拆分为单个字符,不符合预期。
原DataFrame示例
data['review_normalized'] ['bagus'] ['sangat', 'baik'] ['oke'] ['setiap', 'mau', 'meeeting', 'lah']
编写的代码
list_stopwords = (["yang", "rt", "dengan", "nya", "di", 'kalo', 'amp', 'biar', 'bikin', 'bilang', 'enggak', 'karena', 'nya', 'nih', 'sih', 'si', 'tau', 'tidak', 'tuh', 'untuk', 'ya', 'jadi', 'jangan', 'sudah', 'aja', 'saja', 't', 'nyg', 'hehe', 'pengen', 'nan', 'loh', 'rt', '&amp', 'yah', 'ah', 'akh', 'deh', 'doang', 'eh', 'ges', 'lah', 'lho', 'dek', 'bang', 'ges', 'gan', 'aduh', 'meng']) # convert list to set list_stopwords = set(list_stopwords) # remove stopword from token list def stopwords_removal(words): return [word for word in words if word not in list_stopwords] data['review_tokens_WSW'] = data['review_normalized'].apply(stopwords_removal) print(data['review_tokens_WSW'].head())
异常输出
0 [[, ', b, a, g, u, s, ', ]] 1 [[, ', s, a, n, g, a, ', ,, , ', b, a, i, k, ... 2 [[, ', o, k, e, ', ]] 3 [[, ', o, k, e, ', ]] 4 [[, ', s, e, i, a, p, ', ,, , ', m, a, u, ', ...
期望输出
0 ['bagus'] 1 ['sangat', 'baik'] 2 ['oke'] 4 ['setiap', 'mau', 'meeeting']
问题原因
核心问题是review_normalized列的元素不是真正的Python列表,而是格式类似列表的字符串(比如实际存储的是"['bagus']"而非['bagus'])。当你对字符串执行遍历操作时,Python会将字符串的每个字符作为迭代项,最终导致单词被拆分为单个字符。
解决方案
需要先将字符串格式的"列表"转换为真正的Python列表,再执行停用词过滤。这里提供两种可靠的处理方式:
方式1:使用ast.literal_eval解析字符串
ast.literal_eval可以安全地将字符串形式的列表转换为真实列表,适合格式标准的情况:
import ast list_stopwords = {"yang", "rt", "dengan", "nya", "di", 'kalo', 'amp', 'biar', 'bikin', 'bilang', 'enggak', 'karena', 'nya', 'nih', 'sih', 'si', 'tau', 'tidak', 'tuh', 'untuk', 'ya', 'jadi', 'jangan', 'sudah', 'aja', 'saja', 't', 'nyg', 'hehe', 'pengen', 'nan', 'loh', 'rt', '&amp', 'yah', 'ah', 'akh', 'deh', 'doang', 'eh', 'ges', 'lah', 'lho', 'dek', 'bang', 'ges', 'gan', 'aduh', 'meng'} def stopwords_removal(words_str): # 解析字符串为真实列表 words = ast.literal_eval(words_str) # 过滤停用词 return [word for word in words if word not in list_stopwords] data['review_tokens_WSW'] = data['review_normalized'].apply(stopwords_removal) print(data['review_tokens_WSW'].head())
方式2:字符串手动处理(兼容非标准格式)
如果字符串格式存在不规范情况(比如引号不一致),可以手动处理字符串:
list_stopwords = {"yang", "rt", "dengan", "nya", "di", 'kalo', 'amp', 'biar', 'bikin', 'bilang', 'enggak', 'karena', 'nya', 'nih', 'sih', 'si', 'tau', 'tidak', 'tuh', 'untuk', 'ya', 'jadi', 'jangan', 'sudah', 'aja', 'saja', 't', 'nyg', 'hehe', 'pengen', 'nan', 'loh', 'rt', '&amp', 'yah', 'ah', 'akh', 'deh', 'doang', 'eh', 'ges', 'lah', 'lho', 'dek', 'bang', 'ges', 'gan', 'aduh', 'meng'} def stopwords_removal(words_str): # 去掉首尾的[],按', '分割字符串 word_items = words_str.strip('[]').split(', ') # 去掉每个元素的引号,过滤空字符串 words = [word.strip("'\"") for word in word_items if word.strip("'\"")] # 过滤停用词 return [word for word in words if word not in list_stopwords] data['review_tokens_WSW'] = data['review_normalized'].apply(stopwords_removal) print(data['review_tokens_WSW'].head())
验证结果
执行修正后的代码后,输出将符合你的期望:
0 ['bagus'] 1 ['sangat', 'baik'] 2 ['oke'] 4 ['setiap', 'mau', 'meeeting']
内容的提问来源于stack exchange,提问作者andryan86
相关产品推荐
相关产品推荐

