zoukankan      html  css  js  c++  java
  • embedding(keras,word2vec)

    一、keras中的Tokenizer

    tf.keras.preprocessing.text.Tokenizer(
        num_words=None, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~	
    ', 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

  • 相关阅读:
    leetcode-654-最大二叉树
    leetcode-46-全排列
    图片懒加载?
    HTTP常见的状态码?
    线程与进程的区别?
    网页从输入网址到渲染完成经历了哪些过程?
    网页前端性能优化的方式有哪些?
    常见的浏览器内核有哪些?
    汇编语言--cpu的工作原理(寄存器)--手稿
    对于 vue3.0 特性你有什么了解的吗?
  • 原文地址:https://www.cnblogs.com/100-rzsyztd/p/15449905.html
Copyright © 2011-2022 走看看