【问题标题】:Remove Stop Words Python删除停用词 Python
【发布时间】:2020-09-03 17:14:02
【问题描述】:

所以我正在阅读一个 csv 文件并获取其中的单词。我正在尝试删除停用词。这是我的代码。

import pandas as pd
from nltk.corpus import stopwords as sw

def loadCsv(fileName):
    df = pd.read_csv(fileName, error_bad_lines=False)
    df.dropna(inplace = True)
    return df

def getWords(dataframe):
    words = []
    for tweet in dataframe['SentimentText'].tolist():
        for word in tweet.split():
            word = word.lower()

        words.append(word)

    return set(words) #Create a set from the words list

def removeStopWords(words):
    for word in words: # iterate over word_list
        if word in sw.words('english'): 
            words.remove(word) # remove word from filtered_word_list if it is a stopword

    return set(words)

df = loadCsv("train.csv")
words = getWords(df)
words = removeStopWords(words)

在这一行

if word in sw.words('english'):

我收到以下错误。

例外:没有描述

接下来,我将尝试删除标点符号,任何关于此的指针也会很棒。 任何帮助深表感谢。

编辑

def removeStopWords(words):
    filtered_word_list = words #make a copy of the words
    for word in words: # iterate over words
        if word in sw.words('english'): 
            filtered_word_list.remove(word) # remove word from filtered_word_list if it is a stopword

    return set(filtered_word_list)

【问题讨论】:

  • removeStopWords 中存在问题,因为您正在修改您正在迭代的列表。不确定这是否是导致您的问题的原因,但您能否将该函数的主体替换为:return set([w for w in words if not w in sw.words('english')])
  • @sal 我只尝试了该行作为方法,但仍然遇到相同的错误。看到我将所有单词读入一个列表,然后想通过删除停用词来修改这个列表,这可能还是我做错了?
  • 从您正在迭代的列表中删除项目是不行的(通常)。最好的方法是使用列表推导或其他方式从旧列表生成新列表。我很困惑,因为我尝试了一个简单的句子,它有效。
  • @sal 那么这真的很奇怪。由于您在帖子中的建议,我编辑了我的方法,但我仍然在 if 语句中遇到相同的错误。有什么我缺少的东西,比如导入什么的吗?
  • filtered_word_list = words 不会复制:它们指向同一个列表,因此无法解决我指出的问题。所以你是说def removeStopWords(words): return set([w for w in words if not w in sw.words('english')]) 不能解决问题? (修复缩进)

标签: python python-3.x pandas nltk


【解决方案1】:

这是问题的简化版本,没有 Panda。我相信原始代码的问题在于在迭代它时修改集合words。通过使用条件列表推导,我们可以测试每个单词,创建一个新列表,并最终按照原始代码将其转换为一个集合。

from nltk.corpus import stopwords as sw

def removeStopWords(words):
    return set([w for w in words if not w in sw.words('english')])

sentence = 'this is a very common english sentence with a finite set of words from my imagination'
words = set(sentence.split())
print(removeStopWords(words))

【讨论】:

    【解决方案2】:

    将 removeStopWords 函数更改为以下内容:

    def getFilteredStopWords(words):
        list_stopWords=list(set(sw.words('english')))
        filtered_words=[w for w in words if not w in list_stopWords# remove word from filtered_words if it is a stopword
        return filtered_words
    

    【讨论】:

    • 您能进一步扩展吗?不知道你的意思
    • 修复 removeStopWords 功能
    【解决方案3】:
    def remmove_stopwords(sentence):
        list_stop_words = set(stopwords.words('english'))
        words = sentence.split(' ')
        filtered_words = [w for w in words if w not in list_stop_words]
        sentence_list = ' '.join(w for w in filtered_words)
        return sentence_list
    

    【讨论】:

    • 虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 2013-12-17
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2016-05-21
    相关资源
    最近更新 更多