步驟:
影評文字——數(shù)據(jù)預(yù)處理——features(特征)——深度學(xué)習(xí)模型——預(yù)測——預(yù)測結(jié)果。
步驟1:讀取IMDB數(shù)據(jù)集;
步驟2:建立token字典;
步驟3:使用token字典將“影評文字”轉(zhuǎn)化為“數(shù)字列表”
步驟4:截長補短讓所有“數(shù)字列表”長度都是100
步驟5:Embedding層將“數(shù)字列表”轉(zhuǎn)化為"向量列表";
步驟6:將向量列表送入深度學(xué)習(xí)模型進(jìn)行訓(xùn)練
具體:
步驟1:讀取IMDB數(shù)據(jù)集;
下載數(shù)據(jù)集:網(wǎng)址:http://ai.stanford.edu/~amaas/data/sentiment
1.導(dǎo)入所需模塊
import urllib.request #導(dǎo)入urllib模塊,將用于下載文件
import os ?#導(dǎo)入os模塊,用于確定文件是否存在
import tarfile #用于解壓文件
2.下載數(shù)據(jù)集
url="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz" #設(shè)置下載地址
filepath="data/aclImdb_v1.tar.gz" #設(shè)置存儲文件的路徑
#判斷文件不存在就會下載文件
if not os.path.isfile(filepath):?
? ? result=urllib.request.urlretrieve(url,filepath)
? ? print('downloaded:',result)
結(jié)果截圖:

3.解壓壓縮下載文件
if not os.path.exists("data/aclImdb"): #判斷解壓壓縮文件是否存在
? ? tfile = tarfile.open("data/aclImdb_v1.tar.gz", 'r:gz') #打開壓縮文件
? ? result=tfile.extractall('data/') #解壓文件到data目錄中

4. 讀取數(shù)據(jù)集
(1)導(dǎo)入所需模塊
from keras.datasets import imdb
from keras.preprocessing import sequence ?#導(dǎo)入sequence模塊,用于讓”數(shù)字列表“長度一致
from keras.preprocessing.text import Tokenizer ?#導(dǎo)入tokenizer模塊,用于建立字典
(2) 創(chuàng)建rm_tag函數(shù)刪除文字中的HTML標(biāo)簽
import re #導(dǎo)入Regular Expression 模塊
def rm_tags(text): #創(chuàng)建rm_tags函數(shù),輸入?yún)?shù)text文字
? ? re_tag = re.compile(r'<[^>]+>') #創(chuàng)建re_tag為正規(guī)表達(dá)式變量
? ? return re_tag.sub('', text) #將文本中符合正則表達(dá)式條件的字符替換成空字符
(3)創(chuàng)建read_files函數(shù)讀取IMDb文件目錄
【注:acImdb文件夾分為:train文件夾(12500正(pos),12500負(fù)(neg))和test集】
import os
def read
_files(filetype): #讀取訓(xùn)練數(shù)據(jù)時,filetype參數(shù)會傳入”train“;測試數(shù)據(jù)傳入test
? ? path = "data/aclImdb/"
? ? file_list=[] ?#創(chuàng)建文件列表
? ? positive_path=path + filetype+"/pos/" #設(shè)置正面評價的文件目錄為?positive_path
? ? for f in os.listdir(positive_path): #使用for循環(huán)將?positive_path目錄下所有文件加入file_list
? ? ? ? file_list+=[positive_path+f]
#負(fù)面評價
? ? negative_path=path + filetype+"/neg/" ?
? ? for f in os.listdir(negative_path):
? ? ? ? file_list+=[negative_path+f]
#顯示當(dāng)前讀取的filetype(test或train)目錄下的文件個數(shù)
? ? print('read',filetype, 'files:',len(file_list))
? ? all_labels = ([1] * 12500 + [0] * 12500)
? ? all_texts? = [] ?
? ? for fi in file_list: ? #fi讀取file_list所有文件
? ? ? ? with open(fi,encoding='utf8') as file_input: # 打開文件
? ? ? ? ? ? all_texts += [rm_tags(" ".join(file_input.readlines()))] ?# file_input.readlines()讀取文件;join連接文件內(nèi)容,rm_tags刪除tag,最后加入all_texts list
? ? return all_labels,all_texts
(4) 讀取INDb數(shù)據(jù)目錄
y_train,train_text=read_files("train")
y_test,test_text=read_files("test")
結(jié)果:訓(xùn)練集和測試集各25000項文字和25000項標(biāo)簽(1正0負(fù)),其中正:0-12499;負(fù):12500-24999

查看IMDB數(shù)據(jù)結(jié)果截圖:

步驟2:建立token字典
深度學(xué)習(xí)模型只能接受數(shù)字,所以我們將“影評文字”轉(zhuǎn)化為“數(shù)字列表”。
要如何轉(zhuǎn)化呢?當(dāng)我們把一種語言翻譯成另一種語言,必須要有字典。相同的,文字轉(zhuǎn)化為數(shù)字,也必須有字典。Keras提供了Tokenizer模塊,類似字典功能。
1.建立token
token = Tokenizer(num_words=2000) ?#建立一個有2000單詞的字典
token.fit_on_texts(train_text) #按單詞出現(xiàn)次數(shù)排序,排序前2000的單詞會列入詞典中
2.查看token讀了多少文章

3.查看token.word_index屬性

步驟3:使用token字典將“影評文字”轉(zhuǎn)化為“數(shù)字列表”
建立token字典后,就可以使用token.word_index字典將文字轉(zhuǎn)化為數(shù)字列表。
1.使用token.texts_to_sequences將文字轉(zhuǎn)換為數(shù)字
x_train_seq = token.texts_to_sequences(train_text)
x_test_seq? = token.texts_to_sequences(test_text)
2. 查看轉(zhuǎn)化為sequences之后的結(jié)果

步驟4:截長補短讓所有“數(shù)字列表”長度都是100
因為每一則影評文字的字?jǐn)?shù)都不固定,有些170字,有些80字,轉(zhuǎn)換成”數(shù)字列表“字?jǐn)?shù)也不固定。
而后續(xù)要將數(shù)字列表轉(zhuǎn)換為向量列表來學(xué)習(xí),所以長度必須固定。
方法:截長補短
1. 使用sequnences.pad_sequences方法截長補短
x_train = sequence.pad_sequences(x_train_seq, maxlen=100)
x_test? = sequence.pad_sequences(x_test_seq,? maxlen=100)
2.影評文字轉(zhuǎn)化為數(shù)字列表后,長度大于100截去
3.如果文章轉(zhuǎn)成數(shù)字不足100,pad_sequences處理后,前面會加上0
