【问题标题】:Remove stopwords from tokenizaton从标记化中删除停用词
【发布时间】:2021-09-20 06:40:46
【问题描述】:

我在从标记化中删除停用词时遇到问题。我已经对句子进行了标记,并将结果与​​ pandas 一起插入名为“tweets_tokenize”的列中。问题是我有双括号( [ ] ),结果只有一个并且重复(详情参见图片),如果使用第一个函数,停用词不起作用。但是,如果使用第二个功能是好的。能解释一下原因吗?

from nltk.corpus import stopwords
stopwords_indonesia = stopwords.words('indonesian')

# First function
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

# Second function
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()

使用第一个函数的结果。

使用第二个函数的结果。

【问题讨论】:

  • 这是完整的代码吗?您是否在代码中的某处将变量 tweets_stopwords 声明为全局变量?
  • 对不起,我给错了代码。
  • 看到更正了,请找我的答案

标签: python pandas nlp nltk


【解决方案1】:

第一个函数:

原因是行:

words = df['tweets_tokenize']

对象的类型是'pandas.core.series.Series',一旦你在循环中迭代它,对象词将是列表的类型。

当你将它附加到这一行时:

tweets_stopwords.append(word)

您实际上是在附加一个列表,而不是一个单词。这就是为什么你有一个包含一个大列表的列表。

第二个功能:

分别迭代每一行,对象类型为正则字符串。

总结:

当你使用pandas的apply函数时,像第二个函数那样逐行处理会更好,而不是像第一个函数中提到的那样使用整个列。

【讨论】:

  • 感谢您的解释。它帮助了我。我对第二个函数还有一个问题。 words 在插入到word 之前在哪里获取数据?如果我不声明像 words = df['tweets_tokenize'] 这样的变量
  • pandas 的函数 apply 在您询问的列的每一行上在后台进行迭代,并将该行的值发送到函数中。在您的示例中,对于“tweets_tokenize”列中的每个值,发送令牌列表
  • 啊,我明白了。你帮了我很大的忙。
猜你喜欢
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2011-11-28
  • 2014-01-21
  • 2013-07-11
相关资源
最近更新 更多