具体代码见github
在tf2.0里面装在了imdb数据集直接下载就可以
若是第一次下载,会在本地建立.kears文件夹下datasets并存储文件
# 导入需要用的库
import os
import tarfile
# 软件包的解压
import urllib.request
#网络下载的请求
import tensorflow as tf
import numpy as np
import re
# 正则化
import string
from random import randint
# 数据地址
url='http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz'
filepath='data/aclImdb_v1.tar.gz'
# 如果当前目录下不存在data文件夹,则建立
if not os.path.exists('data'):
os.makedirs('data')
# 下载数据,80兆左右
if not os.path.isfile(filepath):
print('downloading...')
result=urllib.request.urlretrieve(url,filepath)
print('downloaded:',result)
else:
print(filepath,'is existed')
# 解压数据
if not os.path.exists('data/aclImdb'):
tfile=tarfile.open(filepath,'r:gz')
print('extracting...')
result=tfile.extractall('data/')
print('extraction completed')
else:
print('data/aclImdb is existed!')
有一些不太应该出现的词
<br>
文件由html转换所以有些问题
最好做些预处理去掉这些词
采用正则方式去除
# 将文本中不需要的字符清除,如html中的标签
def remove_tags(text):
re_tag=re.compile(r'<[^>]+>')
return re_tag.sub('',text)
def read_files(filetype):
path='data/aclImdb/'
file_list=[]
# 读取正面评价的文件路径,存到file_list列表里
positive_path=path+filetype+'/pos/'
for f in os.listdir(positive_path):
file_list+=[positive_path+f]
pos_files_num=len(file_list)
# 读取负面评价的文件的路径,存到file_list列表里
negative_path=path+filetype+'/neg/'
for f in os.listdir(negative_path):
file_list+=[negative_path+f]
neg_files_num=len(file_list)-pos_files_num
print('read',filetype,'files:',len(file_list))
print(pos_files_num,'pos files in',filetype,'files')
print(neg_files_num,'neg files in',filetype,'files')
#得到所有标签。标签用one——hot编码,正面{1,0}负面[0,1]
all_labels=([[1,0]]*pos_files_num+[[0,1]]*neg_files_num)
# 得到所有文本
all_texts=[]
for fi in file_list:
with open(fi,encoding='utf8') as file_input:
#文本中有
这类html标签,将文本传入remove_tags函数
#函数里用正则表达式将标签去除
all_texts+=[remove_tags(''.join(file_input.readlines()))]
return all_labels,all_texts
train_labels,train_texts=read_files("train")
test_labels,test_labels=read_files('test')
建立词汇词典
token=tf.keras.preprocessing.text.Tokenizer(num_words=4000)
# 分词器,把出现率最高的4000个词纳入分词器
token.fit_on_texts(train_texts)
# 查看token读取了多少文档
token.document_count
print(token.word_index)# 出现频率的排名
token.word_docs
# 将单词映射为他们在训练器出现的文档或文本的数量
train_sequences=token.texts_to_sequences(train_texts)
test_sequences=token.texts_to_sequences(test_texts)
x_train=tf.keras.preprocessing.sequence.pad_sequences(train_sequences,padding='post',truncating='post',maxlen=400)
x_test=tf.keras.preprocessing.sequence.pad_sequences(test_sequences,padding='post',truncating='post',maxlen=400)
y_train=np.array(train_labels)
#要把标签改为ndarray格式
y_test=np.array(test_labels)
x_train.shape
要求输入大小都统一,维度相同,要去规范化评论长度,pad_sequece有截长补短的作用,不满足400填充0,填充截断有2种选择,截前面还是后400个,post是截后面的。post填后面的。
model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Embedding(output_dim=32,
input_dim=4000,
input_length=400))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(units=256,activation='relu'))
model.add(tf.keras.layers.Dropout(0.3))
model.add(tf.keras.layers.Dense(units=2,activation='softmax'))
model.summary()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
history=model.fit(x_train,y_train,
validation_split=0.2,
epochs=10,
batch_size=128,
verbose=1)
import matplotlib.pyplot as plt
acc=history.history['accuracy']
val_acc=history.history['val_accuracy']
loss=history.history['loss']
val_loss=history.history['val_loss']
epochs=range(1,len(acc)+1)
plt.plot(epochs,loss,'r',label='Training loss')
plt.plot(epochs,val_loss,'b',label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
plt.clf()# clear figure
acc_values=history.history['accuracy']
val_acc_values=history.history['val_accuracy']
plt.plot(epochs,acc,'r',label='Training acc')
plt.plot(epochs,val_acc,'b',label='Validation acc')
plt.title('Training and validation accutacy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
test_loss,test_acc=model.evaluate(x_test,y_test,verbose=1)
print('Test Accuracy',test_acc)
predictions=model.predict(x_test)
predictions[0]
sentiment_dict={0:'pos',1:'neg'}
def display_test_sentiment(i):
print(test_texts[i])
print('label values:',sentiment_dict[np.argmax(y_test[i])],
'predict value:',sentiment_dict[np.argmax(predictions[i])
display_test_sentiment(0)