问题描述
我正在尝试生成一个非常简单的 Twitter 情绪分析。到目前为止,我已经能够预处理我的推文,但是我很难在我的数据框中进行词形还原。到目前为止,这是我的代码:
import nltk
import pandas as pd
from nltk.corpus import stopwords # Importing Natural Language Toolkit
from nltk.stem import WordNetLemmatizer
df = pd.read_csv(r'/Users/sarfrazkhan/Desktop/amazon.csv') # Loading Amazon data set into code
df = df['x'].str.replace('http\S+|www.\S+','',case=False) # Removing URL's from data set
df = df.str.replace(r'\<.*\>','') # Removing noise contained in '< >' these parenthesis
df = df.str.replace('RT ',case=False) # Removing the phrase 'RT" from all strings
df = df.str.replace('@[^\s]+',case=False) # Removing '@' and the following twitter handle from strings
df = df.str.replace('[^\w\s]',' ') # Removing any punctuation
df = df.str.replace('\r\n',' ') # Removing '\r\n' which is present in some strings
df = df.str.replace('\d+','').str.lower().str.strip() # Removing numbers,capitalisation and white space
df = df.apply(nltk.word_tokenize) # Tokenizing data set
stop = nltk.download('stopwords') # Downloading stop words
stop = set(stopwords.words('english')) # Selecting English stop words
df = df.apply(lambda x: [item for item in x if item not in stop]) # Removing stop words from each string
lemmatizer = WordNetLemmatizer()
lemma_words = [lemmatizer.lemmatize(w,pos='a') for w in df]
我正在努力让我的 Lemmatizer 工作并不断遇到错误,这可能是因为我的数据集是列表形式。 (我正在努力解决这个问题)我试图处理的 Excel 只是一长串标题为“x”的推文。您可以在我的代码的第 6 行看到我主要关注本专栏,但是我不确定这是否是正确的方法!
我的预期结果将是在各自行中正确词形还原的单词列表,然后我可以对其进行情感分析。
在尝试词形还原过程之前,这些是我的数据框的前几行:
1 [swinging,pendulum,wall,clock,love,give,...
2 [enter,via,gleam,l]
3 [screw,every,follow,gets,nude,dms,dm,pr...
4 [bishop,law,coming,soon,bishop,series,bo...
5 [adventures,bella,amp,emily,book,...
6 [written,books,varIoUs,genres,amazon,kind...
7 [author,amwriting,fantasy,mystery,p...
8 [wonderful,mentor,recent,times,graham,kee...
9 [available,ebay,disabilities,hidden...
10 [screw,pr...
解决方法
您的代码试图对实际列表进行词形还原,因此出现错误。
... for w in df
-> 这里,w
是列表,而不是每个列表的每个元素。
为了解决这个问题,你可以使用 pandas apply 将每一行传递给一个函数(假设 df 是一个 pd.DataFrame
而不是一个 pd.Series
。如果它是一个系列并且下面的不起作用,先尝试df = df.to_frame()
):
def df_lemmatize(row):
lemmatizer = WordNetLemmatizer()
row.at['lemma_words'] = [lemmatizer.lemmatize(w,pos='a') for w in row.x]
return row
df = df.apply(df_lemmatize,axis=1)
df_lemmatize
将遍历列表中的每个元素,将其词形还原,然后将新列表添加到新列 lemma_words
。