精华内容
下载资源
问答
  • 单词向量化
    更多相关内容
  • 而是文章的作者与众不同,写文章的不是人,而是网络机器人,或者说是人工智能,是算法通过分析大量财经文章后,学会了人如何编写财经报道,然后根据相关模式,把各种财经数据组织起来,自动的生成一篇文章,当人...

    前几年,腾讯新闻曾发出一片具有爆炸性的文章。并不是文章的内容有什么新奇之处,而是文章的作者与众不同,写文章的不是人,而是网络机器人,或者说是人工智能,是算法通过分析大量财经文章后,学会了人如何编写财经报道,然后根据相关模式,把各种财经数据组织起来,自动化的生成一篇文章,当人阅读时,根本无法意识到文章不是人写,而是电脑生成的。

    从本节开始,如何使用神经网络构造出一个能阅读,理解人类文本含义的智能程序。就如同前一章讲述的图像识别网络,本质上并不是网络能像人一样看懂了图片内涵,而是网络通过读取大量图片数据,从数据中抽取出某种固定规律,我们本章要开发的神经网络也同理,它会从大量的文本数据中分析抽取出其潜在的固定模式或规律。

    要想让网络能够分析文本,我们首先要做的是将文本进行数据化。它主要包含几个方面的内容:一种方法是将文本分割成词组,并将词组转变为向量。一种方法是将文本分割成一系列字符的组合,然后用向量表示每个字符。第三种方法是把若干个词或字符组合成一个集合,然后将他们转换成向量。无论何种情况,我们都把被向量化的对象成为token,而把整篇文章分解成token的过程叫tokenization。

    举个具体例子,假设我们有一条英文句子”The cat jump over the dog”,如果我们采用第一种方法,那么我们把句子分解成多个单词:’The’,’cat’,’jump’,’over’,’the’,’dog’。然后通过算法为每个单词构造一个向量:
    ‘the’->[0.0, 0.0, 0.4,0.0,1.0,0.0]
    ‘cat’->[0.5, 1.0, 0.5, 0.2, 0.5, 0.5, 0.0]等,后面我们会研究单词是如何转换成向量的。

    有一种把单词向量化的简单方法叫one-hot-encoding,我们在前面章节看过这种向量,它所有元素都是0,只有某个位置是1,例如上面例句中总共有5个不同单词,于是我们可以用含有5个元素的向量来表示:
    ‘The’ -> [1,0,0,0,0], ‘cat’->[0,1,0,0,0], ‘jump’->[0,0,1,0,0]以此类推。

    我们看一段如何将单词进行one-hot-encoding的代码:

    import numpy as np
    samples = ['The cat jump over the dog', 'The dog ate my homework']
    
    #我们先将每个单词放置到一个哈希表中
    token_index = {}
    for sample in samples:
        #将一个句子分解成多个单词
        for word in sample.split():
            if word not in token_index:
                token_index[word] = len(token_index) + 1
    
    #设置句子的最大长度
    max_length = 10
    results = np.zeros((len(samples), max_length, max(token_index.values()) + 1))
    for i, sample in enumerate(samples):
        for j, word in list(enumerate(sample.split()))[: max_length]:
            index = token_index.get(word)
            results[i, j, index] = 1.
            print("{0} -> {1}".format(word, results[i, j]))
    

    上面代码运行后结果如下:

    屏幕快照 2018-08-02 下午4.19.33.png

    其实这种”脏活累活“不需要我们亲自动手,keras框架提供了一系列接口帮我们省却了这些麻烦,下面代码同样能实现相同内容:

    from keras.preprocessing.text import Tokenizer
    samples = ['The cat jump over the dog', 'The dog ate my homework']
    #只考虑最常使用的前1000个单词
    tokenizer = Tokenizer(num_words = 1000)
    tokenizer.fit_on_texts(samples)
    #把句子分解成单词数组
    sequences = tokenizer.texts_to_sequences(samples)
    print(sequences)
    one_hot_vecs = tokenizer.texts_to_matrix(samples, mode='binary')
    
    word_index = tokenizer.word_index
    print("当前总共有%s个不同单词"%len(word_index))

    上面代码运行后,结果如下:

    [[1, 3, 4, 5, 1, 2], [1, 2, 6, 7, 8]]
    当前总共有8个不同单词

    one_hot_vecs对应两个含有1000个元素的向量,第一个向量的第1,3,4,5个元素为1,其余全为0,第二个向量第1,2,6,7,8个元素为1,其余全为0.

    接下来我们要看自然语言处理中一个极为关键的概念叫word embedding,也就是用非零向量来表示每一个单词。one-hot-vector对单词进行编码有很多缺陷,一是冗余过多,一大堆0,然后只有一个1,二是向量的维度过高,有多少个单词,向量就有多少维度,这会给计算带来很多麻烦,word-embedding把原来高维度的冗余向量转换为低纬度的,信息量强的向量,转换后的向量,无论单词量多大,向量的维度一般只有256维到1024维。

    单词向量化的一个关键目标是,意思相近的单词,他们对应的向量之间的距离要接近,例如”good”,”fine”都表示“好”的意思,因此这两个单词对应的向量在空间上要比较接近的,也就是说意思相近的单词,他们对应的向量在空间上的距离应该比较小。假设给定4个单词:‘cat’, ‘dog’, ‘wolf’, ‘tiger’,其中前两个猫和狗相似性强,后两个狼和狗相似性强,因此当他们转换成向量时,在空间距离上会形成两个集合,例如下图:

    屏幕快照 2018-08-02 下午5.16.10.png

    给定一个单词,我们如何生成对应向量呢?我们可以构造一个网络来实现这个目标,假设有两个单词,”good”, “fine”,我们随机给他们赋值两个向量,然后不断的训练网络,让这两个向量之间的距离变得越来越小,好在我们不用从零开始开发这样的网络,keras框架给我们提供了现成可用的类似网络,我们看下面一段代码:

    from keras.layers import Embedding
    #Embedding对象接收两个参数,一个是单词量总数,另一个是单词向量的维度
    embedding_layer = Embedding(1000, 64) 

    上面代码创建一个叫Embedding的网络层,它接收的参数格式如(samples, sequence_length),假设我们现在有32条句子,每条句子最多包含10个单词,那么我们提交的输入参数就是(32, 10),Embedding一开始会给每个单词随意生成一个含有64个元素的向量,然后通过读入大量的数据,调整每个单词对应的向量,让意思相近的单词所对应的向量在空间上的距离越来越近。

    详细理论不多说,我们先跑起来一个例子,看看如何分析影评文本所展现的情绪,我们使用的还是以前见过的IMDB数据,我们只抽取每篇影评的前20个单词,然后为单词向量化,由于影评中只有两种情绪,好和坏,好影评中所用到的单词大多含有“好”的意思,因此对应的向量在空间上会聚合在一起形成一个集合,坏影评使用的单词大多都包含“坏”的意思,于是他们对应的向量就会聚合到一起形成另一个集合,当遇到新影评时,我们也把它的前20个单词向量化,然后看这些向量靠近哪一个集合,如果靠近第一个集合,我们就预测该影评包含正能量,如果靠近第二个集合,我们就认为影评包含负能量。我们看看代码的实现:

    from keras.models import Sequential
    from keras.layers import Flatten, Dense
    
    model = Sequential()
    #在网络中添加Embedding层,专门用于把单词转换成向量
    model.add(Embedding(10000, 8, input_length=maxlen))
    
    '''
    我们给Embeding层输入长度不超过maxlen的单词向量,它为每个单词构造长度为8的向量
    它会输出格式为(samples, maxlen, 8)的结果,然后我们把它转换为(samples, maxlen*8)的
    二维格式
    '''
    model.add(Flatten())
    
    #我们在顶部加一层只含有1个神经元的网络层,把Embedding层的输出结果对应成两个类别
    model.add(Dense(1, activation='sigmoid'))
    model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics = ['acc'])
    model.summary()
    
    history = model.fit(x_train, y_train, epochs = 10, batch_size = 32, validation_split=0.2)

    运行上面代码后,我们把结果绘制出来,看看网络对检验是数据集的识别准确率:

    import matplotlib.pyplot as plt
    
    acc = history.history['acc']
    val_acc = history.history['val_acc']
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    
    epochs = range(1, len(acc) + 1)
    
    #绘制模型对训练数据和校验数据判断的准确率
    plt.plot(epochs, acc, 'bo', label = 'trainning acc')
    plt.plot(epochs, val_acc, 'b', label = 'validation acc')
    plt.title('Trainning and validation accuary')
    plt.legend()
    
    plt.show()
    plt.figure()
    
    #绘制模型对训练数据和校验数据判断的错误率
    plt.plot(epochs, loss, 'bo', label = 'Trainning loss')
    plt.plot(epochs, val_loss, 'b', label = 'Validation loss')
    plt.title('Trainning and validation loss')
    plt.legend()
    
    plt.show()

    上面代码运行后结果如下:

    屏幕快照 2018-08-03 上午8.28.29.png

    我们从上图可以看到蓝色实线看出,仅仅通过将影评的前20个单词向量化,在没使用任何调优手段的情况下,网络对校验是数据的识别准确率就达到75%左右。

    还记得前面我们使用预先训练好的网络大大提升图片识别率吗,单词向量化也一样,有人使用上面提到的Embedding网络层分析读取大量文本后,为常用的英文单词都建立了对应的向量。我们自己运用神经网络处理具体问题时,一大困难在于数据量太少,巧妇难为无米之炊,数据量太小,神经网络的精确度会受到极大的制约,如果我们手上的文本数量很少,那么为单词建立的向量就不会很准确,要弥补这些缺陷,我们可以使用别人训练好的结果。

    网络时代的一大优势就是,有人愿意把自己的劳动果实无偿分享出来。当前实现单词向量化的最好算法是由Google研究员Mikolov在2013年发明的Word2Vec算法,有人或组织就使用该算法分析大量英文文本后,为常用的单词建立向量,并把这些向量信息放在网上供人下载。另一个常用的单词向量数据库叫”GloVe”,是由斯坦福教授根据单词的统计特性开发的向量化算法对常用单词向量化后形成的数据库。

    在下一节我们将看看,如何使用预先训练的单词向量化数据”GloVe”实现原始文本的分割,量化并进行有效的分析。

    更详细的讲解和代码调试演示过程,请点击链接

    更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号:
    这里写图片描述

    展开全文
  • 直接理解就是将单词转化为一个向量 参考:https://zhuanlan.zhihu.com/p/345450458 >例如,一个包含单词的集合内有5个单词[“hello“ “you” ”are“ ”good“ ”day”], >每个单词由四个向量值组成,如 ...

    直接理解就是将单词转化为一个向量

    参考:https://zhuanlan.zhihu.com/p/345450458

    >例如,一个包含单词的集合内有5个单词[“hello“ “you” ”are“ ”good“ ”day”],
    >每个单词由四个向量值组成,如 hello 由 [1,2,0,0](只是说明,程序中自动生成)表示,
    >其他单词也是由4个值表示,这时就可以用"nn.Embedding(5, 4)"来表示
    

    借用参考连接中的程序

    import torch
    from torch import nn
    ## 五个单词[“hello“ “you” ”are“ ”good“ ”day”],可以按索引对应数字[0-4],也可以打乱,但在最后的对应关系要一致
    embedding = nn.Embedding(5, 4) # 假定字典中只有5个词,词向量维度为4
    word = [[1, 2, 3],  # 可以理解为“you” ”are“ ”good“
            [2, 3, 4]] # 可理解为”are“ ”good“ ”day”
            # 单词和数字对应关系是自己定义的,但要注意真实的对应关系
             		   #而且这些数字的范围只能在0~4之间,因为上面定义了只有5个词
    embed = embedding(torch.LongTensor(word))
    print(embed) 
    print(embed.size())
    

    运行结果如下,可分析出对同一个值的生成向量是相同的;经过两次运行发现同一个单词对应的两次向量不同,但在同一次中的向量值和单词对应关系一致
    在这里插入图片描述

    展开全文
  • ['thing', 'to', 'eat', 'food'] [6, 6, 1, 2, 18] [3, 3, 2, 4, 4] tokenizer = Tokenizer(num_words=4) #num_words:None或整数,个人理解就是对统计单词出现数量后选择次数多的前n个单词,后面的单词都不做处理。...

     

     

     

    https://blog.csdn.net/qq_16234613/article/details/79436941

    from keras.preprocessing import text
    from keras.preprocessing.text import Tokenizer

    text1='some thing to eat'
    text2='some some thing to drink'
    text3='thing to eat food'
    texts=[text1, text2, text3]

    # keras.preprocessing.text.text_to_word_sequence(text,
    #         filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n',
    #         lower=True,
    #         split=" ")
    print(text.text_to_word_sequence(text3))

    # 将一行文本使用hash原理转成one-hot形式,不是按照字典形式进行的映射
    # keras.preprocessing.text.one_hot(text,
    #       n,
    #      filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n',
    #      lower=True,
    #      split=" ")
    print(text.one_hot(text2,20))  #n表示编码值在1到n之间
    print(text.one_hot(text2,5))

    #result

    Using TensorFlow backend.
    
    ['thing', 'to', 'eat', 'food']
    [6, 6, 1, 2, 18]
    [3, 3, 2, 4, 4]

    tokenizer = Tokenizer(num_words=4) #num_words:None或整数,个人理解就是对统计单词出现数量后选择次数多的前n个单词,后面的单词都不做处理。
    tokenizer.fit_on_texts(texts)
    print("1=", tokenizer.texts_to_sequences(texts)) # 使用字典将对应词转成index。shape为 (文档数,每条文档的长度)
    print( "2=",tokenizer.texts_to_matrix(texts)) # 转成one-hot,与前面的不同。shape为[len(texts),num_words]
    print( "3=",tokenizer.word_counts) #单词在所有文档中的总数量,如果num_words=4,应该选择some thing to
    print( "4=",tokenizer.word_docs) #单词出现在文档中的数量
    print("5=", tokenizer.word_index) #单词对应的index

    print( "6=",tokenizer.index_docs) #index对应单词出现在文档中的数量

     

    #result

    1= [[1, 2, 3], [1, 1, 2, 3], [2, 3]]
    2= [[0. 1. 1. 1.]
     [0. 1. 1. 1.]
     [0. 0. 1. 1.]]
    3= OrderedDict([('some', 3), ('thing', 3), ('to', 3), ('eat', 2), ('drink', 1), ('food', 1)])
    4= defaultdict(<class 'int'>, {'eat': 2
    , 'thing': 3, 'some': 2, 'to': 3, 'drink': 1, 'food': 1})
    5= {'some': 1, 'thing': 2, 'to': 3, 'eat': 4, 'drink': 5, 'food': 6}
    6= defaultdict(<class 'int'>, {4: 2, 2: 3, 1: 2, 3: 3, 5: 1, 6: 1})

    三、属性详解

    word_counts :字典,将单词(字符串)映射为它们在训练期间出现的次数。仅在调用fit_on_texts之后设置。

    word_docs :字典,将单词(字符串)映射为它们在训练期间所出现的文档或文本的数量。仅在调用fit_on_texts之后设置。

    word_index :字典,将单词(字符串)映射为它们的排名或者索引。仅在调用fit_on_texts之后设置。

    document_count :整数。分词器被训练的文档(文本或者序列)数量。仅在调用fit_on_texts或fit_on_sequences之后设置。

    https://zhuanlan.zhihu.com/p/138054335

     

     

    展开全文
  • (文本向量化表示工具,包括词向量化,句子向量化) 特征 文本向量表示 字词粒度,通过腾讯AI Lab开放式的大规模扩展中文 (文件名:light_Tencent_AILab_ChineseEmbedding.bin密码:tawe),获取字词的word2vec矢量...
  • 于是,文本向量化便是对文本处理的关键一步,所谓文本向量化就是将文本转化为数值型张量的过程。他有多种实现方式: 将文本分割成单词,将每个单词转化为一个向量 将文本分割成字符,将每个字符转化为一个向量 提取...
  • 这里讨论如何把一个个的单词转换为向量。这是单词的表示形式(Representation),我们希望这个表示形式,能够捕抓到单词的意思(Meanings)、单词间的语义关系(Semantic Relationships),以及单词所出现的上下文。
  • # GloVe: 全局向量 #%% # 这些都是我们稍后将要使用的模块.在继续操作之前,请确保可以导入它们 %matplotlib inline from __future__ import print_function import collections import math import numpy as np ...
  • PyTorch学习笔记——词向量简介

    千次阅读 2021-03-05 14:07:14
    上一篇:PyTorch学习笔记——PyTorch简介 下一篇:PyTorch学习笔记——语言模型 为什么需要词向量 为了便于计算机处理,我们需要把文档、单词向量化。 而且除了向量化之后,还希望单词的表达能计算相似词信息。 ...
  • 近年来的单词向量化方法大多基于 “单词含义由其周围的单词构成” 这一分布式假设。 在基于计数的方法中,对语料库中的每个单词周围的单词的出现频数进行计数并汇总(=共现矩阵)。 通过将共现矩阵转化为 PPMI...
  • 要在本地运行,您需要下载Conceptnet Numberbatch单词向量。 这是由words/create_data_file.py脚本自动完成的,该脚本还将已处理的版本(规范版本和仅包含美式英语单词)保存到embeddings.h5 。 一旦脚本运行完毕...
  • 中文向量化常用方法

    千次阅读 2019-12-31 10:14:41
    文本向量化(又称“词向量模型”、“向量空间模型”)即将文本表示成计算机可识别的实数向量,根据粒度大小不同可将文本特征表示分为字、词、句子或篇章几个层次。文本向量化的方法主要分为离散表示和分布式表示。 ...
  • 上一节我们讨论路单词向量化的算法原理。算法的实现需要有大量的数据,一般而言你要收集到单词量在四十亿左右的文本数据才能通过上一节的算法训练处精准的单词向量,问题在于你很难获取如此巨量的数据来训练单词向量...
  • 本文为大家共享了Python文本特征抽取与向量化的详细代码,供大家参考,详细内容如下假设我们刚看完诺兰的大片《星际穿越》,设想怎么让机器来自动分析各位观众对电影的评价到底是“赞”(positive)还是“踩”...
  • 目标:本文讨论单词向量的组合方式(composition of word vectors),一般指两个单词向量的组合方式,使得输出的新的向量能够表达组合后的短语的语义。 本文使用符号: u,v:普通的单词向量(u_1,u_2,u_3)和(v_1,v_2...
  • 前言 Word Embedding是整个自然语言处理(NLP)中最常用的技术点之一,广泛应用于企业的建模实践中。我们使用Word Embedding能够将...一句话概述,Word Embedding即词向量,是一种函数映射关系。我们知道,在机器学习中
  • 还是看图说话: 就是我们事先训练好了一个词嵌入矩阵(怎么训练的先不用管,这是后面实战的任务,后面会说), 这个矩阵的每一列其实就是每个单词的词向量,每一行表示一个特征,上图是一个300*10000的矩阵,就是...
  • 文本向量化

    万次阅读 2018-09-02 15:50:35
    Table of Contents 概述 word2vec NNLM C&amp;...文本表示是自然语言处理中的基础工作,文本表示的好坏直接影响到整个自然语言处理系统的性能。...目前对文本向量化大部分的研究都是通过词向量化实现的,...
  • 文本数据简单向量化

    2020-10-20 23:22:02
    这篇博客就讲解给定一个已经分词、去除停用词后的文本数据集,如何将其向量化的方法。 one-hot表示法 one-hot表示法先将文本数据集中不重复的单词提取出来,得到一个大小为V的词汇表。然后用一个V维的向量来表示一个...
  • 关于word2vec词向量化

    千次阅读 2022-02-12 16:28:39
    word2vec最主要的目的就是进行文本向量化 词向量维度通常是50-300维,goole官方提供的一般是用300维,有了词向量就可以用各种方法进行相似度计算;一般维度越高,提供的信息越多,计算结果可靠性也更值得信赖。 ...
  • 文本向量化常用算法介绍,word2vec及doc2vec 向量化方法的模型训练和使用 7.1 文本向量化概述 即将文本表示为一系列能表达文本语义的向量; 7.2 向量化算法word2vec 词袋(Bag of Word)模型:最早的以词语为...
  • 一句话概括词向量用处:就是提供了一种数学的方法,把自然语言这种符号信息转化为向量形式的数字信息。这样就把自然语言问题要转化为机器学习问题。 最常用的词向量模型无非是 one-hot Representation模型和 ...
  • 因此,将单词的词向量映射到空间坐标系中进行可视观察,是最简单的词向量表示质量评价方法。 词向量的可视 可视中,三维空间绘图较为容易实现,对于高于3个维度的向量要先通过降维算法压缩到3维及以内,然后才...
  • 文本向量化——基于TF-IDF词袋模型的文本向量化方法 点这里,上一篇文章——基于高频词汇的文本向量化方法 1、解释TF-IDF词袋模型 TF:词频 IDF:逆向文件频率 举例子解释:假如有一个包含100篇文章的文本集合,里面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,401
精华内容 16,160
关键字:

单词向量化