情感分析之电影评论分析-基于Tensorflow的LSTM
1. 深度學(xué)習(xí)在自然語言處理中的應(yīng)用
自然語言處理是教會(huì)機(jī)器如何去處理或者讀懂人類語言的系統(tǒng),目前比較熱門的方向,包括如下幾類:
對(duì)話系統(tǒng) - 比較著名的案例有:Siri,Alexa 和 Cortana。
情感分析 - 對(duì)一段文本進(jìn)行情感識(shí)別。
圖文映射 - 用一句話來描述一張圖片。
機(jī)器翻譯 - 將一種語言翻譯成另一種語言。
語音識(shí)別 - 讓電腦識(shí)別口語。
2. 情感分析基本方法
目前對(duì)情感分析的研究主要集中在兩個(gè)方面:識(shí)別給定的文本實(shí)體是主觀的還是客觀的,以及識(shí)別主觀的文本的極性。大多數(shù)情感分析研究都使用機(jī)器學(xué)習(xí)方法。
分析方法主要有以下三種:
- 詞法分(基于詞典的打分機(jī)制)
- 基于機(jī)器學(xué)習(xí)的分析
- 混合分析
下面簡(jiǎn)單介紹下這三種方法:
詞法分析運(yùn)用了由預(yù)標(biāo)記詞匯組成的字典,使用詞法分析將器將輸入文本轉(zhuǎn)化為單詞序列。將新的單詞與詞典中的詞匯進(jìn)行匹配。如果有一個(gè)積極的匹配,正分?jǐn)?shù)就加到分?jǐn)?shù)總池中。如果有一個(gè)消極的匹配,輸入文本的總分?jǐn)?shù)就會(huì)減少。最后文本的分類就取決于文本的總得分。目前有大量的工作致力于度量詞法信息的有效性。
機(jī)器學(xué)習(xí)具有高的適應(yīng)性和準(zhǔn)確性,也因此受到了越來越多的關(guān)注。在情感分析中主要使用的是監(jiān)督學(xué)習(xí)方法。可以分為三個(gè)階段:數(shù)據(jù)收集、預(yù)處理、訓(xùn)練分類。并且在訓(xùn)練過程中,需要提供一個(gè)標(biāo)記語料庫作為訓(xùn)練數(shù)據(jù)。分類器使用一系列特征向量對(duì)目標(biāo)數(shù)據(jù)進(jìn)行分類。
目前情感分析研究將兩種方法進(jìn)行組合,這樣既可以利用機(jī)器學(xué)習(xí)方法的高準(zhǔn)確性,又可以利用詞法分析的快速的特性。有研究者利用由兩個(gè)詞組成的詞匯和一個(gè)未標(biāo)記的數(shù)據(jù)作為訓(xùn)練集。思想是:首先將這些由兩個(gè)詞組成的詞匯劃分為積極的類和消極的類,然后把這些詞匯集合進(jìn)行向量化表示,每個(gè)類都有一個(gè)中心向量代表該類,然后計(jì)算未標(biāo)記詞和中心詞向量之間的余弦相似度,根據(jù)相似度將該文件劃分為積極和消極的類,最后把這些全部送進(jìn)分類器進(jìn)行分類。個(gè)人理解這里其實(shí)有點(diǎn)半監(jiān)督學(xué)習(xí)的意思。。
3. 實(shí)戰(zhàn)電影評(píng)論情感分析
該任務(wù)可以被認(rèn)為是從一個(gè)句子,一段話,或者是從一個(gè)文檔中,將作者的情感分為積極的,消極的或者中性的。這篇教程由多個(gè)主題組成,包括詞向量,循環(huán)神經(jīng)網(wǎng)絡(luò)和LSTM,tensorflow框架的搭建。
3.1 關(guān)于詞向量:
我們需要考慮不同形式的數(shù)據(jù),這些數(shù)據(jù)被用來作為機(jī)器學(xué)習(xí)或者深度學(xué)習(xí)模型的輸入數(shù)據(jù)。卷積神經(jīng)網(wǎng)絡(luò)使用像素值作為輸入,logistic回歸使用一些可以量化的特征值作為輸入,強(qiáng)化學(xué)習(xí)模型使用獎(jiǎng)勵(lì)信號(hào)來進(jìn)行更新。通常的輸入數(shù)據(jù)是需要被標(biāo)記的標(biāo)量值。
詞向量模型:
我們可以將一句話中的每一個(gè)詞都轉(zhuǎn)換成一個(gè)向量:輸入數(shù)據(jù)可以看成是一個(gè) 16*D 的矩陣
Word2Vec:
為了去得到這些詞嵌入,我們使用模型 “Word2Vec”。簡(jiǎn)單的說,這個(gè)模型根據(jù)上下文的語境來推斷出每個(gè)詞的詞向量。如果兩個(gè)個(gè)詞在上下文的語境中,可以被互相替換,那么這兩個(gè)詞的距離就非常近。在自然語言中,上下文的語境對(duì)分析詞語的意義是非常重要的。這個(gè)模型的作用就是從一大堆句子(以 Wikipedia 為例)中為每個(gè)獨(dú)一無二的單詞進(jìn)行建模,并且輸出一個(gè)唯一的向量。Word2Vec 模型的輸出被稱為一個(gè)嵌入矩陣。
這個(gè)嵌入矩陣包含訓(xùn)練集中每個(gè)詞的一個(gè)向量。傳統(tǒng)來講,這個(gè)嵌入矩陣中的詞向量數(shù)據(jù)會(huì)很大。
Word2Vec 模型根據(jù)數(shù)據(jù)集中的每個(gè)句子進(jìn)行訓(xùn)練,并且以一個(gè)固定窗口在句子上進(jìn)行滑動(dòng),根據(jù)句子的上下文來預(yù)測(cè)固定窗口中間那個(gè)詞的向量。然后根據(jù)一個(gè)損失函數(shù)和優(yōu)化方法,來對(duì)這個(gè)模型進(jìn)行訓(xùn)練。
具體的可以參考:
https://blog.csdn.net/lilong117194/article/details/82182869
https://blog.csdn.net/lilong117194/article/details/81979522
3.2 循環(huán)神經(jīng)網(wǎng)絡(luò)和LSTM
這方面的資料很多,這里不再重復(fù)講lstm相關(guān)的知識(shí)。
3.3 代碼實(shí)現(xiàn)
有了上面的基礎(chǔ),下面就進(jìn)行貼出代碼,整體流程如下:
1) 制作詞向量,可以使用gensim這個(gè)庫,也可以直接用現(xiàn)成的訓(xùn)練好的
2) 詞和ID的映射
3) 構(gòu)建RNN網(wǎng)絡(luò)架構(gòu)
4) 訓(xùn)練模型
5) 測(cè)試模型效果
整體的代碼為:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Aug 8 14:13:14 2018 @author: lilong """import numpy as np import time import datetime import os import re from random import randint from os.path import isfile, join import tensorflow as tf""" 使用訓(xùn)練好的詞向量模型,該矩陣包含400000x50的數(shù)據(jù);還有一個(gè)是400000的詞典 """wordsList = np.load('wordsList.npy') print('載入word列表:',np.shape(wordsList),type(wordsList)) # 這里轉(zhuǎn)化為列表,但是是[b'and', b'in', b'a', b'"', b"'s", b'for']的形式,即是二進(jìn)制編碼。 wordsList = wordsList.tolist() # 轉(zhuǎn)化為utf-8編碼的形式,['of', 'to', 'and', 'in', 'a', '"', "'s", 'for', '-',] wordsList = [word.decode('UTF-8') for word in wordsList] # 400000x50的嵌入矩陣,這個(gè)是訓(xùn)練好的詞典向量模型 wordVectors = np.load('wordVectors.npy') print('載入文本向量:',wordVectors.shape) #print(wordVectors[home_ndex]) # 得到對(duì)應(yīng)詞典中詞的50維向量""" 解析文件,數(shù)據(jù)預(yù)處理,得到正負(fù)評(píng)價(jià)下的文件 """# 這里得到了所有的正面評(píng)價(jià)文件夾pos下的文件路徑 pos_files = ['pos/' + f for f in os.listdir('pos/') if isfile(join('pos/', f))] # 這里得到了所有的neg文件夾下的文件路徑 neg_files = ['neg/' + f for f in os.listdir('neg/') if isfile(join('neg/', f))] num_words = [] # 這里的每個(gè)txt文件都是一行文本,12500都是正面評(píng)價(jià) for pf in pos_files:with open(pf, "r", encoding='utf-8') as f:line = f.readline()counter = len(line.split())num_words.append(counter) print('正面評(píng)價(jià)完結(jié)。。。') # 這里是12500負(fù)面評(píng)價(jià) for nf in neg_files:with open(nf, "r", encoding='utf-8') as f:line = f.readline()counter = len(line.split())num_words.append(counter) print('負(fù)面評(píng)價(jià)完結(jié)。。。') num_files = len(num_words) print('文件總數(shù):', num_files) print('所有的詞的數(shù)量:', sum(num_words)) print('平均文件的詞的長(zhǎng)度:', sum(num_words) / len(num_words))""" 輔助函數(shù):返回一個(gè)數(shù)據(jù)集的迭代器,用于返回一批訓(xùn)練集合""" max_seq_num = 250 num_dimensions = 50 # 每個(gè)單詞向量的維度,這里和嵌入矩陣的每個(gè)詞的維度相同# arr:24 x 250的矩陣 def get_train_batch():labels = []arr = np.zeros([batch_size, max_seq_num])for i in range(batch_size):if (i % 2 == 0):num = randint(1, 11499)labels.append([1, 0])else:num = randint(13499, 24999)labels.append([0, 1])arr[i] = ids[num - 1:num]return arr, labels# 同上 def get_test_batch():labels = []arr = np.zeros([batch_size, max_seq_num])for i in range(batch_size):num = randint(11499, 13499)if (num <= 12499):labels.append([1, 0])else:labels.append([0, 1])arr[i] = ids[num - 1:num]return arr, labels""" 構(gòu)建tensorflow圖"""batch_size = 24 # batch的尺寸 lstm_units = 64 # lstm的單元數(shù)量 num_labels = 2 # 輸出的類別數(shù) iterations = 200000 # 迭代的次數(shù) # 載入正負(fù)樣本的詞典映射 ids = np.load('idsMatrix.npy') print('載入IDS:',ids.shape) tf.reset_default_graph() # 確定好單元的占位符:輸入是24x300,輸出是24x2 labels = tf.placeholder(tf.float32, [batch_size, num_labels]) input_data = tf.placeholder(tf.int32, [batch_size, max_seq_num])# 必須先定義該變量 data = tf.Variable(tf.zeros([batch_size, max_seq_num, num_dimensions]), dtype=tf.float32) # 調(diào)用tf.nn.lookup()接口獲得文本向量,該函數(shù)返回batch_size個(gè)文本的3D張量,用于后續(xù)的訓(xùn)練 data = tf.nn.embedding_lookup(wordVectors, input_data)# 使用tf.contrib.rnn.BasicLSTMCell細(xì)胞單元配置lstm的數(shù)量 lstmCell = tf.contrib.rnn.BasicLSTMCell(lstm_units) # 配置dropout參數(shù),以此避免過擬合 lstmCell = tf.contrib.rnn.DropoutWrapper(cell=lstmCell, output_keep_prob=0.75) # 最后將LSTM cell和數(shù)據(jù)輸入到tf.nn.dynamic_rnn函數(shù),功能是展開整個(gè)網(wǎng)絡(luò),并且構(gòu)建一整個(gè)RNN模型 # 這里的value認(rèn)為是最后的隱藏狀態(tài),該向量將重新確定維度,然后乘以一個(gè)權(quán)重加上偏置,最終獲得lable value, _ = tf.nn.dynamic_rnn(lstmCell, data, dtype=tf.float32)weight = tf.Variable(tf.truncated_normal([lstm_units, num_labels])) bias = tf.Variable(tf.constant(0.1, shape=[num_labels])) value = tf.transpose(value, [1, 0, 2]) last = tf.gather(value, int(value.get_shape()[0]) - 1) prediction = (tf.matmul(last, weight) + bias)# 定義正確的預(yù)測(cè)函數(shù)和正確率評(píng)估參數(shù) correctPred = tf.equal(tf.argmax(prediction, 1), tf.argmax(labels, 1)) accuracy = tf.reduce_mean(tf.cast(correctPred, tf.float32))# 最后將標(biāo)準(zhǔn)的交叉熵?fù)p失函數(shù)定義為損失值,這里是以adam為優(yōu)化函數(shù) loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=prediction, labels=labels)) optimizer = tf.train.AdamOptimizer().minimize(loss)sess = tf.InteractiveSession() saver = tf.train.Saver() sess.run(tf.global_variables_initializer())tf.summary.scalar('loss',loss) tf.summary.scalar('Accrar',accuracy) merged=tf.summary.merge_all() logdir='tensorboard/'+ datetime.datetime.now().strftime("%Y%m%d-%H%M%S")+"/" writer=tf.summary.FileWriter(logdir,sess.graph)iterations = 100000 for i in range(iterations):# 下個(gè)批次的數(shù)據(jù)next_batch, next_batch_labels = get_train_batch()sess.run(optimizer,{input_data: next_batch, labels: next_batch_labels}) # 每50次寫入一次leadboardif(i%50==0):summary=sess.run(merged,{input_data: next_batch, labels: next_batch_labels})writer.add_summary(summary,i)if (i%1000==0):loss_ = sess.run(loss, {input_data: next_batch, labels: next_batch_labels})accuracy_=(sess.run(accuracy, {input_data: next_batch, labels: next_batch_labels})) * 100print("iteration:{}/{}".format(i+1, iterations),"\nloss:{}".format(loss_),"\naccuracy:{}".format(accuracy_)) print('..........') # 每10000次保存一下模型if(i%10000==0 and i!=0):save_path=saver.save(sess,"models/pretrained_lstm.ckpt",gloal_step=i)print("saved to %s"% save_path)writer.close()運(yùn)行結(jié)果:
載入word列表: (400000,) <class 'numpy.ndarray'> 載入文本向量: (400000, 50) 正面評(píng)價(jià)完結(jié)。。。 負(fù)面評(píng)價(jià)完結(jié)。。。 文件總數(shù): 25000 所有的詞的數(shù)量: 5844680 平均文件的詞的長(zhǎng)度: 233.7872 載入IDS: (25000, 250) iteration:1/100000 loss:0.7998574376106262 accuracy:58.33333134651184 .......... iteration:1001/100000 loss:0.6967594027519226 accuracy:54.16666865348816 .......... iteration:2001/100000 loss:0.6576123237609863 accuracy:62.5 .......... iteration:3001/100000 loss:0.6840474605560303 accuracy:62.5 .......... iteration:4001/100000 loss:0.6713441014289856 accuracy:58.33333134651184 .......... iteration:5001/100000 loss:0.6841540932655334 accuracy:54.16666865348816 .......... iteration:6001/100000 loss:0.7225241661071777 accuracy:66.66666865348816 .......... . . .注意:這里的所有運(yùn)行中用到的準(zhǔn)備文件都是提前訓(xùn)練好的,下面會(huì)有介紹。
由于時(shí)間問題這里沒有跑完所有的訓(xùn)練迭代輪數(shù),但可以看到在每個(gè)batch下的損失率和準(zhǔn)確率。
下面拆解整體的流程:
(1) 導(dǎo)入數(shù)據(jù)
首先,我們需要去創(chuàng)建詞向量。為了簡(jiǎn)單起見,我們使用訓(xùn)練好的模型來創(chuàng)建。
作為該領(lǐng)域的一個(gè)最大玩家,Google 已經(jīng)幫助我們?cè)诖笠?guī)模數(shù)據(jù)集上訓(xùn)練出來了 Word2Vec 模型,包括 1000 億個(gè)不同的詞!在這個(gè)模型中,谷歌能創(chuàng)建 300 萬個(gè)詞向量,每個(gè)向量維度為 300。
在理想情況下,我們將使用這些向量來構(gòu)建模型,但是因?yàn)檫@個(gè)單詞向量矩陣相當(dāng)大(3.6G),我們用另外一個(gè)現(xiàn)成的小一些的,該矩陣由 GloVe 進(jìn)行訓(xùn)練得到。矩陣將包含 400000 個(gè)詞向量,每個(gè)向量的維數(shù)為 50。上面的代碼也是用的這個(gè)詞向量。
我們將導(dǎo)入兩個(gè)不同的數(shù)據(jù)結(jié)構(gòu),一個(gè)是包含 400000 個(gè)單詞的 Python 列表,這個(gè)相當(dāng)于詞典,主要是為了產(chǎn)生新輸入的句子中的每一個(gè)詞的索引值。一個(gè)是包含所有單詞向量值得 400000*50 維的嵌入矩陣。
也可以在詞庫中搜索單詞,比如 “baseball”,然后可以通過訪問嵌入矩陣來得到相應(yīng)的向量,如下:
baseballIndex = wordsList.index('baseball') wordVectors[baseballIndex]所以詞向量庫的詞和列表的詞的索引是一一對(duì)應(yīng)的。
(2) 訓(xùn)練數(shù)據(jù)中的每個(gè)樣本的長(zhǎng)度的確定:
在整個(gè)訓(xùn)練集上面構(gòu)造索引之前,我們先花一些時(shí)間來可視化我們所有的數(shù)據(jù)。這將幫助我們?nèi)Q定如何設(shè)置最大序列長(zhǎng)度的最佳值。訓(xùn)練集我們使用的是 IMDB 數(shù)據(jù)集。但這個(gè)值在很大程度上取決于你輸入的數(shù)據(jù)。這里的數(shù)據(jù)集包含 25000 條電影數(shù)據(jù),其中 12500 條正向數(shù)據(jù),12500 條負(fù)向數(shù)據(jù)。這些數(shù)據(jù)都是存儲(chǔ)在一個(gè)文本文件中,首先我們需要做的就是去解析這個(gè)文件。正向數(shù)據(jù)包含在一個(gè)文件中,負(fù)向數(shù)據(jù)包含在另一個(gè)文件中。
可視化為:
可視化圖:
由圖可以看出大部分的文本都在230之內(nèi),這里我的設(shè)置是250,也就是為訓(xùn)練樣本中的每個(gè)樣本提前開辟一個(gè)空間,用于存儲(chǔ)樣本向量。
(3) 得到索引矩陣
這是一個(gè)計(jì)算成本非常高的過程,這里使用的是提前運(yùn)行保存的索引矩陣文件。當(dāng)然了如果是自己的項(xiàng)目,那肯定要自己跑代碼,等運(yùn)行結(jié)果了。代碼如下:
運(yùn)行會(huì)得到全部電影訓(xùn)練集的索引矩陣,大小是25000 * 250 的矩陣
(4) 得到詞向量:
對(duì)于一個(gè)新輸入的句子或者文本,為了得到其詞向量,我們可以使用 TensorFlow 的嵌入函數(shù):tf.nn.embedding_lookup。這個(gè)函數(shù)有兩個(gè)參數(shù),一個(gè)是嵌入矩陣(在我們的情況下是詞向量矩陣),另一個(gè)是每個(gè)詞對(duì)應(yīng)的索引。如下:
運(yùn)行結(jié)果:
輸出數(shù)據(jù)是一個(gè) 10*50 的詞矩陣,其中包括 10 個(gè)詞,每個(gè)詞的向量維度是 50,就是去找到這些詞對(duì)應(yīng)的向量,這里只是作為一個(gè)示例。
數(shù)據(jù)管道如下:
(5) 批訓(xùn)練集函數(shù):
def getTrainBatch():和def getTestBatch():
上面兩個(gè)函數(shù)的功能就是構(gòu)造訓(xùn)練集和測(cè)試集的每一批樣本,可以發(fā)現(xiàn)有如下區(qū)間:
[1?11500]([11500?12500][12500?13500])[13500?25000][1?11500]([11500?12500][12500?13500])[13500?25000]
訓(xùn)練集中的每一批次正負(fù)樣本都有,又能保證測(cè)試集里的樣本沒有在訓(xùn)練集中出現(xiàn)過。
(6) RNN Model
- 當(dāng)確定好好兩個(gè)占位符,一個(gè)用于數(shù)據(jù)輸入,另一個(gè)用于標(biāo)簽數(shù)據(jù)。對(duì)于占位符,最重要的一點(diǎn)就是確定好維度。這里的標(biāo)簽占位符代表一組值,每一個(gè)值都為 [1,0] 或者 [0,1],這個(gè)取決于數(shù)據(jù)是正向的還是負(fù)向的。輸入占位符,是一個(gè)整數(shù)化的索引數(shù)組。一旦,我們?cè)O(shè)置了我們的輸入數(shù)據(jù)占位符,我們可以調(diào)用 tf.nn.embedding_lookup() 函數(shù)來得到我們的詞向量。該函數(shù)最后將返回一個(gè)三維向量,第一個(gè)維度是批處理大小,第二個(gè)維度是句子長(zhǎng)度,第三個(gè)維度是詞向量長(zhǎng)度。
- 堆棧 LSTM 網(wǎng)絡(luò)是一個(gè)比較好的網(wǎng)絡(luò)架構(gòu)。也就是前一個(gè)LSTM 隱藏層的輸出是下一個(gè)LSTM的輸入。堆棧LSTM可以幫助模型記住更多的上下文信息,但是帶來的弊端是訓(xùn)練參數(shù)會(huì)增加很多,模型的訓(xùn)練時(shí)間會(huì)很長(zhǎng),過擬合的幾率也會(huì)增加。如果你想了解更多有關(guān)堆棧LSTM,可以查看TensorFlow的官方教程。
- dynamic RNN 函數(shù)的第一個(gè)輸出可以被認(rèn)為是最后的隱藏狀態(tài)向量。這個(gè)向量將被重新確定維度,然后乘以最后的權(quán)重矩陣和一個(gè)偏置項(xiàng)來獲得最終的輸出值。
- 標(biāo)準(zhǔn)的交叉熵?fù)p失函數(shù)來作為損失值。對(duì)于優(yōu)化器,我們選擇 Adam,并且采用默認(rèn)的學(xué)習(xí)率
(7) 超參數(shù)調(diào)整
選擇合適的超參數(shù)來訓(xùn)練你的神經(jīng)網(wǎng)絡(luò)是至關(guān)重要的。你會(huì)發(fā)現(xiàn)你的訓(xùn)練損失值與你選擇的優(yōu)化器(Adam,Adadelta,SGD,等等),學(xué)習(xí)率和網(wǎng)絡(luò)架構(gòu)都有很大的關(guān)系。特別是在RNN和LSTM中,單元數(shù)量和詞向量的大小都是重要因素。
- 學(xué)習(xí)率:RNN最難的一點(diǎn)就是它的訓(xùn)練非常困難,因?yàn)闀r(shí)間步驟很長(zhǎng)。那么,學(xué)習(xí)率就變得非常重要了。如果我們將學(xué)習(xí)率設(shè)置的很大,那么學(xué)習(xí)曲線就會(huì)波動(dòng)性很大,如果我們將學(xué)習(xí)率設(shè)置的很小,那么訓(xùn)練過程就會(huì)非常緩慢。根據(jù)經(jīng)驗(yàn),將學(xué)習(xí)率默認(rèn)設(shè)置為 0.001 是一個(gè)比較好的開始。如果訓(xùn)練的非常緩慢,那么你可以適當(dāng)?shù)脑龃筮@個(gè)值,如果訓(xùn)練過程非常的不穩(wěn)定,那么你可以適當(dāng)?shù)臏p小這個(gè)值。
- 優(yōu)化器:這個(gè)在研究中沒有一個(gè)一致的選擇,但是 Adam 優(yōu)化器被廣泛的使用。
- LSTM單元的數(shù)量:這個(gè)值很大程度上取決于輸入文本的平均長(zhǎng)度。而更多的單元數(shù)量可以幫助模型存儲(chǔ)更多的文本信息,當(dāng)然模型的訓(xùn)練時(shí)間就會(huì)增加很多,并且計(jì)算成本會(huì)非常昂貴。
- 詞向量維度:詞向量的維度一般我們?cè)O(shè)置為50到300。維度越多意味著可以存儲(chǔ)更多的單詞信息,但是你需要付出的是更昂貴的計(jì)算成本。
(8) 訓(xùn)練過程
最好使用GPU進(jìn)行訓(xùn)練,訓(xùn)練會(huì)用幾個(gè)小時(shí)的時(shí)間,當(dāng)然了,這要看硬件。。
上面也就是訓(xùn)練的過程,也可以同時(shí)在訓(xùn)練的同時(shí),通過保存的模型來進(jìn)行測(cè)試集的測(cè)試,但是我這里一直報(bào)錯(cuò):
NotFoundError (see above for traceback): Key rnn/basic_lstm_cell/bias not found in checkpoint我的這個(gè)心啊。。。
改天再搞!!!
4. 語法使用
在使用中需要注意的地方有:
4.1 tensorflow的tf.argmax() 用法:
tf.argmax(input, dimension, name=None)
- dimension=0 按列找
- dimension=1 按行找
- tf.argmax()返回最大數(shù)值的下標(biāo)
通常和tf.equal()一起使用,計(jì)算模型準(zhǔn)確度,下面是使用:
輸出:
4 [3 2 2] [2 0 2 0]4.2 tf.gather用法
簡(jiǎn)單說就是獲得相應(yīng)下標(biāo)的數(shù)據(jù):
import tensorflow as tftemp = tf.range(0,10)*10 + tf.constant(1,shape=[10]) temp2 = tf.gather(temp,[1,5,9]) with tf.Session() as sess:print (tf.range(0,10)*10)print (tf.constant(1,shape=[10]))print (sess.run(temp))print (sess.run(temp2))輸出:
Tensor("mul_1:0", shape=(10,), dtype=int32) Tensor("Const_1:0", shape=(10,), dtype=int32) [ 1 11 21 31 41 51 61 71 81 91] [11 51 91]注意:
macOS下的新建文件夾會(huì)自動(dòng)生成一個(gè).DS_Store的文件,會(huì)影響文件的讀取,下面簡(jiǎn)單介紹下:
DS_Store 是給Finder用來存儲(chǔ)這個(gè)文件夾的顯示屬性的:比如文件圖標(biāo)的擺放位置。刪除以后的副作用就是這些信息的失去。
2 關(guān)閉.DS_Store的方法:
步驟一:刪除所有隱藏.DS_store文件,打開命令行窗口
步驟二: 設(shè)置不再產(chǎn)生選項(xiàng), 執(zhí)行如下命令
defaults write com.apple.desktopservices DSDontWriteNetworkStores true本文的代碼是學(xué)習(xí)自:《pytho自然語言處理實(shí)戰(zhàn) 核心技術(shù)與算法》
https://github.com/nlpinaction/learning-nlp/tree/master/chapter-8/sentiment-analysis
參考:https://www.aliyun.com/jiaocheng/517649.html
總結(jié)
以上是生活随笔為你收集整理的情感分析之电影评论分析-基于Tensorflow的LSTM的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高管的定义是什么意思(高管的定义)
- 下一篇: tensorflow加载训练好的模型实例