当前位置:   article > 正文

机器学习--微博文本情感分析_微博情感分析数据集

微博情感分析数据集

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

一、背景

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

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

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

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

二、数据处理

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

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

  1. #加载必要的模块
  2. import pandas as pd
  3. # 读取文本数据
  4. data = pd.read_csv('weibo_senti_100k.csv')
  5. data = data.dropna() #去掉数据集的空值

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

1、分词

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

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

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

2、去停用词

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

  1. # ## 去停用词
  2. # 读取停用词
  3. with open('stopword.txt','r',encoding = 'utf-8') as f: #读取停用词
  4. stop = f.readlines()
  5. # 对停用词处理
  6. import re
  7. stop = [re.sub(' |\n|\ufeff','',r) for r in stop] #替换停用词表的空格等
  8. # 去除停用词
  9. #把分词之后的文本根据停用词表去掉停用词
  10. data['data_after'] = [[i for i in s if i not in stop] for s in data['data_cut']]
  11. data.head()

3、词向量

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

  1. # 构建词向量矩阵
  2. w = []
  3. for i in data['data_after']:
  4. w.extend(i) #将所有词语整合在一起
  5. num_data = pd.DataFrame(pd.Series(w).value_counts()) # 计算出所有单词的个数
  6. num_data['id'] = list(range(1,len(num_data)+1)) #把这些数据增加序号
  7. # 转化成数字
  8. a = lambda x:list(num_data['id'][x]) #以序号为序定义实现函数
  9. data['vec'] = data['data_after'].apply(a) #apply()方法实现
  10. data.head()

三、训练模型

  1. # ## 数据集划分
  2. from sklearn.model_selection import train_test_split
  3. from keras.preprocessing import sequence
  4. maxlen = 128 #句子长度
  5. vec_data = list(sequence.pad_sequences(data['vec'],maxlen=maxlen)) #把文本数据都统一长度
  6. x,xt,y,yt = train_test_split(vec_data,data['label'],test_size = 0.2,random_state = 123) #分割训练集--2-8原则
  7. # 转换数据类型
  8. import numpy as np
  9. x = np.array(list(x))
  10. y = np.array(list(y))
  11. xt = np.array(list(xt))
  12. yt = np.array(list(yt))
  13. ###由于数据量较大,运行时间太长,可选择其中的2000条训练,500条测试来验证模型
  14. x=x[:2000,:]
  15. y=y[:2000]
  16. xt=xt[:500,:]
  17. yt=yt[:500]
  18. #模型构建
  19. from keras.optimizers import SGD, RMSprop, Adagrad
  20. from keras.utils import np_utils
  21. from keras.models import Sequential
  22. from keras.layers.core import Dense, Dropout, Activation
  23. from keras.layers.embeddings import Embedding
  24. from keras.layers.recurrent import LSTM, GRU
  25. model = Sequential()
  26. model.add(Embedding(len(num_data['id'])+1,256)) # 输入层,词向量表示层
  27. model.add(Dense(32, activation='sigmoid', input_dim=100)) # 全连接层,32
  28. model.add(LSTM(128)) # LSTM网络层
  29. model.add(Dense(1)) # 全连接层--输出层
  30. model.add(Activation('sigmoid')) # 输出层的激活函数
  31. model.summary() #输出模型结构
  32. #模型的画图表示
  33. import matplotlib.pyplot as plt
  34. import matplotlib.image as mpimg
  35. from keras.utils import plot_model
  36. plot_model(model,to_file='Lstm2.png',show_shapes=True)
  37. ls = mpimg.imread('Lstm2.png') # 读取和代码处于同一目录下的Lstm.png
  38. plt.imshow(ls) # 显示图片
  39. plt.axis('off') # 不显示坐标轴
  40. plt.show()
  41. model.compile(loss='binary_crossentropy',optimizer='Adam',metrics=["accuracy"]) #模型融合
  42. #训练模型
  43. model.fit(x,y,validation_data=(x,y),epochs=15)
  44. #模型验证
  45. loss,accuracy=model.evaluate(xt,yt,batch_size=12) # 测试集评估
  46. print('Test loss:',loss)
  47. print('Test accuracy:', accuracy)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/359391
推荐阅读
相关标签
  

闽ICP备14008679号