[英]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中的容器是list , tuple , set , dict之類的東西 。 當您嘗試切片時,通常會返回您在集合上方獲得的錯誤,通過切片我的意思是子集,取部分。 如果您有一個集合,則調用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.