自然语言情感分析

1 自然语言情感分析简介

  • 深度学习可以模拟词与词之间的联系,有局部特征抽象化和记忆功能
  • 推特已经公开了他们的情感分析API(http://help.sentiment140.com/api),大家可以把其整合到自己的应用程序中,也可以试着开发一套自己的API
  • 下面通过一个电影评论的例子详细讲解深度学习在情感分析中的关键技术

2 实际操作

  • 第一步:文字分词,英文分词可以按照空格分词,中文分词可以参考jieba
  • 第二步:建立字典,给每个词标号
  • 第三步:把段落按字典翻译成数字,变成一个array
  • 先安装必要的软件包
pip install numpy scipy
pip install scikit-learn
pip install pillow
pip install h5py
  • 从 Keras 库中导入 IMDb 数据集。IMDb(Internet Movie Database)是一个在线电影数据库,而在机器学习领域,IMDb 数据集通常指的是包含电影评论的数据集
  • 对于 x_train[0],它返回训练集中的第一个评论样本。这个评论样本是一个整数序列,其中每个整数代表字典中的一个单词。IMDb 数据集中的每个单词都被映射到一个整数,其中整数值表示该单词在整个数据集中的频率排名
  • 通过 print(x_train[0]) 打印出训练集中第一个评论的整数序列
  • 这里的每个数字代表 IMDb 数据集中的一个单词,但是为了方便存储和处理,这些单词已经被映射成整数。在这个序列中,每个整数对应于评论中的一个单词。实际的整数值不重要,因为它们只是一个索引,而不是真正的单词。你可以使用 IMDb 数据集提供的字典来将这些整数还原为对应的单词。
import keras
import numpy as np
from keras.datasets import imdb
(x_train,x_test),(y_train,y_test) = imdb.load_data()

x_train[0]
  • avg_len = list(map(len, x_train)): 这一行代码使用 map 函数将 len 函数应用于 x_train 中的每个评论序列。len 函数用于获取列表、字符串或其他可迭代对象的长度。map(len, x_train) 返回一个迭代器,其中包含了每个评论序列的长度。然后,通过 list() 将这个迭代器转换为列表,得到 avg_len。
  • print(np.mean(avg_len)): 这一行代码使用 NumPy 库中的 np.mean 函数计算 avg_len 列表中所有元素的平均值,即评论序列的平均长度。np.mean 接受一个数组作为输入,并返回数组中所有元素的平均值。
print(x_train.shape)
print(y_train.shape)

avg_len = list(map(len,x_train))
print(np.mean(avg_len))
  • 为了直观的显示,可以画一个分布图
import matplotlib.pyplot as plt
plt.hist(avg_len,bins=range(min(avg_len),max(avg_len)+50,50))
plt.show()

3 文字情感分析建模

  • 为了克服文字长短不均和将词与词之间的联系纳入模型中的困难,人们使用了一种技术“ 词嵌入技术”
  • 通俗来讲就是给每个词都赋一个向量,向量代表空间里面的点,含义接近的词,其向量也接近,这样词的操作就转化成向量之间的操作了
  • 在深度学习中,这被叫做张量(Tensor)
  • 第一,可以克服文字长短不均的问题,第二,词本身无法形成特征,第三,文本是由词组成的
  • 词嵌入的最经典作品是Word2Vec,通过对具有数十亿词的新闻文章进行训练,其主要思想依然是把词表示成向量的形式,而不是One Hot编码

3.1 多层全连接神经网络训练情感分析

  • Keras提供了嵌入层(Embedding Layer)的模版,还有sequence.pad_sequences函数帮我们做了文本的处理和填充工作
  • 完整代码如下
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
import keras
import numpy as np
from keras.datasets import imdb
(x_train,y_train),(x_test,y_test) = imdb.load_data()

m = max(list(map(len,x_train)),list(map(len,x_test)))
# print(m)

maxword = 400
x_train = sequence.pad_sequences(x_train,maxlen=maxword)
x_test = sequence.pad_sequences(x_test,maxlen=maxword)
vocab_size = np.max([np.max(x_train[i]) for i in range(x_train.shape[0])])+1

model = Sequential()
model.add(Embedding(vocab_size,64,input_length=maxword))

model.add(Flatten())

model.add(Dense(2000,activation='relu'))
model.add(Dense(500,activation='relu'))
model.add(Dense(200,activation='relu'))
model.add(Dense(50,activation='relu'))
model.add(Dense(1,activation='sigmoid'))

model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
print(model.summary())

model.fit(x_train,y_train,validation_data=(x_test,y_test),epochs=20,batch_size=100,verbose=1)

score = model.evaluate((x_test,y_test))
  • 代码解释:
  • 使用Keras加载IMDB电影评论数据集。该数据集包含带有情感标签(正面或负面)的电影评论。这部分对电影评论序列进行填充,确保它们具有相同的长度。maxlen参数指定了填充后的最大长度,vocab_size表示词汇表的大小。这部分定义了一个简单的神经网络模型,包括嵌入层、展平层和几个全连接层。模型的最终输出层使用sigmoid激活函数,适用于二元分类问题。这部分编译了模型,指定了损失函数、优化器和评估指标。然后,通过fit方法训练模型,使用训练数据和验证数据,进行20个时期的训练,每批次大小为100。最后,通过使用测试数据评估模型的性能,并将结果存储在score变量中。
  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

没有难学的知识

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

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

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

打赏作者

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

抵扣说明:

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

余额充值