南京做网站群的公司,求网站建设,肇庆网站建设维护,北京app开发文章目录 1 自然语言情感分析简介2 实际操作3 文字情感分析建模3.1 多层全连接神经网络训练情感分析 1 自然语言情感分析简介
深度学习可以模拟词与词之间的联系#xff0c;有局部特征抽象化和记忆功能推特已经公开了他们的情感分析API(http://help.sentiment140.com/api)有局部特征抽象化和记忆功能推特已经公开了他们的情感分析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 数据集。IMDbInternet 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,binsrange(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,maxlenmaxword)
x_test sequence.pad_sequences(x_test,maxlenmaxword)
vocab_size np.max([np.max(x_train[i]) for i in range(x_train.shape[0])])1model Sequential()
model.add(Embedding(vocab_size,64,input_lengthmaxword))model.add(Flatten())model.add(Dense(2000,activationrelu))
model.add(Dense(500,activationrelu))
model.add(Dense(200,activationrelu))
model.add(Dense(50,activationrelu))
model.add(Dense(1,activationsigmoid))model.compile(lossbinary_crossentropy,optimizeradam,metrics[accuracy])
print(model.summary())model.fit(x_train,y_train,validation_data(x_test,y_test),epochs20,batch_size100,verbose1)score model.evaluate((x_test,y_test))代码解释使用Keras加载IMDB电影评论数据集。该数据集包含带有情感标签正面或负面的电影评论。这部分对电影评论序列进行填充确保它们具有相同的长度。maxlen参数指定了填充后的最大长度vocab_size表示词汇表的大小。这部分定义了一个简单的神经网络模型包括嵌入层、展平层和几个全连接层。模型的最终输出层使用sigmoid激活函数适用于二元分类问题。这部分编译了模型指定了损失函数、优化器和评估指标。然后通过fit方法训练模型使用训练数据和验证数据进行20个时期的训练每批次大小为100。最后通过使用测试数据评估模型的性能并将结果存储在score变量中。