一、keras中的Tokenizer
tf.keras.preprocessing.text.Tokenizer(
num_words=None, filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n', lower=True,
split=' ', char_level=False, oov_token=None, document_count=0, **kwargs
)
1.參數
- num_words: 需要保留的最大詞數,基於詞頻。只有最常出現的 num_words 詞會被保留。
- filters: 一個字符串,其中每個元素是一個將從文本中過濾掉的字符。默認值是所有標點符號,加上制表符和換行符,減去
'字符。 - lower: 布爾值。是否將文本轉換為小寫。
- split: 字符串。按該字符串切割文本。
- char_level: 如果為 True,則每個字符都將被視為標記。
- oov_token: 如果給出,它將被添加到 word_index 中,並用於在 text_to_sequence 調用期間替換詞匯表外的單詞。
默認情況下,刪除所有標點符號,將文本轉換為空格分隔的單詞序列(單詞可能包含 ' 字符)。 這些序列然后被分割成標記列表。然后它們將被索引或向量化。
‘0’是不會被分配給任何單詞的保留索引。
2.類方法
-
fit_on_texts(texts)
- texts:要用以訓練的文本列表
-
texts_to_sequences(texts)
-
texts:待轉為序列的文本列表
-
返回值:序列的列表,列表中每個序列對應於一段輸入文本
-
-
texts_to_sequences_generator(texts)
-
本函數是texts_to_sequences的生成器函數版
-
texts:待轉為序列的文本列表
-
返回值:每次調用返回對應於一段輸入文本的序列
-
-
texts_to_matrix(texts, mode):
-
texts:待向量化的文本列表
-
mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默認為‘binary’
-
返回值:形如(len(texts), nb_words)的numpy array
-
-
fit_on_sequences(sequences):
- sequences:要用以訓練的序列列表
-
sequences_to_matrix(sequences):
-
sequences:待向量化的序列列表
-
mode:‘binary’,‘count’,‘tfidf’,‘freq’之一,默認為‘binary’
-
返回值:形如(len(sequences), nb_words)的numpy array
-
3.屬性
- word_counts:字典,將單詞(字符串)映射為它們在訓練期間出現的次數。僅在調用fit_on_texts之后設置。
- word_docs: 字典,將單詞(字符串)映射為它們在訓練期間所出現的文檔或文本的數量。僅在調用fit_on_texts之后設置。
- word_index: 字典,將單詞(字符串)映射為它們的排名或者索引。僅在調用fit_on_texts之后設置。
- document_count: 整數。分詞器被訓練的文檔(文本或者序列)數量。僅在調用fit_on_texts或fit_on_sequences之后設置。
4.例子
from keras.preprocessing.text import Tokenizer
texts = ['今天天氣真好!', '明天天氣會更好。', '今天是程序員節~']
My_Tokenizer = Tokenizer(char_level=True, oov_token='UNK')
My_Tokenizer.fit_on_texts(texts)
print(My_Tokenizer.word_index)
print(My_Tokenizer.texts_to_sequences(texts[2]))
# 輸出
# {'UNK': 1, '天': 2, '今': 3, '氣': 4, '好': 5, '真': 6, '!': 7, '明': 8, '會': 9, '更': 10, '。': 11, '是': 12, '程': 13, '序': 14, '員': 15, '節': 16, '~': 17}
# [[3], [2], [12], [13], [14], [15], [16], [17]]
二、keras中的embedding層
keras.layers.embeddings.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)
嵌入層將正整數(下標)轉換為具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]
Embedding層只能作為模型的第一層
1.embedding層介紹
參數
-
input_dim:大或等於0的整數,字典長度,即輸入數據最大下標+1
-
output_dim:大於0的整數,代表全連接嵌入的維度
-
embeddings_initializer: 嵌入矩陣的初始化方法,為預定義初始化方法名的字符串,或用於初始化權重的初始化器。參考initializer
-
embeddings_regularizer: 嵌入矩陣的正則項,為Regularizer對象
-
embeddings_constraint: 嵌入矩陣的約束項,為Constraints對象
-
mask_zero:布爾值,確定是否將輸入中的‘0’看作是應該被忽略的‘填充’(padding)值,該參數在使用遞歸層處理變長輸入時有用。設置為True的話,模型中后續的層必須都支持masking,否則會拋出異常。如果該值為True,則下標0在字典中不可用,input_dim應設置為|vocabulary| + 2。
-
input_length:當輸入序列的長度固定時,該值為其長度。如果要在該層后接Flatten層,然后接Dense層,則必須指定該參數,否則Dense層的輸出維度無法自動推斷。
輸入輸出
- 輸入:形如(batch_size,sequence_length)的2D張量
- 輸出:形如(batch_sieze, sequence_length, output_dim)的3D張量
keras中的embedding層並不是進行矩陣相乘,而是進行類似於索引查找的操作來生成詞向量。即生成一個(input_dim,output_dim)形狀的矩陣,然后在此矩陣中按位置查找對應的詞向量輸出(sequence_length,output_dim)形狀的矩陣。
2.word2vec詞向量的出處

三層的word2vec模型中有輸入層權重和輸出層權重,詞向量就是這兩者的單一或組合的表現形式。即:
A. 只使用輸入側的權重
B. 只使用輸出側的權重
C. 同時使用兩個權重
方案 A 和方案 B 只使用其中一個權重。而在采用方案 C 的情況下,根據如何組合這兩個權重,存在多種方式,其中一個方式就是簡單地將這兩個權重相加。就 word2vec(特別是 skip-gram 模型)而言,最受歡迎的是方案 A。許多研究中也都僅使用輸入側的權重 Win 作為最終的單詞的分布式表示。
3.使用word2ve初始權重
from keras.models import Sequential
from keras.layers import Embedding
import numpy as np
from gensim.models import word2vec
# 加載模型
model_name = 'Domain-Word2vec.model'
# 嵌入向量維度
Embedding_dim = 100
embedding_model = word2vec.Word2Vec.load(model_name)
word2idx = {'PAD': 0}
# 所有詞對應的嵌入向量 [(word, vector)]
vocab_list = [(k, embedding_model.wv[k]) for k, v in embedding_model.wv.vocab.items()]
# [len(vocab)+1, embedding_dim] '+1'是增加了一個'PAD'
embeddings_matrix = np.zeros((len(embedding_model.wv.vocab.items()) + 1,\
embedding_model.vector_size))
# word2idx 字典
for i in range(len(vocab_list)):
word = vocab_list[i][0]
word2idx[word] = i + 1
embeddings_matrix[i + 1] = vocab_list[i][1]
# 初始化keras中的Embedding層權重
embedding = Embedding(input_dim=len(embeddings_matrix),
output_dim=Embedding_dim,
weights=[embeddings_matrix], # 預訓練參數
trainable=False)
model = Sequential()
model.add(embedding)
參考:
https://wizardforcel.gitbooks.io/keras-cn/content/docs/layers/embedding_layer.html
https://blog.csdn.net/yyhhlancelot/article/details/86534793
https://blog.csdn.net/comeonfly666/article/details/115946469
