自然语言处理 | (6) 基于英文文本的简易情感分析

在本片博客中我们结合之前讲的工具库、sklearn以及pandas,来构建一个简易的情感分析模型。情感分析属于分类任务,即为文本分配情感标签,我们将使用简单的逻辑回归模型来实现这个多分类任务。

目录

1.加载数据

2.数据预处理

3.模型训练


完整代码

1.加载数据

data = pd.read_csv("./data/emotion_data.csv")
print(data.shape)
print(data.head()) #content是推特内容 sentiment是情感
print(data['sentiment'].unique())#不同的情感种类
print(len(data['sentiment'].unique()))#不同的情感种类数量  13分类

2.数据预处理

# 去掉无关列
data = data.drop(['tweet_id','author'],axis=1) 
#或data = data.drop(data.columns[[0,2]], axis=1)
print(data.head())
print(data.shape)

#对content字段的所有文本进行分词,去除停用词 提取词干stemmer
import nltk
from nltk import word_tokenize, sent_tokenize
from nltk.corpus import stopwords
from nltk.stem import PorterStemmer
print(data['content'][0]) #content字段的第一条文本 处理之前
def preprocessing(text):
    #分词
    token_words = word_tokenize(text)
    #去除停用词
    stop_words = stopwords.words('english')
    fileter_words = [word for word in token_words if word not in stop_words]
    #stemmer
    stemmer = PorterStemmer()
    fileterStem_words = [stemmer.stem(word) for word in fileter_words]
    
    return ' '.join(fileterStem_words) #返回一个字符串  以空格间隔

#使用apply对content字段的所有文本进行处理 矢量化编程 避免显式for循环 速度快
data['content'] = data['content'].apply(preprocessing)
print(data['content'][0])#content字段的第一条文本 处理之后

dataset = data.as_matrix() #将DataFrame转换为矩阵/2维数组
print(dataset.shape)
#提取特征(第2列 处理后的文本)
features = dataset[:,1]
print(features[100])
#提取标签/sentiment(第1列)
target = dataset[:,0]

# 使用LabelEncoder对不同的情感target进行编码 把不同的情感转换为数字
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
print(target)
target_processed = le.fit_transform(target) 
print(target_processed)
print(le.classes_) #anger对应数字0 依次类推

# 对输入的文本进行特征抽取和表示(这里用到的tf-idf特征之后会学习) 
#数字化 把文本表示成特征向量(1*42725维的稀疏向量)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
X_processed = tfidf.fit_transform(features)
print(X_processed.shape) #特征矩阵 40000条文本  每行代表一个文本的特征向量
print(X_processed[0].shape)
print(X_processed[0]) #稀疏向量

#切分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_processed, target_processed, test_size=0.25, random_state=42)

 

3.模型训练

from sklearn.linear_model import LogisticRegression
#使用简单的逻辑回归模型
lr = LogisticRegression()
lr.fit(X_train, y_train)

直接使用sklearn中逻辑回归模型的默认参数,当然也可以手动设置一些超参数,再额外划分一个验证集,进行超参数调试,选出一个最好的模型,最后在测试集上进行评估。

逻辑回归主要用来解决2分类问题,也可以用来解决多分类,2分类可以看作多分类的特殊情况。通过multi_class参数进行设置,默认是'ovr' :one vs. rest,此时多分类就相当于训练多个2分类器(logistic回归分类器),进行多次2分类,每次把其中一个类当作正类,其余所有类作为负类,然后进行多数投票,决定样本的类别,本例中的13分类要进行13次2分类(2分类时只需要训练一个2分类器,进行一次2分类即可);当然也有不同的选择,如‘multinomial’,此时应用逻辑回归在多分类上的推广形式,即softmax回归(把sigmoid函数替换为softmax函数),训练一个多分类器,直接进行多分类。

可以在LogisticRegression中查看各个参数的详细说明。

# 模型评估
lr.score(X_test, y_test)

可以看到模型在测试集上的准确率不是很高,只有35.3%;因为我们采用的模型太过于简单,之后我们还会学习更加复杂高级的模型,届时将会取得更好的效果。

# 模型预测
test_ex = "It is so horrible"
test_ex = preprocessing(test_ex)
text_ex_processed = tfidf.transform([test_ex])
print(lr.predict(text_ex_processed)) #预测的情感索引
print(le.classes_[lr.predict(text_ex_processed)]) #预测的情感

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/sdu_hao/article/details/86760583
今日推荐