赞
踩
本文为笔者学习阿里云大学的基于LSTM的文本情感分析教学视频总结。
其实也就是,用户输入了一句话,我们需要靠机器来知道这句话的情感,本文会以开心和不开心为例,来进行情感分析,有点像二分类,但并不是。
这里提出使用的是LSTM,也叫做长短时记忆网络,该网络其实是RNN的衍生,主要是为针对RNN的缺点设计出来的,一个神经单元有遗忘门、输入门、输出门,该网络除了结构有所改变,其训练方法和其它NN一样,也是主要采用反向传播、梯度的方法。下面贴出其单个神经单元的结构图:
该结构继承了RNN的记忆功能,也改善了RNN不能够排除掉很久以前的信息,在文本处理中,可能现阶段的文本与很久之前的文本没有一丁点关系了,但是RNN依然保留了很久之前的信息,不能排除。但LSTM由于有遗忘门,便可以“慢慢遗忘”之前无关的信息。具体是有公式证明,推荐去了解一下。
这个问题应该是自然处理领域最基本也是最重要的问题,众所周知,机器只能够处理数字,那我们便需要了解如何将文字转换成数字呢?
一般,一句话是由很多个单词构成,或者简称词。如果我们知道了如何用数字来表示词,那是不是就可以知道怎么表示一段话了。
当前自然语言处理研究都是先训练出自己所需要的词向量,也就是每一个词对应的向量。比如,“机器”这个词可以用[1,2,3,4,5,6,4,7,8,…],这样的多维向量来表示,那么机器也也就可以处理了,得到词向量也有一个专业名词——word2vec。有兴趣也可以去检索一下,这里就不赘述了。且本文使用的词向量使用的是别人已经训练好的,这样覆盖面也会更广。(等我拿到算力超好的计算机,我也试着训练一个。)
①首先加载词向量的模型
②加载训练数据
③对吃进的数据进行预处理,装其使用词向量表示,此文由于使用tensorflow,比如“我”这个词,在此模型中找的是词的在词向量模型中的索引。所以假设一句话有20个词,如果一个词向量是50维的向量,那最后处理的是一个20 × 50的词矩阵。最后达到满足网络模型的输入要求。
④构建网络模型,设置网络需要的参数,训练。
5.1 加载词向量模型:
"""
首先需要获得词向量,词向量可以通过自己训练,也就是word2vec。
这里使用别人已经使用好的词向量模型,英文的
"""
wordsList = np.load('./training_data/wordsList.npy')
print('Loaded the word list!')
wordsList = wordsList.tolist()
wordsList = [word.decode('UTF-8') for word in wordsList]
wordVectors = np.load('./training_data/wordVectors.npy')
print ('Loaded the word vectors!')
5.2 读取数据
由于获取的数据集是一个一个的txt文件,且分别存放于两个文件夹,首先把文件位置都读到放进一个列表,然后在for循环里依次读取各个文件的各行,并统计词数目。
positiveFiles = ['./training_data/positiveReviews/' + f for f in listdir('./training_data/positiveReviews/') if isfile(join('./training_data/positiveReviews/', f))]
negativeFiles = ['./training_data/negativeReviews/' + f for f in listdir('./training_data/negativeReviews/') if isfile(join('./training_data/negativeReviews/', f))]
for pf in positiveFiles:
with open(pf, "r", encoding='utf-8') as f:
line=f.readline()
counter = len(line.split())
numWords.append(counter)
print('Positive files finished')
for nf in negativeFiles:
with open(nf, "r", encoding='utf-8') as f:
line=f.readline()
counter = len(line.split())
numWords.append(counter)
print('Negative files finished')
5.3 数据预处理
先对数据进行处理:只要字母数字,其它都不要
import re
strip_special_chars = re.compile("[^A-Za-z0-9 ]+")
def cleanSentences(string):
string = string.lower().replace("<br />", " ")
return re.sub(strip_special_chars, "", string.lower())
接着基于此方法,找这句话所有词对应的词向量。我们通过前面对段话大概的单词做出估计,每段话250词左右,那输出的的便是一个250 * 50的词矩阵,因为这个词向量模型是50维度的。
firstFile = np.zeros((maxSeqLength), dtype='int32')
with open(fname) as f:
indexCounter = 0
line=f.readline()
cleanedLine = cleanSentences(line)
split = cleanedLine.split()
for word in split:
try:
firstFile[indexCounter] = wordsList.index(word)
except ValueError:
firstFile[indexCounter] = 399999 #Vector for unknown words
indexCounter = indexCounter + 1
然后重复此方法便可以完成数据集的处理。
ids = np.zeros((numFiles, maxSeqLength), dtype='int32') fileCounter = 0 for pf in positiveFiles: with open(pf, "r") as f: indexCounter = 0 line=f.readline() cleanedLine = cleanSentences(line) split = cleanedLine.split() for word in split: try: ids[fileCounter][indexCounter] = wordsList.index(word) except ValueError: ids[fileCounter][indexCounter] = 399999 #Vector for unkown words indexCounter = indexCounter + 1 if indexCounter >= maxSeqLength: break fileCounter = fileCounter + 1 for nf in negativeFiles: with open(nf, "r") as f: indexCounter = 0 line=f.readline() cleanedLine = cleanSentences(line) split = cleanedLine.split() for word in split: try: ids[fileCounter][indexCounter] = wordsList.index(word) except ValueError: ids[fileCounter][indexCounter] = 399999 #Vector for unkown words indexCounter = indexCounter + 1 if indexCounter >= maxSeqLength: break fileCounter = fileCounter + 1
5.4 搭建模型,由于使用到了LSTM,则基于tensorflow搭建模型。
"""
下面的几个参数为神经网络模型的基本参数
batchsize:训练一次网络,给多少样本,这个值可以自己设置,但必须位于1到样本总数之间
lstmUnits:LSTM神经单元个数
numClasses:有多少个分类
iterations:训练次数
"""
batchSize = 24
lstmUnits = 64
numClasses = 2
iterations = 50000
未完待续。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。