Python 中的 Twitter 情感分析,Pandas 中的词形还原

问题描述

我正在尝试生成一个非常简单的 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