1. 程式人生 > 實用技巧 >Keras文字預處理詳解

Keras文字預處理詳解

彙總

Tokenizer分詞器(類)

Tokenizer.fit_on_texts分詞器方法:實現分詞

Tokenizer.texts_to_sequences分詞器方法:輸出向量序列

pad_sequences進行padding

具體示例和程式碼分析

分詞器分詞和向量化

主要的類是Tokenizer,用到其中的一些方法將文字轉換為序列。需要注意的是這個類的一些預設方法

  • filters:預設會過濾一些標點符號,標點符號和單詞之間沒有空格也沒關係。內部程式碼是先把標點符號替換為空格,然後進行分詞,所以的這樣的:"eat!Some"也可以正確識別
  • lower=True:預設會轉為小寫
  • split=" ":預設是空格

這些方法都已經實現,所以在可以不用自己寫,直接設定引數就行。另外兩個引數:

  • num_words:處理的最大單詞數量。
  • char_level: 預設False,如果是True,返回字元向量化結果(char embedding的時候可以用到)

還有就是注意必須先進行fit_on_texts方法,然後進行texts_to_sequencesfit_on_texts後有兩個有用的輸出:

  • word_counts:詞頻統計結果
  • word_index:詞和index的對應關係

texts_to_sequences輸出的是根據對應關係輸出的向量序列,是不定長的,跟句子的長度有關係。

from
keras.preprocessing.text import Tokenizer text1='Some ThING to eat !' text2='some thing to drink .' texts=[text1,text2] print(texts) #out:['Some ThING to eat !', 'some thing to drink .'] tokenizer = Tokenizer(num_words=100) #num_words:None或整數,處理的最大單詞數量。少於此數的單詞丟掉 tokenizer.fit_on_texts(texts) print( tokenizer.word_counts)
#out:OrderedDict([('some', 2), ('thing', 2), ('to', 2), ('eat', 1), ('drink', 1)]) print( tokenizer.word_index) #out:{'some': 1, 'thing': 2, 'to': 3, 'eat': 4, 'drink': 5} sequences = tokenizer.texts_to_sequences(texts) word_index = tokenizer.word_index print(sequences) #out:[[1, 2, 3, 4], [1, 2, 3, 5]] 轉換為序列,注意這裡句子等長,所以輸出一樣,但是不等長句子輸出的長度是不一樣的 print('Found %s unique tokens.' % len(word_index)) #out:Found 5 unique tokens.

填充至等長

pad_sequences,對上面生成的不定長序列進行補全。可以手動設定每個句子的最大長度引數,大於這個長度截斷,小於這個長度填充。注意:預設補全和截斷都是在句子前面進行填充和截斷。這裡是用0進行填充,也就是空格,這也是為什麼上面序列index起始是1的原因。

#接上面的程式碼
SEQ_LEN = 10
data = pad_sequences(sequences, maxlen=SEQ_LEN)
print(data)
#out:[[0 0 0 0 0 0 1 2 3 4]
# [0 0 0 0 0 0 1 2 3 5]]

來自 https://zhuanlan.zhihu.com/p/55412623