tensorflow(二)文字分類
阿新 • • 發佈:2018-11-13
文字分類是自然語言處理中的一個重要領域。在神經網路未興起之前,svm在分類方面獨領風騷。j即使在現在,svm在很多場景下也很有用。但是神經網路提高了準確率,使其迅速火了起來。下面是tensorflow官網給出的例子(https://tensorflow.google.cn/tutorials/keras/basic_text_classification)
import tensorflow as tf
from tensorflow import keras
import numpy as np
#1.下載資料
imdb=keras.datasets.imdb
#num_words=10000表示保留前10000個出現頻率最高的詞,頻率在此之後的可能被丟棄
(train_data,train_labels),(test_data,test_labels)=imdb.load_data(num_words=10000)
print("Training entries:{},labels:{}".format(len(train_data),len(train_labels)))\
#每行是一個數字陣列,類似於1, 14, 22, 16, 43, 530, 973]其中每個數字代表唯一的一個詞
print(train_data[0])
#由於每個評論的長度長短都不一樣,所以陣列的長度也不一樣
print(str(len(train_data[0]))+"/"+str (len(train_data[1])))
#2.轉換資料
#由於網路的輸入的維數是固定的,因此需要將陣列轉化為統一的長度
word_index=imdb.get_word_index()
# The first indices are reserved
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2 # unknown
word_index["<UNUSED>" ] = 3
#train_data代表要處理的資料,value代表要用什麼資料填充,這裡是0,padding代表在前還是在後填充,pre代表前,post代表後.
# maxlen代表最大長度,超過該長度將會被截斷
train_data = keras.preprocessing.sequence.pad_sequences(train_data,
value=word_index["<PAD>"],
padding='post',
maxlen=256)
test_data = keras.preprocessing.sequence.pad_sequences(test_data,
value=word_index["<PAD>"],
padding='post',
maxlen=256)
#3.build model
vocab_size=10000
model=keras.Sequential()
model.add(keras.layers.Embedding(vocab_size,16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16,activation=tf.nn.relu))
model.add(keras.layers.Dense(1,activation=tf.nn.sigmoid))
model.summary()
model.compile(optimizer=tf.train.AdamOptimizer(),
loss="binary_crossentropy")
#4.建立校驗集
x_val=train_data[:10000]
partial_x_train=train_data[10000:]
y_val=train_labels[:10000]
partial_y_train=train_labels[10000:]
model.fit(
partial_x_train,
partial_y_train,
epochs=40,
batch_size=512,
validation_data=(x_val,y_val),
verbose=1
)
results=model.evaluate(test_data,test_labels)
print(results)