1. 文本預(yù)處理
Step1 Tokenizer
keras.preprocessing.text.Tokenizer(num_words=None,
filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~',
lower=True, split=' ',
char_level=False,
oov_token=None)
文本標(biāo)記實用類
該類允許使用兩種方法向量化一個文本語料庫: 將每個文本轉(zhuǎn)化為一個整數(shù)序列(每個整數(shù)都是詞典中標(biāo)記的索引)豪治; 或者將其轉(zhuǎn)化為一個向量魔策,其中每個標(biāo)記的系數(shù)可以是二進(jìn)制值绷蹲、詞頻、TF-IDF權(quán)重等种樱。
參數(shù)
- num_words: 需要保留的最大詞數(shù)瑞凑,基于詞頻澡罚。只有最常出現(xiàn)的 num_words 詞會被保留,即詞典中會保留num_words個詞。
- filters: 一個字符串枚尼,其中每個元素是一個將從文本中過濾掉的字符贴浙。默認(rèn)值是所有標(biāo)點符號,加上制表符和換行符署恍,減去 ' 字符崎溃。
- lower: 布爾值,是否將文本轉(zhuǎn)換為小寫盯质。
- split: 字符串袁串,按該字符串切割文本。
- char_level: 如果為 True呼巷,則每個字符都將被視為標(biāo)記囱修。
- oov_token: 如果給出,它將被添加到 word_index 中王悍,并用于在 text_to_sequence 調(diào)用期間替換詞匯表外的單詞破镰。
Tokenizer類的屬性
- word_counts: OrderedDict()類型,用來記錄每個詞在語料庫中出現(xiàn)的次數(shù)压储,其中詞是字典的key鲜漩,出現(xiàn)的頻次是value
- word_docs: defaultDict()類型,用來記錄有多少個doc中含有某個詞集惋,即統(tǒng)計詞的DF(document frequency)孕似,注意字典中value的值是從1開始的,因為0用來留給做padding的時候使用刮刑。
- word_index: dict()類型鳞青,字典的key是語料庫中的詞,這些詞包括未登陸詞OOV为朋,value對應(yīng)的是詞的索引臂拓,索引是根據(jù)詞頻進(jìn)行排序后的
- index_word: dict()類型,key和value與word_index相反過來
默認(rèn)情況下习寸,刪除所有標(biāo)點符號胶惰,將文本轉(zhuǎn)換為空格分隔的單詞序列(單詞可能包含 ' 字符)。 這些序列然后被分割成標(biāo)記列表霞溪。然后它們將被索引或向量化孵滞。0 是不會被分配給任何單詞的索引。
Step2 fit_on_text
keras.preprocessing.text.Tokenizer(num_words=None,
filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~',
lower=True, split=' ',
char_level=False,
oov_token=None).fit_on_texts(texts)
在實例化Tokenizer類后鸯匹,使用fit_on_texts(texts)坊饶,來更新Tokenizer對象的詞典和詞頻信息。
Step3 texts_to_sequences
keras.preprocessing.text.Tokenizer().texts_to_sequences(texts)
將文本序列轉(zhuǎn)換成整數(shù)的索引序列殴蓬。
Step4 pad_sequences
pad_sequences(sequences, maxlen=None, dtype='int32',
padding='pre', truncating='pre', value=0.):
對序列做填充(padding)或修剪(truncating)
因為每個sentence的長度都不一樣匿级,在將其轉(zhuǎn)換為integer后蟋滴,為了后續(xù)的批次訓(xùn)練,需要對變長的sentence做填充或修剪痘绎。
- maxlen: 填充到的最大長度
- truncating: 對序列做修剪津函,可以從前開始修剪,即truncating='pre'孤页,也可以從后開始修剪尔苦,即truncating='post'
- padding: 對序列進(jìn)行填充,可以從前開始填充行施,即padding='pre'允坚,也可以從后開始填充,即padding='post'
- value: 填充的值
返回值: 一個shape=(len(sequences), maxlen)的numpy數(shù)組
Step5 訓(xùn)練
model.fit(self,
x=None,
y=None,
batch_size=None,
epochs=1,
verbose=1,
callbacks=None,
validation_split=0.,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
**kwargs):
- x,y 分別為inputs和labels蛾号。
- shuffle: 是否在每個epoch中打亂數(shù)據(jù)再進(jìn)行訓(xùn)練屋讶。注意,打亂數(shù)據(jù)的操作是在將數(shù)據(jù)分成訓(xùn)練集和驗證集之后進(jìn)行的须教,即只是打亂訓(xùn)練集的數(shù)據(jù)皿渗。
- callbacks: 回調(diào)函數(shù)∏嵯伲可以使用early_stopping()的回調(diào)函數(shù)乐疆,可以在過擬合前停止訓(xùn)練。
Step6 保存和加載模型
- 保存模型和tokenizer
注意:保存模型的時候贬养,應(yīng)該同時保存tokenizer已備后續(xù)使用挤土。在保存模型的時候,需要將其保存為hdf5的文件格式误算。
with open('model/tokenizer.pickle', 'wb') as f:
pickle.dump(tokenizer, f)
model.save('model/model.h5')
- 加載模型和tokenizer
from keras.models import load_model
with open('model/tokenizer.pickle', 'rb') as f:
tokenizer = pickle.load(f)
model = load_model('model/model.h5')