基于keras的文本分類

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 保存和加載模型

  1. 保存模型和tokenizer
    注意:保存模型的時候贬养,應(yīng)該同時保存tokenizer已備后續(xù)使用挤土。在保存模型的時候,需要將其保存為hdf5的文件格式误算。
with open('model/tokenizer.pickle', 'wb') as f:
      pickle.dump(tokenizer, f)
model.save('model/model.h5')
  1. 加載模型和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')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仰美,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子儿礼,更是在濱河造成了極大的恐慌咖杂,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蚊夫,死亡現(xiàn)場離奇詭異诉字,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)知纷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門壤圃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琅轧,你說我怎么就攤上這事伍绳。” “怎么了乍桂?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵冲杀,是天一觀的道長效床。 經(jīng)常有香客問我,道長漠趁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任忍疾,我火速辦了婚禮闯传,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卤妒。我一直安慰自己甥绿,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布则披。 她就那樣靜靜地躺著共缕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪士复。 梳的紋絲不亂的頭發(fā)上图谷,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音阱洪,去河邊找鬼便贵。 笑死,一個胖子當(dāng)著我的面吹牛冗荸,可吹牛的內(nèi)容都是我干的承璃。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蚌本,長吁一口氣:“原來是場噩夢啊……” “哼盔粹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起程癌,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤舷嗡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后嵌莉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咬崔,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年烦秩,在試婚紗的時候發(fā)現(xiàn)自己被綠了垮斯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡只祠,死狀恐怖兜蠕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抛寝,我是刑警寧澤熊杨,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布曙旭,位于F島的核電站,受9級特大地震影響晶府,放射性物質(zhì)發(fā)生泄漏桂躏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一川陆、第九天 我趴在偏房一處隱蔽的房頂上張望剂习。 院中可真熱鬧,春花似錦较沪、人聲如沸鳞绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽们何。三九已至,卻和暖如春控轿,著一層夾襖步出監(jiān)牢的瞬間冤竹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工茬射, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留贴见,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓躲株,卻偏偏與公主長得像片部,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霜定,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容