自然语言处理-文本情感分析

本文为笔者学习阿里云大学的基于LSTM的文本情感分析教学视频总结。

一、何为文本情感分析

其实也就是,用户输入了一句话,我们需要靠机器来知道这句话的情感,本文会以开心和不开心为例,来进行情感分析,有点像二分类,但并不是。

二、神经网络模型

这里提出使用的是LSTM,也叫做长短时记忆网络,该网络其实是RNN的衍生,主要是为针对RNN的缺点设计出来的,一个神经单元有遗忘门、输入门、输出门,该网络除了结构有所改变,其训练方法和其它NN一样,也是主要采用反向传播、梯度的方法。下面贴出其单个神经单元的结构图:
自然语言处理-文本情感分析_第1张图片
该结构继承了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("
"
, " ") 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

未完待续。。。

你可能感兴趣的