机器学习--微博文本情感分析

完整代码和数据下载地址:https://download.csdn.net/download/qq475225253/87881171

一、背景

现在手头上有一份11万条关于微博留言的数据,下图列举了部分数据

其实数据非常简单,只包含两个字段,label 和review  

label是用来分类情感的,1是积极,0是消极 。review是具体的评价内容。

我们待会要实现的内容其实本质就是根据评价中的关键词字,进行情感分类。如果使用支持向量机或其他常见的通用分类算法进行分类,预计效果可能不太好。因为词字的前后顺序不同,所表达出来的感情是不一样的。所以我们这里待会采用专门处理时序有关的神经网络算法(LSTM)来进行建模。建模后测试,发现它的准确率能达到95%

二、数据处理

在构造模型前,我们首先要对数据进行处理,毕竟计算机没办法直接对文本进行机器学习。那要做那些数据处理呢?分词,去停用词,词向量。

在处理数据前,我们首先要把数据读取进来

#加载必要的模块
import pandas as pd
# 读取文本数据

data = pd.read_csv('weibo_senti_100k.csv')
data = data.dropna()   #去掉数据集的空值

接下来我们就依次来处理数据

1、分词

顾名思义,把评论分成一个一个的单词

import jieba
data['data_cut'] = data['review'].apply(lambda x: list(jieba.cut(x)))  #内嵌自定义函数来分词
data.head()

这里我们用到了一个第三方库jieba,需要使用pip单独安装。jieba是一个常用于中文分词的工具

2、去停用词

在分词后,我们得到了很多单词,但是这些单词中,有很多一部分与我们情感分析无关,是无效的单词,所以我们就要去掉它,防止它对我们机器学习带来干扰。具体的,我们首先定义了一个文件,加入叫“stopword.txt",这里面存放了常见的无效单词,只要在这里面的,我们就从分词得到的数据中去掉他们。

# ##  去停用词

# 读取停用词
with open('stopword.txt','r',encoding = 'utf-8') as f:  #读取停用词
    stop = f.readlines()
# 对停用词处理
import re
stop = [re.sub(' |\n|\ufeff','',r) for r in stop]   #替换停用词表的空格等

# 去除停用词
#把分词之后的文本根据停用词表去掉停用词
data['data_after'] = [[i for i in s if i not in stop] for s in data['data_cut']]
data.head()

3、词向量

至此,我们已经得到了有效的单词库了,但这些单词还不能直接用于机器学习,我们机器学习用到的特征一般都是用数值表达的。所以我们需要把上面处理好的单词,编码成数值,并放置到tensorflow能够处理的向量中。

# 构建词向量矩阵
w = [] 
for i in data['data_after']:  
    w.extend(i)  #将所有词语整合在一起  
num_data = pd.DataFrame(pd.Series(w).value_counts()) # 计算出所有单词的个数

num_data['id'] = list(range(1,len(num_data)+1))   #把这些数据增加序号

#  转化成数字
a = lambda x:list(num_data['id'][x])    #以序号为序定义实现函数
data['vec'] = data['data_after'].apply(a)  #apply()方法实现
data.head()

三、训练模型

# ##  数据集划分
from sklearn.model_selection import train_test_split
from keras.preprocessing import sequence  

maxlen = 128   #句子长度
vec_data = list(sequence.pad_sequences(data['vec'],maxlen=maxlen))   #把文本数据都统一长度
x,xt,y,yt = train_test_split(vec_data,data['label'],test_size = 0.2,random_state = 123)   #分割训练集--2-8原则

# 转换数据类型
import numpy as np
x = np.array(list(x))
y = np.array(list(y))
xt = np.array(list(xt))
yt = np.array(list(yt))

###由于数据量较大,运行时间太长,可选择其中的2000条训练,500条测试来验证模型
x=x[:2000,:]
y=y[:2000]
xt=xt[:500,:]
yt=yt[:500]



#模型构建

from keras.optimizers import SGD, RMSprop, Adagrad  
from keras.utils import np_utils  

from keras.models import Sequential  
from keras.layers.core import Dense, Dropout, Activation  
from keras.layers.embeddings import Embedding  
from keras.layers.recurrent import LSTM, GRU  



model = Sequential()  
model.add(Embedding(len(num_data['id'])+1,256))   # 输入层,词向量表示层
model.add(Dense(32, activation='sigmoid', input_dim=100))  # 全连接层,32层
model.add(LSTM(128))   # LSTM网络层
model.add(Dense(1))  # 全连接层--输出层
model.add(Activation('sigmoid'))    # 输出层的激活函数
model.summary()  #输出模型结构


#模型的画图表示
import matplotlib.pyplot as plt
import matplotlib.image as mpimg 
from keras.utils import plot_model
plot_model(model,to_file='Lstm2.png',show_shapes=True)
ls = mpimg.imread('Lstm2.png') # 读取和代码处于同一目录下的Lstm.png
plt.imshow(ls) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()


model.compile(loss='binary_crossentropy',optimizer='Adam',metrics=["accuracy"])  #模型融合

#训练模型
model.fit(x,y,validation_data=(x,y),epochs=15)


#模型验证
loss,accuracy=model.evaluate(xt,yt,batch_size=12)  # 测试集评估
print('Test loss:',loss)
print('Test accuracy:', accuracy)

  • 4
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在 Spyder 中进行微博文本情感分析的具体步骤如下: 1. 安装必要的 Python 包 对于微博文本情感分析,我们通常需要使用到一些 Python 包,例如 jieba 用于中文分词,pandas 用于数据处理,scikit-learn 用于机器学习等。在 Spyder 中可以使用 pip 命令来安装这些包,例如: ``` pip install jieba pip install pandas pip install scikit-learn ``` 2. 准备数据集 在进行微博文本情感分析之前,需要准备好相应的数据集。可以使用爬虫工具爬取微博文本数据或者使用公开的数据集。在 Spyder 中可以使用 pandas 包来读取和处理数据集,例如: ```python import pandas as pd # 读取数据集 data = pd.read_csv('weibo_sentiment.csv') # 查看数据集信息 print(data.info()) # 查看数据集前几行 print(data.head()) ``` 3. 文本预处理 在进行微博文本情感分析之前,需要对文本进行预处理,例如分词、去除停用词、去除标点符号等。在 Spyder 中可以使用 jieba 包进行中文分词,使用 re 包进行正则表达式匹配,例如: ```python import jieba import re # 对文本进行中文分词 def tokenize(text): text = ''.join(re.findall('[\u4e00-\u9fa5]', text)) tokens = jieba.lcut(text) return [token for token in tokens if token.isalpha()] # 进行文本预处理 data['text'] = data['text'].apply(tokenize) ``` 4. 特征提取 在进行微博文本情感分析之前,需要将文本转换为数值特征向量,以便进行机器学习算法的训练和预测。在 Spyder 中可以使用 scikit-learn 包进行特征提取,例如使用 CountVectorizer 进行词袋模型特征提取: ```python from sklearn.feature_extraction.text import CountVectorizer # 进行词袋模型特征提取 vectorizer = CountVectorizer() features = vectorizer.fit_transform(data['text'].apply(lambda x: ' '.join(x))) # 查看特征向量维度 print(features.shape) ``` 5. 模型训练 在进行微博文本情感分析之前,需要对机器学习模型进行训练。在 Spyder 中可以使用 scikit-learn 包进行模型训练,例如使用朴素贝叶斯算法进行情感分类: ```python from sklearn.naive_bayes import MultinomialNB from sklearn.model_selection import train_test_split # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(features, data['sentiment'], test_size=0.2, random_state=42) # 训练朴素贝叶斯模型 nb = MultinomialNB() nb.fit(X_train, y_train) # 在测试集上进行预测 y_pred = nb.predict(X_test) # 查看模型精度 from sklearn.metrics import accuracy_score print('Accuracy:', accuracy_score(y_test, y_pred)) ``` 6. 模型应用 在进行微博文本情感分析之后,可以应用训练好的模型对新的微博文本进行情感分析。在 Spyder 中可以使用训练好的模型进行预测,例如: ```python # 对新的微博文本进行情感分析 new_text = '今天天气真好' new_feature = vectorizer.transform([new_text]) new_sentiment = nb.predict(new_feature) print('Sentiment:', new_sentiment[0]) ``` 以上就是在 Spyder 中进行微博文本情感分析的基本步骤。需要注意的是,这只是一个简单的示例,实际上微博文本情感分析涉及到很多细节和难点,需要不断地优化和改善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘同敏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值