embedding(keras,word2vec)


一、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://tensorflow.google.cn/versions/r2.3/api_docs/python/tf/keras/preprocessing/text/Tokenizer?hl=zh_cn

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM