精华内容
下载资源
问答
  • 2020-05-23 16:44:58
    概述
    • Embedding,中文直译为“嵌入”,常被翻译为“向量化”或者“向量映射”,在深度学习中,Embedding技术对于深度学习非常重要,甚至可以说是深度学习的“基本核心操作”。深度学习网络中作为Embedding层,完成从高维稀疏特征向量到低维稠密特征向量的转换。 使用One-hot编码对类别、Id型特征进行编码,导致样本特征向量极度稀疏,而深度学习的结构特点使其不利于稀疏特征向量的处理,因此几乎所有的深度学习都会由Embedding层负责将高维稀疏特征向量转换成稠密低维特征向量
    常用的获取词向量的方法
    • 利用网络embedding层训练词向量,
    • FastText工具快速生成词向量,
    • 使用预训练模型获取词向量。
    如何训练词向量
    1. 网络embedding层训练词向量:embedding层训练词向量时,需要设置两个参数,分别是词汇总数和词嵌入维度,首先需要将一个句子(选择合适的句子的序列长度,因为截断或补齐也会给最终效果带来影响)中的每一个词完成word2id的过程,获取每一个词的id方法有(1.通过keras下的tokenizer方法获取总次数数以及词 索引的对应关系 2.编程代码完成一一映射)。词嵌入维度一般的设置大些,参考值为300到500,
    模型中加入embedding层
    nn.Embedding(vocab_size,embedding_dim)
    
    1. FastText训练词向量过程
    过程:获取数据,训练词向量,模型超参数设置,模型效果检验,模型保存与加载
    
    1.获取数据(英语维基百科的部分网页信息, 它的大小在300M左右
    )
    [root@bhs fastte]# wget -c http://mattmahoney.net/dc/enwik9.zip -P data
    
    [root@bhs data]# unzip enwik9.zip 
    [root@bhs data]# ll
    total 1291608
    -rw-r--r-- 1 root root 1000000000 Jun  1  2011 enwik9
    -rw-r--r-- 1 root root  322592222 Sep  2  2011 enwik9.zip
    -rw-r--r-- 1 root root       1995 May 24 00:17 wikifil.pl
    查看下载的数据
    [root@bhs data]# more enwik9
    <mediawiki xmlns="http://www.mediawiki.org/xml/export-0.3/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sch
    emaLocation="http://www.mediawiki.org/xml/export-0.3/ http://www.mediawiki.org/xml/export-0.3.xsd" version="0.3" xml:lang
    ="en">
      <siteinfo>
        <sitename>Wikipedia</sitename>
        <base>http://en.wikipedia.org/wiki/Main_Page</base>
        <generator>MediaWiki 1.6alpha</generator>
        <case>first-letter</case>
          <namespaces>
          <namespace key="-2">Media</namespace>
          <namespace key="-1">Special</namespace>
          <namespace key="0" />
          <namespace key="1">Talk</namespace>
          <namespace key="2">User</namespace>
          <namespace key="3">User talk</namespace>
          <namespace key="4">Wikipedia</namespace>
          <namespace key="5">Wikipedia talk</namespace>
    
    数据处理
    使用wikifil.pl文件处理脚本来清除XML/HTML格式的内容
    [root@bhs data]# perl wikifil.pl enwik9 > fil
    输出结果为由空格分割的单词
    [root@bhs data]# more fil 
     anarchism originated as a term of abuse first used against early working class radicals including the diggers of the eng
    lish revolution and the sans culottes of the french revolution whilst the term is still used in a pejorative way to descr
    
    2.训练词向量
    
    # 在训练词向量过程中, 我们可以设定很多常用超参数来调节我们的模型效果,
    # 无监督训练模式: 'skipgram' 或者 'cbow', 默认为'skipgram', 在实践中,skipgram模式在利用子词方面比cbow更好.
    # 词嵌入维度dim: 默认为100, 但随着语料库的增大, 词嵌入的维度往往也要更大.
    # 数据循环次数epoch: 默认为5, 但当你的数据集足够大, 可能不需要那么多次.
    # 学习率lr: 默认为0.05, 根据经验, 建议选择[0.01,1]范围内.
    # 使用的线程数thread: 默认为12个线程, 一般建议和你的cpu核数相同
    
    
    model=fasttext.train_unsupervised('./fil','cbow',dim=300,epoch=1,lr=0.1,thread=2)
    Read 124M words
    Number of words:  218316
    Number of labels: 0
    Progress: 100.0% words/sec/thread:   26829 lr:  0.000000 avg.loss:  1.507921 ETA:   0h 0m 0s
    
    3.模型效果检验
    # 检查单词向量质量的一种简单方法就是查看其邻近单词, 通过我们主观来判断这些邻近单词是否与目标单词相关来粗略评定模型效果好坏.
    查找"小狗"的邻近单词, 我们可以发现与小狗有关的词汇.
    >>> model.get_nearest_neighbors('dog')
    [(0.8416129350662231, 'catdog'), (0.7638700604438782, 'sleddog'), (0.7467442154884338, 'dogcow'), (0.7335803508758545, 'h
    otdog'), (0.7319445610046387, 'bodog'), (0.715396523475647, 'dogs'), (0.711815595626831, 'dogo'), (0.6796260476112366, 'maddog'), (0.6774388551712036, 'madog'), (0.6770561933517456, 'spurdog')]
    
    
    4.模型保存与加载
    >>> model.save_model("file_save_model.bin")
    
    模型加载
    >>> model2=fasttext.load_model("./file_save_model.bin")
    报错:内存不足
    Warning : `load_model` does not return WordVectorModel or SupervisedModel any more, but a `FastText` object which is very
     similar.Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/root/anaconda3/lib/python3.6/site-packages/fasttext/FastText.py", line 441, in load_model
        return _FastText(model_path=path)
      File "/root/anaconda3/lib/python3.6/site-packages/fasttext/FastText.py", line 98, in __init__
        self.f.loadModel(model_path)
    MemoryError: std::bad_alloc
    
    
    >>> model22=fasttext.load_model("file_save_model.bin")
    Warning : `load_model` does not return WordVectorModel or SupervisedModel any more, but a `FastText` object which is very
     similar.
    
    使用模型获取词向量
    >>> model22.get_word_vector("baihaisheng")
    array([-6.14714921e-01,  1.77509800e-01, -6.72733843e-01,  3.89141440e-01,
            2.49527186e-01,  2.41667092e-01, -4.54738081e-01, -3.32535744e-01,
            1.00533022e-02,  1.30211804e-02,  2.25752905e-01, -4.17809784e-01,
            5.90570807e-01,  1.59802660e-02, -9.37078178e-01, -6.96638942e-01,
           -3.15337270e-01,  6.20727122e-01, -1.84069797e-01,  4.22761917e-01,
           -2.37838719e-02, -3.68257344e-01,  3.16621125e-01, -4.70072150e-01,
            5.71745373e-02,  1.40439391e-01,  2.90389121e-01,  6.27156734e-01,
           -6.00902587e-02, -4.65739310e-01,  1.03777409e-01, -7.87911355e-01,
            5.73584926e-04,  8.69789273e-02, -8.45102191e-01, -4.41818327e-01,
            4.94885862e-01,  1.21109761e-01, -5.81156723e-02, -1.74028978e-01,
            1.29382350e-02,  2.84348875e-01,  2.40987480e-01, -3.50105286e-01,
            1.39359280e-01,  2.79060900e-01,  3.65334660e-01, -7.01365650e-01,
            4.64738943e-02, -3.80195081e-01,  7.52594024e-02, -1.32626042e-01,
            1.48186862e-01, -2.03920603e-01, -6.26981258e-02,  7.05849111e-01,
           -2.42000282e-01, -3.99949878e-01,  4.65390146e-01,  3.47595781e-01,
           -5.09850979e-01,  3.79405737e-01,  1.32703856e-01, -3.32746685e-01,
            1.37809172e-01, -9.51760769e-01, -2.99254984e-01,  8.42892751e-02,
           -1.92956835e-01, -4.32410508e-01, -7.08973587e-01,  2.11728901e-01,
            2.65689790e-01, -3.82561058e-01, -8.77650008e-02,  1.32813957e-02,
           -2.99640179e-01, -6.89251542e-01, -1.98683292e-01, -5.35973869e-02,
            1.95847973e-01, -3.16322207e-01,  4.64514673e-01, -1.90718532e-01,
           -1.98006675e-01,  8.36191952e-01, -5.83671510e-01,  6.64617598e-01,
           -5.36399782e-01, -7.70042911e-02, -3.57951492e-01,  1.40873818e-02,
           -5.04313648e-01,  1.17317331e+00, -2.78562754e-01,  5.37931621e-01,
            5.22421971e-02,  1.48041770e-01,  2.70346880e-01, -4.47012603e-01,
            1.49396583e-01,  2.54133046e-02, -6.32022172e-02,  3.11216176e-01,
            2.93466628e-01, -1.37522845e-02, -3.14217508e-01, -3.88895601e-01,
            5.53332902e-02,  2.66070604e-01, -3.26904833e-01, -9.38113868e-01,
           -8.01377296e-01, -2.76655018e-01,  2.95357853e-01,  4.95326258e-02,
            2.05409884e-01, -3.83659571e-01, -4.69358861e-01,  2.59294689e-01,
           -1.05863720e-01,  4.35056478e-01,  7.52935410e-02,  6.90222085e-02,
           -3.44821930e-01, -1.56436771e-01, -3.90448183e-01, -6.76123917e-01,
            4.41117547e-02,  5.24668634e-01,  7.67726973e-02, -8.08430910e-01,
            6.40433729e-02, -1.24917634e-01,  3.02044123e-01,  5.49890995e-01,
           -3.41330796e-01,  3.41020733e-01,  1.05423173e-02, -6.75539821e-02,
           -5.05231798e-01,  1.95493981e-01, -3.91332120e-01,  4.88728613e-01,
            2.03944132e-01,  4.21409816e-01, -3.52494448e-01, -1.23629794e-02,
           -7.36190379e-01,  1.44726455e-01,  5.02763927e-01, -9.17422120e-03,
           -1.90208256e-01, -6.94231153e-01,  1.79565459e-01, -5.44371307e-01,
           -3.39159757e-01, -9.69230756e-02, -7.34013379e-01,  3.57983142e-01,
            2.98592541e-02, -2.76991367e-01,  3.22349370e-01,  2.38273293e-01,
           -3.85621935e-01, -1.94796294e-01,  1.58925857e-02, -2.22999975e-01,
            1.27562350e-02, -7.30409741e-01,  5.42377949e-01,  7.75462449e-01,
            3.11984658e-01, -5.94272137e-01, -3.89411390e-01,  1.38909906e-01,
            5.38288914e-02, -5.86420894e-01, -4.59898055e-01, -3.51294905e-01,
           -2.52639234e-01,  1.29526585e-01,  3.99453491e-01,  2.58776903e-01,
            3.78979892e-01,  6.12262607e-01, -7.90281519e-02,  4.35486697e-02,
            1.21814705e-01, -5.93060851e-01, -7.41831660e-01, -6.45337030e-02,
            5.67307353e-01, -4.14864808e-01,  1.40781909e-01, -2.57910490e-01,
            1.89982623e-01,  2.95685351e-01, -1.78639546e-01,  3.70555967e-01,
           -4.44893450e-01,  2.67164707e-02, -3.89021710e-02,  2.65334040e-01,
            8.63097981e-02, -4.62214381e-01,  3.63194972e-01,  3.84918898e-02,
            7.76365325e-02,  2.10744530e-01, -3.56715173e-01,  1.48300081e-01,
            1.40594691e-01, -2.77864009e-01, -6.63379729e-01,  1.26957715e-01,
           -3.18865716e-01, -2.73206711e-01, -2.60140210e-01, -5.20998001e-01,
            4.53805625e-01,  2.08097503e-01, -3.63694400e-01,  1.70241684e-01,
           -5.37926853e-02, -5.26781738e-01,  2.18923092e-02, -1.52257919e-01,
            8.82064030e-02,  7.43691530e-03, -5.51458150e-02, -7.28050232e-01,
            2.06179187e-01, -2.48517796e-01,  1.51464373e-01, -6.21425450e-01,
           -2.79860973e-01,  8.12949777e-01, -1.09000459e-01, -3.33450288e-01,
           -8.25750351e-01, -3.35024595e-02, -3.75130437e-02, -1.14543743e-01,
            4.48227674e-01, -1.47293851e-01, -9.86459404e-02,  2.73444474e-01,
           -9.43316996e-01,  7.02648342e-01, -1.67992368e-01,  1.68559060e-01,
            1.28673196e-01, -6.19408727e-01,  3.94033939e-01, -2.62163162e-01,
           -3.09747308e-01,  4.15634245e-01,  1.26757383e-01,  8.73117819e-02,
            3.82494479e-01, -9.45309281e-01,  3.05107027e-01,  7.09154487e-01,
           -9.11318585e-02,  4.16147500e-01,  2.27030009e-01,  4.02536601e-01,
           -1.11048624e-01, -3.55361104e-01, -2.01794848e-01,  6.78207994e-01,
            3.93777005e-02,  5.43783069e-01, -1.07726261e-01, -2.64577866e-01,
           -3.15008730e-01,  4.13194895e-02, -4.69589233e-02,  7.28278533e-02,
            1.15777445e+00, -1.91089004e-01, -2.61729993e-02,  1.33131459e-01,
           -8.68672356e-02,  5.32459021e-01, -5.59820943e-02,  7.47064352e-01,
           -1.07573256e-01, -2.86723137e-01,  2.86289006e-01, -2.12187365e-01,
           -5.78209001e-04,  1.68665841e-01,  1.28051564e-01, -8.86839405e-02,
            1.27122542e-02,  5.84771216e-01,  2.32165232e-01, -2.18837187e-01],
          dtype=float32)
    
    
    
    
    1. 使用预训练模型获取词向量
      以BERT中文预训练模型获取词向量为例
      在实际的文本任务处理中, 有些训练语料很难获得, 他们的总体数量和包含的词汇总数都非常少, 不适合用于训练带有Embedding层的模型, 但这些数据中却又蕴含这一些有价值的规律可以被模型挖掘, 在这种情况下,使用预训练模型对原始文本进行编码是非常不错的选择, 因为预训练模型来自大型语料, 能够使得当前文本具有意义, 虽然这些意义可能并不针对某个特定领域, 但是这种缺陷可以使用微调模型来进行弥补

    使用BERT中文预训练模型对句子编码

    import torch
    import torch.nn as nn
    
    
    # 通过torch.hub(pytorch中专注于迁移学的工具)获得已经训练好的bert-base-chinese模型
    model =  torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-chinese')
    
    
    # 获得对应的字符映射器, 它将把中文的每个字映射成一个数字
    tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-chinese')
    
    
    def get_bert_encode_for_single(text):
        """
        description: 使用bert-chinese编码中文文本
        :param text: 要进行编码的文本
        :return: 使用bert编码后的文本张量表示
        """
        # 首先使用字符映射器对每个汉字进行映射
        # 这里需要注意, bert的tokenizer映射后会为结果前后添加开始和结束标记即101和102 
        # 这对于多段文本的编码是有意义的, 但在我们这里没有意义, 因此使用[1:-1]对头和尾进行切片
        indexed_tokens = tokenizer.encode(text)[1:-1]
        # 之后将列表结构转化为tensor
        tokens_tensor = torch.tensor([indexed_tokens])
        print(tokens_tensor)
        # 使模型不自动计算梯度
        with torch.no_grad():
            # 调用模型获得隐层输出
            encoded_layers, _ = model(tokens_tensor)
        # 输出的隐层是一个三维张量, 最外层一维是1, 我们使用[0]降去它.
        print(encoded_layers.shape)
        encoded_layers = encoded_layers[0]
        return encoded_layers
    
    if __name__=='__main__':
    	text='鸟语花香,好美'
    	encoded_layers=get_bert_encode_for_single(text)
    	print(encoded_layers)
    
    
    
    输出结果
    tensor([[7881, 6427, 5709, 7676, 8024, 1962, 5401]])
    torch.Size([1, 7, 768])
    tensor([[-0.0471, -0.1492, -0.8097,  ..., -0.3070,  0.2260,  0.4534],
            [ 0.8415, -0.2064,  0.1300,  ...,  0.9771,  0.8106,  0.4841],
            [ 0.9327, -0.2953,  0.0101,  ...,  0.4636,  0.5196,  0.0178],
            ...,
            [ 0.3189,  0.2888, -0.2720,  ...,  1.2119,  0.2128,  0.3653],
            [ 0.5846,  0.2318,  0.4427,  ...,  0.6561,  0.5574,  0.3100],
            [ 0.7143, -0.3749, -0.3590,  ...,  0.6304,  0.0795,  0.3684]])
    
    
    

    词向量好坏评价

    语义相关性任务
    这个任务用来评价词向量模型在两个词之间的语义相关性,如:学生与作业,中国与北京等。
    具体方法由监督模式实现,首先需要一份如下的标记文件,一般可以由人工标注:
    学生 上课 0.78
    教师 备课 0.8
    ...
    上述文件代表了词语之间的语义相关性,我们利用标注文件与训练出来的词向量相似度进行比较,如:词向量之间的cos距离等,确定损失函数,便可以得到一个评价指标。
    但这种方法首先需要人力标注,且标注的准确性对评价指标影响非常大
    
    
    语义类比任务
    这个任务词向量来考察不同单词间的语义关系能力,一般给定三个词,如a、b、c,要求寻找a+b = c + ?任务中最相似的词
    
    文本分类任务
    这个任务利用词向量构成文本向量,一般采用求和平均的方式,之后利用构成的文本向量进行文本分类,根据分类的准备率等指标衡量词向量的质量
    
    更多相关内容
  • 自然语言处理的第一步就是获取词向量获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的 基于统计的方法 基于统计的方法就是:用一个词语周边其他词语出现的次数来表示每一个词语...

    自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的

    1 Glove - 基于统计方法

    Glove是一个典型的基于统计的获取词向量的方法,基本思想是:用一个词语周边其他词语出现的次数(或者说两个词共同出现的次数)来表示每一个词语,此时每个词向量的维度等于词库容量,每一维存储着词库对应序号的词语出现在当前词语周围的次数,所有这些词向量组成的矩阵就是共现矩阵

    我们也可以换一个角度来理解共现矩阵,共现矩阵就是两个词同时出现的次数,共现矩阵的i行j列的数值表示词库中第i个词和第j个词同时出现的次数,同时共现矩阵是对角线为零的斜对称矩阵
    大家可以通过下边这个例子来更直观的理解共生矩阵
    在这里插入图片描述

    1.1 实现步骤

    • 统计所有语料当中任意两个单词出现在同一个窗口中的频率,结果表现为共现矩阵 X

    • 直接统计得到的共现矩阵 X,大小为 |V| x |V|(V=词库容量)

    • 实践当中通常对原始统计矩阵施加 SVD(Singular Value Decomposition)来降低矩阵维度,同时降低矩阵的稀疏性

    1.2 优点

    • 训练速度快
    • 充分利用了全局的统计信息

    1.3 存在的问题

    • 对于单一词语,只有少部分词与其同时出现,导致矩阵极其稀疏,因此需要对词频做额外处理来达到好的矩阵分解效果
    • 矩阵非常大,维度太高
    • 需要手动去掉停用词(如although, a,…),不然这些频繁出现的词也会影响矩阵分解的效果

    2 基于语言模型的方法

    按照语言模型的演进历史,大体可分为三类:文法型语言模型、统计语言模型、神经概率语言模型;文法型语言模型是人工撰写的语言规则,这里不做赘述

    2.1 基于 n-gram 的语言模型

    基于 n-gram 的语言模型是基于统计的语言模型,在NLP任务中,我们往往要计算一个句子出现的概率,通常的做法是:

    1. 对于句中的每个词,计算在给定前边所有词的条件下每个词出现的条件概率 p(wt|wt-1…w1)
    2. 将每个词出现的条件概率连乘,从而得到当前句子出现的概率(当前句子对应词语组合出现的概率)公式如下:
      p ( S ) = P ( w 1 , w 2 , . . . , w T ) = ∏ t = 1 T p ( w t ∣ w t − 1 , w t − 2 , . . . , w 1 ) p(S)=P(w_1, w_2, ..., w_T)=\prod_{t=1}^Tp(w_t|w_{t-1}, w_{t-2}, ..., w_1) p(S)=P(w1,w2,...,wT)=t=1Tp(wtwt1,wt2,...,w1)

    但是上述方法有两个缺陷:
    4. 参数空间过大,概率 p(wt|wt-1…w1) 的参数有 O(n)O(n)O(n) 个。
    5. 数据稀疏严重,有些词同时出现的情况可能没有,组合阶数高时尤其明显。

    为了解决上述问题,n-gram 模型使用n阶马尔可夫假设对上述p(S)公式进行了简化处理,即用前n-1个词代替当前词前边的所有词计算当前词出现的条件概率,简化后的p(S)公式如下:

    p ( w t ∣ w t − 1 , w t − 2 , . . . , w 1 ) ≈ p ( w t ∣ w t − 1 , w t − 2 , . . . , w t − n + 1 ) p(w_t|w_{t-1}, w_{t-2}, ..., w_1) \approx p(w_t|w_{t-1}, w_{t-2}, ..., w_{t-n+1}) p(wtwt1,wt2,...,w1)p(wtwt1,wt2,...,wtn+1)

    每个单词出现的条件概率如下:
    在这里插入图片描述

    简单解释一下n阶马尔可夫假设:

    • 简单来说,n阶马尔可夫假设的意思就是:符合马尔科夫过程的随机变量,当前状态只和前n-1个状态有关,即N阶马尔可夫假设认为,当前词出现的概率只依赖于前 n-1 个词
    • 1阶马尔科夫假设当前状态只和当前状态有关,1阶马尔科夫假设不会考虑上下和当前次的关系,因此n一般大于1

    这里插一嘴,笔者认为 虽然 n-gram 只用到了前 n-1 个数据,但是这前 n-1 个数据也是由前边数据得出的,因此 n-gram 也间接用到了前边的数据

    2.2 基于神经网络的语言模型

    基于神经网络的语言模型根据学习方法不同大体可以分为两大类,分别是Feature-based和Fine-tune,其中Feature-based学习方法就是通过神经网络获取词向量 ,ELMo、fastText、word2vec、NNLM就是Feature-based典型的例子
    详细了解Feature-based 和 Fine-tune 的区别请参考->#深入理解# NLP 中的 Feature-based 和 Fine-tune 两种学习方法
    虽然 ELMo、FastText、Word2vec等都是获取词向量的模型,但是fastText、word2vec (其实NNLM也能得到词向量)得到的是静态词向量,得到的词向量不考虑上下文(对于不同语境下的同一单词给出的词向量是相同的),因此不能够解决一次多义的问题。
    而 ELMo 等语言模型会根据词语的上下文的不同对同一词语给出不同的词向量,从而解决的一词多义的问题。

    2.2.1 word2vec

    word2vec 思想是训练一个神经网络,然后提取神经网络中的参数作为词语的词向量;训练网络的方式有两种,一种是cbow 一种是 skip-gram,前者是通过上下文词语预测中间词,后者是通过中间词预测周围词;哪种训练方法并不重要,我们也不会真正用这个模型去做预测,我们的目的是提取最终网络中的参数作为词语的词向量

    2.2.2 fastText

    fastText 设计之初是为了解决文本分类问题的,只不过在解决分类问题的同时 fastText 也能产生词向量,因此后来也被用来生成词向量
    fastText 和 word2vec 类似,也是通过训练一个神经网络,然后提取神经网络中的参数作为词语的词向量,只不过 fastText 训练网络的方法是对文本进行分类;此外 word2vec 的输入是多个词语的 noe-hot 编码,fastText的输入是多个单词及其n-gram特征;同时fastText为了解决类别过多导致的softmax函数计算量过大的问题,使用了层次softmax代替标准的softmax
    fastText 和 word2vec 最主要的区别如下:

    1. 输入增加了n-gram特征
    2. 使用 层次softmax做多分类
    3. 通过文本分类的方式来训练模型

    2.2.3 ELMo

    ELMo 模型是一个双向的动态语言模型,在给出词语的词向量时会考虑词语的上文和下文,从而解决word2vec所遇到的一词多义问题;

    1. ELMo得到词向量的过程

    1. 用通用语言模型(如word2vec、fastText、glove等)去训练一个静态词向量,ELMo内部使用 CNN-BIG-LSTM 语言模型得到的词向量,得到词向量的维度为 512
    2. 使用得到的静态词向量去训练ELMo网络
    3. 下游任务中使用词向量时,加载预训练的ELMo网络参数,根据当前上下文去动态调整词向量,从而得到一个动态的词向量。

    2. ELMo网络结构

    在这里插入图片描述

    上图展示的就是ELMo的网络结构,ELMo由两层网络组成,每层网络用于提取不同层级的特征;其中每层由两个方向相反的RNN网络构成(双向LSTM BiLSTM),分别记录上文信息和下文信息

    同时,为了保证网络的稳定,ELMo从最底层词嵌入层到第一层biLSTM输出层之间还有一个残差链接。

    3. 得到ELMo的词向量

    对于输入的第 i 个静态词向量(因为静态词向量通过 CNN-BIG-LSTM 得到,因此维度为512),ELMo最终会出输出1个静态词向量和两个动态词向量,分别是:

    1. h(i,0):将两个输入的静态词(复制一份)向量拼接在一起,维度是512+512=1024,拼接的目的是为了和后边两个词向量的维度统一
    2. h(i,1):将ELMo第1层两个反向LSTM的输出拼接,维度是512+512=1024
    3. h(i,2):将ELMo第2层两个反向LSTM的输出拼接,维度是512+512=1024

    ELMo中不同层的词向量往往的侧重点往往是不同的,输入层采用的 CNN-BIG-LSTM 词向量可以比较好编码词性信息,第 1 层 LSTM 可以比较好编码句法信息,第 2 层 LSTM 可以比较好编码单词语义信息。

    ELMo 的作者提出了两种使用词向量的方法:

    1. 是直接使用最后一层 biLSTM 的输出作为词向量,即 h(i,2)
    2. 更加通用的做法,将 h(i,0) 、h(i,1) 、h(i,2) 三个输出加权融合在一起,公式如下。其中γ 是一个与任务相关的系数,允许不同的 NLP 任务缩放 ELMo 的向量,可以增加模型的灵活性。sjtask是使用 softmax 归一化的权重系数,此方法得到的 ELMo 词向量可以看成是各层向量与初始静态词向量的ensemble

    在这里插入图片描述
    通过下面这张图片能形象地理解使用第二种方法获取词向量的过程
    在这里插入图片描述

    4. ELMo 优点

    • ELMo 的各层参数实际上就是为各种有监督的下游任务准备的,因此ELMo 可以被认为是一种迁移学习(transfer learning)。
    • 通过这样的迁移策略,那些对词义消歧有需求的任务就更容易通过训练给第二隐层一个很大的权重,而对词性、句法有明显需求的任务则可能对第一隐层的参数学习到比较大的值(实验结论)。总之,这样便得到了一份”可以被下游任务定制“的特征更为丰富的词向量。

    5. ELMo 缺点

    1. lstm是串行机制,训练时间长,从这一点来看ELMo 注定成为不了大哥,
    2. 相比于Transformer,lstm提取特征的能力还是不够的,我觉得未来lstm可能会被淘汰,毕竟屁股决定脑袋,时间为上!
    3. ELMo 的两个RNN网络是分别计算的,导致计算时上下文的信息不会相互通信,进而导致ELMo 得到的词向量有一定的局限性
      输出的结果只是讲两个RNN网络得到的结果拼接在一起,上下文信息并不会相互影响

    参考文章:
    8. 吾爱NLP(5)—词向量技术-从word2vec到ELMo
    9. 一文总结词向量的计算、评估与优化
    10. #深入理解# NLP 中的 Feature-based 和 Fine-tune 两种学习方法
    11. 动态词向量算法—ELMo

    展开全文
  • gensim生成词向量并获取词向量矩阵

    千次阅读 2020-07-07 17:16:55
    gensim生成词向量并获取词向量矩阵 word2vec是目前比较通用的训练词向量的工具,使用Gensim模块,可以使词向量的训练变的简单,但是调用gensim.models的word2vec模块使用skip-gram或CBOW完成词向量训练之后,如何...

    gensim生成词向量并获取词向量矩阵

    word2vec是目前比较通用的训练词向量的工具,使用Gensim模块,可以使词向量的训练变的简单,但是调用gensim.models的word2vec模块使用skip-gram或CBOW完成词向量训练之后,如何获取词向量中的词汇表以及对应的词向量矩阵呢。本文以一个小例子进行演示。

    1. 导入相关包

    主要用到了jieba和gensim包,可以使用命令行pip3 install gensim或下载gensim包的方式,具体不述。

    import jieba
    from gensim.models import Word2Vec
    

    1. 加载语料并清洗

    为了方便演示,本文直接定义了一个语料,并使用jieba进行分词操作。

    #  停用词
    stopword_list = []
    with open('./stopwords.txt', 'r+', encoding='utf8') as f:
        for word in f.readlines():
            if len(word)>0 and word != '\n\t':
                stopword_list.append(word)
                
    # 语料
    content = [
    "长江是中国第一大河,干流全长6397公里(以沱沱河为源),一般称6300公里。流域总面积一百八十余万平方公里,年平均入海水量约九千六百余亿立方米。以干流长度和入海水量论,长江均居世界第三位。",
    "黄河,中国古代也称河,发源于中华人民共和国青海省巴颜喀拉山脉,流经青海、四川、甘肃、宁夏、内蒙古、陕西、山西、河南、山东9个省区,最后于山东省东营垦利县注入渤海。干流河道全长5464千米,仅次于长江,为中国第二长河。黄河还是世界第五长河。",
    "黄河,是中华民族的母亲河。作为中华文明的发祥地,维系炎黄子孙的血脉.是中华民族民族精神与民族情感的象征。",
    "黄河被称为中华文明的母亲河。公元前2000多年华夏族在黄河领域的中原地区形成、繁衍。",
    "在兰州的“黄河第一桥”内蒙古托克托县河口镇以上的黄河河段为黄河上游。",
    "黄河上游根据河道特性的不同,又可分为河源段、峡谷段和冲积平原三部分。 ",
    "黄河,是中华民族的母亲河。"
    ]
    
    # 分词
    seg = [jieba.lcut(text) for text in content]
    
    # 清洗
    content_clean = []
    for t in seg:
        text_clean = []
        for i in t:
            if len(i)>1 and i != '\t\n': 
                if not i.isdigit():
                    if i.strip() not in stopword_list:
                        text_clean.append(i.strip())
        content_clean.append(text_clean)
    

    最后的content_clean为一个list,具体为:

    在这里插入图片描述

    3. 使用gensim训练词向量

    ## 用gensim训练词向量模型
    
    model = Word2Vec(content_clean, sg=1, size=100, window=5, min_count=2, negative=1, 
                     sample=0.001, workers=4)
    '''
    sg=1 是 skip-gram 算法,对低频词敏感;默认 sg=0 为 CBOW 算法。
    size 是输出词向量的维数,值太小会导致词映射因为冲突而影响结果,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间。
    window 是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b 个词,后面看 b 个词(b 在0-3之间随机)。
    min_count 是对词进行过滤,频率小于 min-count 的单词则会被忽视,默认值为5。
    negative 和 sample 可根据训练结果进行微调,sample 表示更高频率的词被随机下采样到所设置的阈值,默认值为 1e-3。
    hs=1 表示层级 softmax 将会被使用,默认 hs=0 且 negative 不为0,则负采样将会被选择使用。
    '''
    
    
    # 训练后的模型model可以保存,备用
    model.save('./word2vec')   #保存
    model = Word2Vec.load('word2vec')   #加载model
    

    代码中model是一个训练好的词向量模型,里面包含许多内容,可以获取词汇表和对应的词向量。

    ## 获取词汇
    words = model.wv.index2word
    print(words)                 # 长度18
    
    # ['黄河', '长江', '中国', '干流', '中华民族', '母亲河', '第一', '全长',
    #    '公里', '入海', '水量', '世界', '内蒙古', '河道', '长河', '中华文明', '民族', '上游']
    
    
    ## 获取对应词向量
    vectors = model.wv.vectors
    print(vectors)    # 18*100   100为设置的size,即词向量维度
    
    #[[ 1.2898202e-03 -3.4580764e-03  3.4779524e-03 ... -3.6768757e-03
    #   2.6582647e-03 -3.7408734e-03]
    # [ 2.9404070e-03  3.9611240e-03 -2.1796243e-03 ...  2.3843886e-03
    #  -4.3357350e-03 -3.3540600e-03]
    # [ 4.9255025e-03  1.4151304e-03 -8.7503344e-04 ...  4.2551141e-03
    #  -2.9053804e-03  3.6766860e-03]
    # ...
    # [ 1.9452259e-03  4.8658932e-03 -2.3852135e-03 ... -2.7566685e-03
    #   4.9943980e-03 -3.9313175e-03]
    # [ 5.2972522e-04  4.8273476e-03 -3.0694890e-03 ...  4.2261067e-03
    #   9.7657423e-05  4.4411011e-03]
    # [-2.2659900e-03  1.5058877e-03 -4.7887382e-03 ...  2.4552434e-03
    #   4.4189487e-04  5.9008709e-04]]
    
    
    ## 根据指定词获取该词的向量
    vec = model.wv['长江']
    print(vec)
    
    #[ 2.9404070e-03  3.9611240e-03 -2.1796243e-03  3.5846021e-03
    # -8.5443829e-04 -1.5641276e-03 -1.6966875e-03 -4.6902820e-03
    # -4.3645203e-03 -1.8363699e-03 -3.9727231e-03  4.7817207e-03
    # -1.3380363e-03 -2.6813489e-03  4.1867769e-03  3.4822649e-03
    # -3.9391480e-03 -2.3266519e-03  1.4906399e-03 -7.4510416e-04
    # ...
    
    
    ## 判断词之间的相似度
    print(model.similarity('黄河','黄河'))   #1.0
    print(model.similarity('黄河','长江'))   #-0.08
    print(model.similarity('黄河','中国'))   #0.14
    
    
    ## 预测与'黄河'和'母亲河'最相似,而与长江不接近的词
    print(model.most_similar(positive=['黄河','母亲河'], negative=['长江']))
    
    #[('长河', 0.10036612302064896), ('世界', 0.065335713326931), 
    # ('民族', 0.05369586870074272), ('中华民族', 0.03456304967403412), 
    # ('入海', 0.00084715336561203), ('公里', -0.007249757647514343), 
    # ('第一', -0.0175853930413723), ('内蒙古', -0.0281079038977623), 
    # ('干流', -0.02939787693321705), ('上游', -0.029546111822128296)]
    #__main__:1: DeprecationWarning: Call to deprecated `most_similar` 
    #(Method will be removed in 4.0.0, use self.wv.most_similar() instead).
    
    
    展开全文
  • 从Bert预训练数据集中获取词向量

    千次阅读 2019-08-14 21:10:00
    在一些操作过程中,经常要获取词向量,BERT做为一个在各项评测指标中都比较出色的,且提供了许多预训练模型的,从其中获取词向量是一些任务中必备的操作。 现将其获取过程界面截图如下: (代码可见图中操作) ...

    在一些操作过程中,经常要获取词向量,BERT做为一个在各项评测指标中都比较出色的,且提供了许多预训练模型的,从其中获取词向量是一些任务中必备的操作。

    现将其获取过程界面截图如下:

    (代码可见图中操作)

    下面这个图,可以按照指定的词汇进行获取其词向量。

    展开全文
  • pytorch 中加载 bert 模型, 获取 词向量

    万次阅读 2020-08-01 08:08:10
    bert-wwm RBT3 hfl/rbt3 RBTL3 hfl/rbtl3 下面为获取 词向量的完整代码 import torch #from pytorch_transformers import BertTokenizer,BertModel from transformers import BertTokenizer, BertModel #MODELNAME='...
  • 搜狗语料库word2vec获取词向量

    千次阅读 2019-09-19 10:04:14
    word2vec模型的原理这里不再讲解,网上随便一搜,可以找到很多教程,这里是给个实例,基于上面处理好的语料训练词向量,使用的工具是gensim中自带的word2vec模型。 import logging import gensim.models as ...
  • word2vec获取词向量,查找相似词

    千次阅读 2019-07-14 20:58:45
    word2vec获取词向量,查找相似词 首先安装gensim, 训练或者下载别人训练好的word2vec模型 # coding=utf-8 from gensim.models import Word2Vec from gensim.models import KeyedVectors #model = Word2Vec.load('...
  • 最近用gensm的word2vec的模型训练词向量时,以前的别人的文章的代码: ngram_model_counter = Counter() for key in ngram_model.wv.vocab.keys(): #获取key值 if key not in stoplist: if len(key.split("_")...
  • 从xlnet预训练数据集中获取词向量

    千次阅读 2019-08-14 21:55:33
    如下展示了从XLNET预训练数据集中提取词向量的方法。 利用pytorch-transformers中的方法进行预训练模型加载,然后进行词向量获取和提取。
  • bert获取词向量做textcnn文本分类

    万次阅读 热门讨论 2019-08-13 15:06:59
    下面介绍获取词向量的方法 获取BERT词向量的时候用到了肖涵博士的bert-as-service,具体使用方式如下。 环境要求:python版本>=3.5,tensorflow版本>=1.10 相关包的安装: pip installbert-serving-server ...
  • 主要介绍了python获取txt文件词向量过程详解,如何读取完整的大文件,而不会出现内存不足memery error等问题,将读取出来的文件,保存为npy文件,根据词找到对应的向量,需要的朋友可以参考下
  • 使用BERT获取中文词向量

    万次阅读 热门讨论 2019-03-04 17:15:41
    BERT其中的一个重要作用是可以...然而BERT获取词向量的门槛要比word2vec要高得多。笔者在这里介绍一下如何获取BERT的词向量。 笔者在获取BERT词向量的时候用到了肖涵博士的bert-as-service,具体使用方式如下。 环境...
  • 使用pytorch获取bert词向量

    千次阅读 多人点赞 2020-07-19 22:48:46
    本文主要为如何使用pytorch来获取bert词向量。 首先安装pytorch-pretrained-bert包: pip install pytorch-pretrained-bert 然后加载预训练模型 from pytorch_pretrained_bert import BertTokenizer, BertModel, ...
  • bert获得词向量_BERT中的词向量指南

    千次阅读 2020-11-20 02:02:09
    我们可以用这些和句子的嵌入向量做什么?首先,这些嵌入对于关键字/搜索扩展、语义搜索和信息检索非常有用。例如,如果你希望将客户的问题或搜索与已经回答的问题或文档化的搜索相匹配,这些表示将帮助准确的检索...
  • num_worker的数量可以自行选择) 最后,在pycharm编写如下代码: from bert_serving.client import BertClient bc = BertClient() print(bc.encode(['北京'],['上海'])) 这样就可以获取词向量了!
  • pytorch_transformers使用之获取bert词向量

    万次阅读 多人点赞 2019-08-21 12:33:47
    pytorch_transformers使用之获取 pytorch_transformers 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新...
  • 最简单的方式获取ELMo得到的词向量

    千次阅读 热门讨论 2018-10-18 15:49:48
    本文的目的就是用最简单的方式获取 elmo 得到的word representation,看了一些其他人的介绍,其实最后对我有用的就这么多了,我只想要他生成的词向量。 简单介绍一下 elmo:Allen NLP在NAACL2018上的Best paper - ...
  • 使用google的Bert获得中文的词向量

    千次阅读 2019-05-06 20:37:20
    使用google的Bert获得中文的词向量Bret介绍下载代码和模型 Bret介绍 ...本文主要介绍如何使用Bret获取到中文的词向量,用于后续的诸如文本分类、命名实体识别、情感分类等工作。 下载代码和模型 Go...
  • bert-embedding:如何得到BERT训练的词向量

    千次阅读 热门讨论 2020-11-27 15:57:16
    网上有很多封装好的BERT模型,我们可以下载下来训练我们的句向量或词向量。这些BERT模型已经在大规模语料集上预训练过了,再训练的话就是微调了。那么有没有办法直接获得预训练好的词向量(类似于glove)呢。 办法...
  • 通常,嵌入大小是 BERT 模型编码的词向量的长度。实际上,它将任意长度的单词编码为一个恒定长度的向量。但是,不同的 BERT 模型可能会有所不同。 计算词之间的相似度 到现在为止,一切都还不错!对于那些只是一些...
  • NLP-Tfidf/词向量

    2021-11-14 17:04:10
    二、词向量 1.One-hot表示法的缺点 2.分布式表示法 3.词向量到句子向量 一、TF-IDF表示法 1.词频表示句子的缺点 TF-IDF表示法可以更好地表示句子之间的相似度。如果仅仅是通过统计词频的方式来表示一个句子的...
  • 参考:...CBOW模型根据中心W(t)周围的来预测中心 Skip-gram模型则根据中心W(t)来预测周围 模型计算word2vec的流程:以CBOW模型的流程为例 输入层:上下文单词的onehot...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,371
精华内容 13,348
关键字:

获取词向量