You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:25:24