簡體   English   中英

刪除停用詞 - Python

[英]Remove Stop Words - Python

所以我正在讀取一個csv文件,然后獲取文件中的所有單詞。 我想要做的是使用nltk刪除所有停用詞。 我是Python的新手,請原諒我這是一個不好的問題。 這是我的代碼

    import pandas as pd
    from nltk.corpus import stopwords

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):
    filtered_word_list = words[:] #make a copy of the word_list
    for word in words: # iterate over word_list
        if word in stopwords.words('english'): 
            filtered_word_list.remove(word) # remove word from filtered_word_list if it is a stopword

    return set(filtered_word_list)

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

我收到以下錯誤。

'set'對象不可訂閱

任何幫助將不勝感激。

你把words設為一組,所以它不是一個列表而words[:]是無意義的。

試試這個而不是return list(set(words))

你不需要在用戶定義的函數中構造所有代碼,我不確定它背后是否有原因,但問題非常簡單,在閱讀datafrme之后,可以在幾乎2行代碼中簡潔地解決。

import pandas as pd
from nltk.corpus import stopwords

創建stop_words列表

stop_words = stopwords.words('english')
stop_words[:10]

產量

['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're"]

我將演示使用John Keats的一首詩中的前幾行,這是一個.txt文件,我讀入數據幀。

df = pd.read_table('keats.txt', error_bad_lines = False, header = -1 , names = ['poem'], na_filter= True)
df

![在此處輸入圖像說明

添加一個新列到df調用它清理每行是小寫並按空格分割
這實際上是您處理的第一步
你可以使用其中任何一個
1)lambda運算符

df['cleaned'] = list(map(lambda x: x.lower().split(), df.poem))

2)listcomp

df['cleaned'] = [x.lower().split() for x in df.poem]

在此輸入圖像描述

第二步也是最后一步是過濾停用詞,最簡單的方法是使用一個結合過濾器的地圖。
將此作為第三列添加到您的df:

df['filtered'] = list(map(lambda line: list(filter(lambda word: word not in stop_words, line)), df.cleaned))
df

在此輸入圖像描述

如此有效,正如我之前提到的,您只需要兩行代碼來處理您的數據幀。



在最后一步中有一點要解壓縮,讓我們在df.cleaned列中取第一行

df.cleaned[0]

產量

['deep', 'in', 'the', 'shady', 'sadness', 'of', 'a', 'vale']

什么map(filter(lambda x: according to condition, data_source))做的是過濾不在停用詞中的單詞

list(filter(lambda word: word not in stop_words, df.cleaned[0]))

產量

['deep', 'shady', 'sadness', 'vale']

此過濾器語句充當您可以傳遞到map(function, column)其中過濾器是函數參數,列是列df.cleaned
因此,過濾(系統)如果您將迭代地應用於每一行,結果將發布在新列中。 如果你仔細觀察,你會發現map / filter語句的骨架如下:

map(lambda: line ,filter(lambda word:word not in stop_words, line ),source_of_ line

注意如何從數據幀中的每一行提取行,然后將其傳遞到過濾器表達式中,其中過濾該行中的單詞。

希望我已經做好了澄清這一點。

因為你是python的新手讓我分享一些想法1- python是一種優雅的語言,其目的是簡潔和可讀性。 可以做的最簡單的事情就是為循環編寫顯式,除非循環幾乎總是可以用listcomps或生成器表達式替換。 用戶定義的功能也是如此。

2-那里有很多代碼從2.7繼承而來,例如words[:] ,你不再需要[:]位了。

3-嘗試理解容器的屬性,python中的容器是listtuplesetdict之類的東西 當您嘗試切片時,通常會返回您在集合上方獲得的錯誤,通過切片我的意思是子集,取部分。 如果您有一個集合,則調用set_1並且您執行set_1[:10]您將獲得set object not subscriptabl 這是因為集合是python中的非順序容器,意味着集合的元素沒有分配給它們的索引,因此您不能像對列表一樣對排序或子集進行排序或調用第一個,第二個或第N個元素。 可以使用dir(object)顯示實例方法和對象的屬性

4-永遠不要停止修補代碼

函數getWords的返回是一個set對象,然后作為參數傳遞給函數removeStopWords ,在它的第一個語句中,你嘗試使用花哨的索引操作來訪問這些值:

filtered_word_list = words[:]

您需要做的是在從getWords方法返回之前將該集轉換為列表:

return list(set(words)) #Create a set from the words list
filtered_word_list = words[:] #make a copy of the word_list

這里的words是一個集合,而不是一個列表,所以這一行會拋出一個錯誤。 您可以使用列表推導來創建不間斷詞的列表:

return [x for x in words if x not in stopwords.words('english')]

這避免了制作副本的需要,並且不需要words作為列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM