精华内容
下载资源
问答
  • 文本向量化理论篇)

    千次阅读 2019-09-26 19:49:25
    以第一个文本的向量化结果 [1, 2, 1, 1, 1, 0, 0, 0, 1, 1] 为例,2在第二维上,ID为2的词语是likes,在第一个文本中出现了2次,所以第二维上的数值是2 这种方式不像One-hot编码那样导致维数非常大,但也有自己的 ...

    本文介绍常见的文本表示模型,One-hot、词袋模型(BOW)、TF-IDF、N-Gram和Word2Vec

    一、离散表示
    1、One-hot编码
    2、词袋(BOW)模型
    3、TF-IDF
    4、N-Gram模型

    二、分布式表示
    1、共现矩阵
    2、Word2Vec模型 

    一、离散表示

    1、One-hot编码

    One-hot编码是非常用的方法,我们可以用One-hot编码的方式将句子向量化,大致步骤为:

    • 用构造文本分词后的字典
    • 对词语进行One-hot编码

    John likes to watch movies. Mary likes too

    John also likes to watch football games.

    上面的两句话分词后可以构造一个字典,字典内容如下,字典的键是词语,值是ID

    {"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10}

    我们可以根据ID值对每个词语进行向量化,用0和1代表这个词是否出现

    # John
    [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    # too
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

    用One-hot编码有明显的缺点

    • 维数过高。我们这里只有短短的2句话,每个词语已经是一个10维的向量了,随着语料的增加,维数会越来越大,导致维数灾难
    • 矩阵稀疏。利用One-hot编码的另一个问题就是矩阵稀疏,从上面也可以看到,每一个词向量只有1维是有数值的,其他维上的数值都为0
    • 不能保留语义。用这种方式得到的结果不能保留词语在句子中的位置信息, “我爱你” 和 “你爱我” 的向量化结果并没有什么不同。

    2、词袋(BOW)模型

    词袋模型(Bag-of-words model,BOW),BOW模型假定对于一个文档,忽略它的单词顺序和语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,不依赖于其它单词是否出现。

    John likes to watch movies. Mary likes too

    John also likes to watch football games.

    使用之前同样的例子,跟前面一样,将上面的两句话中看作一个文档集,列出文档中出现的所有单词(忽略大小写与标点符号),构造一个字典

    {"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10}

    再用再将句子向量化,维数和字典大小一致,第 i 维上的 数值 代表 ID 为 i 的词语在这个句子里出现的频次

    # 第一个文本
    [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
    # 第二个文本
    [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

    以第一个文本的向量化结果 [1, 2, 1, 1, 1, 0, 0, 0, 1, 1] 为例,2在第二维上,ID为2的词语是likes,在第一个文本中出现了2次,所以第二维上的数值是2

    这种方式不像One-hot编码那样导致维数非常大,但也有自己的缺点

    • 不能保留语义:不能保留词语在句子中的位置信息,“你爱我” 和 “我爱你” 在这种方式下的向量化结果依然没有区别。“我喜欢北京” 和 “我不喜欢北京” 这两个文本语义相反,利用这个模型得到的结果却能认为它们是相似的文本。
    • 维数高和稀疏性:当语料增加时,那么维数也会不可避免的增大,一个文本里不出现的词语就会增多,导致矩阵稀疏

    3、TF-IDF

    TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。

    字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章。

    TF-IDF公式如下:

     

     TF(t,d)表示 语t 在 文档d 中出现的频率,IDF(t)是逆文本频率指数,它可以衡量 单词t 用于区分这篇文档和其他文档的重要性。IDF的公式如下,分母加1是为了避免分母为0

    比如在10篇文档中,1篇是猴子的,9篇是关于人的,关于人的文章中不出现 “尾巴” 这个词语,10篇文章中都出现 “嘴巴” 这个词语,那么 “尾巴” 这个词在这些文章中就很有区分度。从公式的角度也很容易看出。以10为底数的话,IDF(尾巴) = 0.70, IDF(嘴巴) = -0.04,说明 “尾巴” 重要性更高点,它有区分性。

    前面说的缺点依然存在,它依然不能保留词语在句子中的位置关系。

    4、N-Gram

    N-Gram语言模型的思想就是,给定一串字母,下一个最大可能出现的词语是什么?比如 “今天你”,后面跟 “吃饭” 可能性大,但跟着 “后天” 的可能性就很小。

    N=1时称为unigram,N=2称为bigram,N=3称为trigram,假设下一个词的出现依赖它前面的一个词,即 bigram,假设下一个词的出现依赖它前面的两个词,即 trigram,以此类推。

    以下面的文本为例

    你帮我

    我帮你

    它的bigram依次为:

    你,你帮,帮,帮我,我
    我,我帮,帮,帮你,你

    同样地,我们可以构造一个字典

    {"": 1, "你帮"; 2, "": 3"帮我": 4, "": 5, "我帮": 6, "帮你": 7}

    向量化结果可以表示为

    # 第一个文本
    [1, 1, 1, 1, 1, 0, 0]
    
    # 第二个文本
    [1, 0, 1, 0, 1, 1, 1]

    N-Gram基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关(这也是隐马尔可夫当中的假设)。整个句子出现的概率就等于各个词出现的概率乘积,公式如下:

    上面的表达式并不好计算,引入马尔科夫假设,那么可以将式子写成

    马尔可夫链(Markov chain)为状态空间中经过从一个状态到另一个状态的转换的随机过程。该过程要求具备“无记忆”的性质:下一状态的概率分布只能由当前状态决定,而与之前的状态无关

     特别地,对unigram,有

    对bigram,有

      对trigram,有

     N-Gram考虑了词的顺序,信息量更充分

    缺点是随着N的增大,词表迅速膨胀,数据出现大量稀疏的问题。

    5、总结

    由于存在以下的问题,对于一般的NLP问题,是可以使用离散表示文本信息来解决问题的,但对于要求精度较高的场景就不适合了。

    • 无法衡量词向量之间的关系。
    • 词表的维度随着语料库的增长而膨胀。
    • n-gram词序列随语料库增长呈指数型膨胀,更加快。
    • 离散数据来表示文本会带来数据稀疏问题,导致丢失了信息,与我们生活中理解的信息是不一样的。

    二、分布式表示

    科学家们为了提高模型的精度,又发明出了分布式的表示文本信息的方法。

    用一个词附近的其它词来表示该词,这是现代统计自然语言处理中最有创见的想法之一。当初科学家发明这种方法是基于人的语言表达,认为一个词是由这个词的周边词汇一起来构成精确的语义信息。就好比,物以类聚人以群分,如果你想了解一个人,可以通过他周围的人进行了解,因为周围人都有一些共同点才能聚集起来。

    1、共现矩阵

    共现矩阵顾名思义就是共同出现的意思,词文档的共现矩阵主要用于发现主题(topic),用于主题模型,如LSA。

    局域窗中的word-word共现矩阵可以挖掘语法和语义信息,例如:

    I like deep learning.
    I like NLP.
    I enjoy flying.

    有以上三句话,设置滑窗(对称窗口)为2,可以得到一个词典:{"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"}。

    我们可以得到一个共现矩阵(对称矩阵):

    中间的每个格子表示的是行和列组成的词组在词典中共同出现的次数,也就体现了共现的特性。比如例如:“I like”出现在第1,2句话中,一共出现2次,所以=2。 对称的窗口指的是,“like I”也是2次

    存在的问题:

    • 向量维数随着词典大小线性增长。
    • 存储整个词典的空间消耗非常大。
    • 一些模型如文本分类模型会面临稀疏性问题。
    • 模型会欠稳定,每新增一份语料进来,稳定性就会变化。

    2、Word2Vec

    谷歌2013年提出的Word2Vec是目前最常用的词嵌入模型之一。Word2Vec实际 是一种浅层的神经网络模型,它有两种网络结构,分别是CBOW(Continues Bag of Words)连续词袋Skip-gram

    2.1、CBOW

    CBOW是一个三层神经网络,特点是输入已知上下文,输出对当前单词的预测。 CBOW通过中间词来预测窗口中上下文词出现的概率模型,把中间词当做y,把窗口中的其它词当做x输入,x输入是经过one-hot编码过的,然后通过一个隐层进行求和操作,最后通过激活函数softmax,可以计算出每个单词的生成概率,接下来的任务就是训练神经网络的权重,使得语料库中所有单词的整体生成概率最大化,而求得的权重矩阵就是文本表示词向量的结果。。

    举一个例子,我们有以下文本

    I drink coffee everyday

    假设我们输入为 I, drink, everyday,那么我们训练的神经网络要使 coffee 的输出概率最大。首先,我们将原来的文本的单词用One-hot编码表示,如下图所示

     

    初始化输入权重矩阵 W 和输出权重矩阵 W',利用这个权重矩阵W和One-hot编码完的向量相乘,可以得到唯一的向量V,相当于根据One-hot编码中1的位置取出W中的对应的列,除非两列完全相同,否则得到的向量不会是一样的。

    我们这里有3个输入值,将3个输入值与W相乘得到的向量相加做平均,得到隐藏层向量

       隐藏层向量再乘以输出权重矩阵 W' ,得到一个输出向量

     对输出向量做softmax,得到输出概率

     2.2、Skip-Gram

    Skip-Gram与CBOW相反,即已知当前词语,预测上下文。通过当前词来预测窗口中上下文词出现的概率模型,把当前词当做x,把窗口中其它词当做y,依然是通过一个隐层接一个Softmax激活函数来预测其它词的概率。

    以下图举例,我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们将输入词前后各两个词和输入词进行组合作为训练样本。下图中,蓝色代表input word,方框内代表位于窗口内的单词。

    以第一条为例,The为输入词,但是The开头,前面没有词跟它组合,所以只能和后面两个单词分别组合。

    当quick输入时,它前面只有1个单词,所以一共只有3个组合。

    从brown开始,前面才会有2个及以上的单词,所以从这里开始有4个组合。

     

     我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“可乐“,”百事“)这样的训练样本对,而对于(”可乐“,”酱油“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词”可乐“作为输入,输出的结果中”百事““要比”酱油“的概率高。

     2.3、加速优化方法

    有Hierarchical Softmax(层次Softmax)和Negative Sample(负采样)两个加速方法,参考以下链接

     

     

     

     

    参考资料:

    https://github.com/mantchs/machine_learning_model/tree/master/Word2Vec

    https://www.jianshu.com/p/f8300129b568

    https://blog.csdn.net/weixin_43112462/article/details/88669902

    https://blog.csdn.net/lxg0807/article/details/78615917

    https://www.cnblogs.com/bep-feijin/p/9430164.html

    https://blog.csdn.net/yu5064/article/details/79601683

    https://www.jianshu.com/p/471d9bfbd72f

    https://www.zhihu.com/question/44832436

    http://www.dataguru.cn/article-13488-1.html

    转载于:https://www.cnblogs.com/dogecheng/p/11470196.html

    展开全文
  • 支持向量理论SVM

    2021-03-01 15:19:33
    1.线性可分支持向量机与硬间隔最大 1.1 线性可分支持向量机定义 说明: 1.2 函数间隔与几何间隔 1.3 硬间隔最大 2.线性支持向量机与软间隔最大

    1.线性可分支持向量机与硬间隔最大化

    在这里插入图片描述

    1.1 线性可分支持向量机定义

    在这里插入图片描述
    说明:
    在这里插入图片描述

    1.2 函数间隔与几何间隔

    在这里插入图片描述
    在这里插入图片描述

    1.3 硬间隔最大化

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.线性支持向量机与软间隔最大化

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 支持向量理论概述

    2015-05-09 11:38:28
    支持向量机的理论最初来自与对数据二值分类问题的处理。其处理机制可简单地描述为:寻找一个满足分类要求的最优分割超平面,使其在保证分类精度的问题同时最大超平面两侧的空白区域,这使得SVM分类器的结果不仅在...

    支持向量机的理论最初来自与对数据二值分类问题的处理。其处理机制可简单地描述为:寻找一个满足分类要求的最优分割超平面,使其在保证分类精度的问题同时最大化超平面两侧的空白区域,这使得SVM分类器的结果不仅在训练集上得到优化,而且在整个样本集上的风险也拥有上界,这就是Svmde结构风险最小化的理想,在线性不可分割的问题上,Vapnik等人成功地引入核空间理论,将低维的输入空间数据通过非线性映射函数映射到高维属性空间,从而把分类问题转化为高维属性空间,从而把分类问题转化到高维属性空间进行,可以证明,如果选用适当的映射函数,大多数输入空间线性不可分问题在属性空间可以转化为线性可分问题,这一问题的解决,使得SVM分类器正式成为通用分类器之一。

    展开全文
  • 文本向量化 介绍

    2021-01-22 12:24:09
    文本向量化理论篇) 文章目录1 文档信息的向量化1.1 文档信息的离散表示1.1.1 One-Hot独热编码表示法1.1.2 词袋模型Bag of Words(BOW)1.1.3 生成 文档词条矩阵1.1.3.1 用sklearn库实现1.1.4 从词袋模型到N-gram...

    学习笔记来源:Python文本挖掘视频教程

    补充文献:

    从离散到分布,盘点常见的文本表示方法

    文本向量化(理论篇)


    1 文档信息的向量化

    所谓文档信息的向量化,就是将信息数值化,从而便于进行建模分析

    自然语言处理面临的文本数据往往是非结构化杂乱无章的文本数据,而机器学习算法处理的数据往往是固定长度的输入和输出。因而机器学习并不能直接处理原始的文本数据。必须把文本数据转换成数字,比如向量

    因此

    文本表示的意思是把字词处理成向量或矩阵,以便计算机能进行处理。文本表示是自然语言处理的开始环节。

    文本表示按照细粒度划分,一般可分为字级别、词语级别和句子级别的文本表示。

    文本表示分为离散表示分布式表示。离散表示的代表就是词袋模型,one-hot(也叫独热编码)、TF-IDF、n-gram都可以看作是词袋模型。分布式表示也叫做词嵌入(word> embedding),经典模型是word2vec,还包括后来的Glove、ELMO、GPT和最近很火的BERT。
    (引自:https://blog.csdn.net/nc514819873/article/details/89444948)

    也就是

    常见的文本表示模型有One-hot、词袋模型(BOW)、TF-IDF、N-Gram和Word2Vec

    1.1 文档信息的离散表示

    1.1.1 One-Hot独热编码表示法

    One-Hot几乎是最早的用于提取文本特征的方法,将文本直接简化为一系列词的集合,不考虑其语法和词序关系,每个词都是独立的

    特征提取方法: one-hot 和 TF-IDF

    例1

    可以用one-hot编码的方式将句子向量化

    对类别数据做one_hot_encoding编码处理
    在这里插入图片描述
    处理后
    在这里插入图片描述
    例2
    在这里插入图片描述

    1.1.2 词袋模型Bag of Words(BOW)

    在One-Hot 表示法的基础上,对词表中的每一个词在该文本出现的频次进行记录,以表示当前词在该文本的重要程度。

    词袋模型假设我们不考虑文本中词与词之间的上下文关系,仅仅只考虑所有词的权重。而权重与词在文本中出现的频率有关。

    词袋模型的三部曲:分词(tokenizing),统计修订词特征值(counting)与标准化(normalizing)。

    词袋模型中词和文本的关系就相当于文本是一个袋子,词只是直接装在袋子里

    显然,词袋模型是比较简单的模型,对文本中的信息有较多丢失,但已经可以解决很多实际问题,词袋模型的提出最初是为了解决文档分类问题,目前主要应用在NLP、IR、CV等领域

    优点:

    • 解决了分类器不好处理离散数据的问题
    • 在一定程度上也起到了扩充特征的作用

    缺点:

    • 不考虑词与词之间的顺序
    • 它假设词与词相互独立(在大多数情况下,词与词是相互有关联的)
    • 它得到的特征是离散稀疏的(维度的灾难)

    词袋模型的gensim实现

    Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口。

    基本概念
    语料(Corpus):一组原始文本的集合,用于无监督地训练文本主题的隐层结构。语料中不需要人工标注的附加信息。在Gensim中,Corpus通常是一个可迭代的对象(比如列表)。每一次迭代返回一个可用于表达文本对象的稀疏向量。

    向量(Vector):由一组文本特征构成的列表。是一段文本在Gensim中的内部表达。

    稀疏向量(Sparse> Vector):通常,我们可以略去向量中多余的0元素。此时,向量中的每一个元素是一个(key, value)的tuple。

    模型(Model):是一个抽象的术语。定义了两个向量空间的变换(即从文本的一种向量表达变换为另一种向量表达)。(引自:https://www.cnblogs.com/iloveai/p/gensim_tutorial.html)

    建立字典
    Dictionary类用于建立word<->id映射关系,把所有单词取一个set(),并对set中每个单词分配一个ld号的map

    Dictionary类属性

    from gensim. corpora import Dictionary 
    texts=[[' human',' interface',' computer']]
    dct=Dictionary(texts)# fit dictionary dct. num nnz
    

    在这里插入图片描述
    向字典中增加词条

    dct.add_documents([["cat","say","meow"],["dog"]])
    dct.token2id
    

    id 号增加了3、4、5、6
    在这里插入图片描述
    转换为BOW稀疏向量

    稀疏向量(Sparse> Vector):通常,我们可以略去向量中多余的0元素。此时,向量中的每一个元素是一个(key, value)的tuple。

    转换为BOW格式:list of(token_id,token_count

    dct.doc2bow(
    		document:用于转换的词条list
    		allow update=False:是否直接更新所用字典
    		return missing=False:是否返回新出现的(不在字典中的)词
    )
    

    例如

    现在已有的字典词包括

    在这里插入图片描述

    • return_missing=false,则输出的稀疏向量为
      在这里插入图片描述
      表明在文档中id为3,6的词汇各出现了1次,其他词汇则没有出现

    • return_missing=True,返回新出现的(不在字典中的)词
      在这里插入图片描述

    转换为BOW长向量

    按照输入1ist的顺序列出所出现的各词条ID

    doc2idx(
    		document:用于转换的词条list
    		unknown_word_index=-1:为不在字典中的词条准备的代码
    )
    

    字典中没有这个词就返回 -1
    在这里插入图片描述

    1.1.3 生成 文档词条矩阵

    基本思路:

    首先是将原始文档进行分词并清理,拼接为同一个df,汇总并转换为文档-词条矩阵格式,去除低频词

    1.1.3.1 用sklearn库实现

    CountVectorizer类,通过这一类中的功能,可以很容易地实现文本的词频统计与向量化。

    它主要是把新的文本转化为特征矩阵,只不过这些特征是已经确定过的。而这个特征序列是前面的fit_transfome()输入的语料库确定的特征。

    class sklearn.feature_extraction.text.CountVectorizer(
    						input=’content’, 
    						encoding=’utf-8’, 
    						decode_error=’strict’, 
    						strip_accents=None, 
    						lowercase=True, 
    						preprocessor=None, 
    						tokenizer=None, 
    						stop_words=None, 
    						token_pattern=’(?u)\b\w\w+\b’, 
    						ngram_range=(1, 1), 
    						analyzer=’word’, 
    						max_df=1.0, 
    						min_df=1, 
    						max_features=None, 
    						vocabulary=None, 
    						binary=False, 
    						dtype=<class ‘numpy.int64’>)
    

    比较重要的参数:

    ①min_df / max_df

    词频绝对值/比例的阈值,在此范围之外的将被剔除。小数格式说明提供的是百分比,如0.05指的就是5%的阈值。其详细含义如下

    • max_df:浮点数,取值范围[0.0,1.0]或整数,默认值为1.0,当构建词汇表时,词语文档频率高于max_df,则被过滤。当为整数时,词语文档频次高于max_df时,则被过滤。当vocabulary不是None时,该参数不起作用

    • min_df:浮点数,取值范围[0.0,1.0]或整数,默认为1,该参数除了指下限其他都同max_df

    比如

    min_df = 10,指的是至少有10个文档包含这个词条,才会保留
    max_df= 30,指的是如果超过30个文档包含这个词条,将会被提剔除

    ②max_features

    整数或None,默认为None。根据term frequence排序后的vocabulary的前max_features个词作为vocabulary。如果参数vocabulary不是None,则该参数不起作用

    其他参数:https://zhuanlan.zhihu.com/p/59413389


    CountVectorizer.fit_transform(raw_documents)

    对文档进行学习(处理),返回term-document matrix
    等价于先调用fit函数,然后再调用transform函数,但是效率更高

    from sklearn.feature_extraction.text import CountVectorizer
    countvec = CountVectorizer() 
    x=countvec.fit_transform(['郭靖 和 哀牢山 三十六 剑 。', '黄蓉 和 郭靖 郭靖']) # 一次搞定
    type(x)
    x.todense() # 将稀疏矩阵直接转换为标准格式矩阵
    countvec.get_feature_names() # 词汇列表,实际上就是获取每个列对应的词条
    countvec.vocabulary_ # 词条字典
    

    在这里插入图片描述

    countvec = CountVectorizer(min_df = 2)
    在两个以上文档中出现的才保留 或者 如果最小词频小于2将会被剔除
    在这里插入图片描述

    将1000条评论数据向量化

    import pandas as pd
    import numpy as np
    import os
    
    os.chdir(r'C:\Users\Administrator\Desktop')
    df = pd.read_excel('评论.xlsx')
    df.head()
    

    在这里插入图片描述

    # 加载停用词
    stop_words = [] 
    with open(r"C:\\Users\\Administrator\\Desktop\\chineseStopWords.txt", 'r') as f:
       lines = f.readlines()
       for line in lines:
           stop_words.append(line.strip())
    stop_words[:10]
    

    在这里插入图片描述

    # 分词并去除停用词和短词
    import jieba 
    
    def my_cut(text): 
        return [w for w in jieba.cut(text) if w not in stop_words and len(w)>1]
    
    rawchap = [ " ".join(my_cut(w)) for w in df['评论']] 
    rawchap
    

    在这里插入图片描述

    from sklearn.feature_extraction.text import CountVectorizer
    countvec = CountVectorizer(min_df = 5) # 如果最小词频小于5将会被剔除
    
    res = countvec.fit_transform(rawchap)
    res.todense()
    

    在这里插入图片描述

    countvec.get_feature_names()
    

    在这里插入图片描述

    1.1.4 从词袋模型到N-gram(离散表示)

    词袋模型完全无法利用语序信息

    比如:我帮你vs你帮我
    
    P(我帮你) = P() * P() * P()
    

    Bi-gram:进一步保留顺序信息,两个两个词条一起看,可以保留更多的文本有效信息

    P(我帮你) = P() * P(|) * P(|)
    
    {“我帮”:1,“帮你”:2“你帮”:3“帮我“:4}
    
    我帮你>[1100]
    你帮我>[0011]
    

    以此类推

    从Bi-gram到N-gram,考虑更多的前后词

    可以直接扩展至trigram、4-gram直至N-gram

    N-gram模型就是基于马尔科夫假设,下一个词的出现仅依赖前面的一个或n个词

    当N=1时称为unigram,N=2称为bigram,N=3称为trigram,假设下一个词的出现依赖它前面的一个词,即 bigram,假设下一个词的出现依赖它前面的两个词,即 trigram,以此类推。

    • 优点:
      考虑了词的顺序,信息量更充分
      长度达到5之后,效果有明显提升

    • 缺点:
      词表迅速膨胀,数据出现大量的稀疏化问题
      每增加一个词,模型参数增加40万倍

    在这里插入图片描述

    1.2 文档信息的分布式表示(连续表示)

    离散表示方式面临无法衡量词向量之间的关系的问题,比如无法区分近义词(老公、丈夫、当家的…),每一个词都是用不同的向量表示,各种度量(与或非、距离)都不合适,只能靠人工字典进行补充。并且 词表维度随着语料库增长膨胀

    1.2.1 什么是分布式表示

    从大量的文本中反复发现相关联的上下文信息

    引用:NLP模型笔记 — 分布式表示

    离散表示
    在这里插入图片描述
    分布式表示

    在这里插入图片描述

    引用:http://www.pinlue.com/article/2019/07/2022/189350673206.html

    分布式表示的概念(由很多元素组合的表示,这些元素之间可以设置成可分离的,相互独立的)是表示学习最重要的工具之一。分布式表示非常强大,因为他们能够用具有k个值的n个特征去描述k^n个不同的概念。

    将分布式表示用于NLP

    • 不直接考虑词与词在原文中的相对位置、距离、语法结构等,先把每个词看作一个单独的向量
    • 根据一个词在上下文中的临近词的含义,应当可以归纳出词本身的含义
    • 单个词的词向量不足以表示整个文本,能表示的仅仅是这个词本身

    分布式表示

    • 词之间存在相似关系

    • 包含更多信息

    • 事先决定用多少维度的向量来表示这个词条

      • 维度以50维和100维比较常见
      • 向量中每个维度的取值由模型训练来决定,且不再是唯一的
        [0.762,0.107,0.307,-0.199,0.521,…]
        ·
    • 所有的词都在同一个高维空间中构成不同的向量

      • 从而词与词之间的关系就可以角空间中的距离来加以表述(比如经过训练发现伦敦、英国与巴黎、法国相对距离与关系类似)
    • 所有训练方法都是在训练语言模型的同时,顺便得到词向量的

    总之,分布式表示实际上就是指用特征来表示,利用上下文信息,或者更具体一点,与一个词前后相邻的若干个词,来提取出这个词的特征向量。

    只要数据量足够,分布式表示方法挖掘信息的能力更强大

    1.2.2 共现矩阵

    词文档的共现矩阵主要用于发现主题(topic),用于主题模型

    考虑上下文位置信息

    ·I like deep learning.
    ·I like NLP.
    ·I enjoy modeling.
    

    在这里插入图片描述

    • 确定取词长度,取词长度为1的结果

    • 窗囗长度越长,则信息量越丰富,但数据量也越大

    • 共现矩阵的行/列数值自然就表示出各个词汇的相似度,从而可以用作分析向量

    共现矩阵存在的问题

    1. 如果将共现矩阵行(列)直接作为词向量
    2. 向量维数随着词典大小线性增长
    3. 存储整个词典的空间消耗非常大
    4. 一些模型如文本分类模型会面临稀疏性问题
    5. 高度的稀疏性导致模型会欠稳定

    也就是面临稀疏性问题、向量维数随着词典大小线性增长

    解决办法:SVD、PCA降维,但是计算量大

    例如
    在这里插入图片描述

    1.2.3 NNLM模型

    NNLM是从语言模型出发(即计算概率角度),构建神经网络针对目标函数对模型进行最优化,训练的起点是使用神经网络去搭建语言模型实现词的预测任务,并且在优化过程后模型的副产品就是词向量。(引自:https://blog.csdn.net/maqunfi/article/details/84455434)

    使用非对称的前向窗函数,窗长度为n-1滑动窗囗遍历整个语料库求和,计算量正比于语料库大小

    整个网络由输入层、投射层、隐含层、输出层构成

    输入:(N-1)个前向词,one-hot方式表示,只有对应的位置为1

    输入层是(N-1)*M维向量

    计算量仍然比较大
    在这里插入图片描述
    一个文本,由N个词语组成,现在呢:想根据 前N个词语 来预测 第N个词语 是啥?
    在这里插入图片描述

    1.2.4 Word2vec

    首先了解什么是什么是Word2Vec

    这里参考word2vec概述

    这篇文章是这样解释的:

    Word2Vec,顾名思义,就是把一个 word 变成一个 vector。其实,早在 Word2Vec出来之前,就已经有很多人思考这个问题了。而用的最多的方法大概是 TF-IDF 这类基于频率的方法。不过这类方法有什么问题呢?一个很明显的缺陷是,这些方法得到的向量是没有语义的,比如说,对于「苹果」、「香蕉」、「可乐」这三个词来说,「苹果」和「香蕉」表示的向量应该比「可乐」更加相似,这种相似有很多衡量方法(比如「欧式距离」或「余弦相似性」),但用频率的方法是很难体现这种相似性的。而Word2Vec 就是为了解决这种问题诞生的

    因此,对于Word2Vec其实是语言模型中的一种,它是从大量文本预料中以无监督方式学习语义知识的模型,被广泛地应用于自然语言处理中。(深入浅出Word2Vec原理解析

    其基本思想

    Word2Vec 主要就是利用上下文信息,或者更具体一点,与一个词前后相邻的若干个词,来提取出这个词的特征向量。

    改为用上下文的词汇来同时预测中间词,滑动时使用双向上下文窗口

    在这里插入图片描述

    • 输入层:仍然直接使用词袋BOW方式表示

    • 投射层:
      对向量直接求和(平均),以降低向量维度
      实质上是去掉了投射层

    • 隐含层:直接去除

    • 本质上只是一个线性分类器

    • 短语料不适合用word2vec来分析(比如购物评论、微博这种,需要大语料才能有较好的作用)


    在这里插入图片描述
    在这里插入图片描述

    为了利用这种上下文信息,Word2Vec 采用了两种具体的实现方法,分别是 CBOWSkip-grams。这两种方法本质上是一样的,**都是利用句子中相邻的词,训练一个神经网络。**它们各有优劣,因此各自实现的 Word2Vec> 的效果也各有千秋。
    引自:word2vec概述

    在这里插入图片描述

    其网络的基本结构大概是这个样子

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述


    1.2.5.1 降低运算量:分层softmax

    结果向量太大,数十万维度:在几十万个词条中预测哪一个会出现,所以考虑使用Huffman Tree来编码输出层的词典。哈夫曼树,又称最优二叉树,是一类带权路径长度最短的树,将结果输出转化为树形结构,改用分层softmax,在每一个分叉时,将问题转换为二分类预测,每次预测都会有概率结果提供,将概率连乘,就构成了似然函数

    Word2Vec原理之层次Softmax算法

    图片来自:https://blog.csdn.net/qq_36775458/article/details/100672324
    下图是以词w为”足球“为例:
    在这里插入图片描述
    输出层变成一颗树形二叉树,其实,输出层有V-1个节点

    图片来自:机器学习详解系列(二十五):Word2Vec

    在这里插入图片描述

    在这里插入图片描述

    1.2.5.2 降低运算量:负例采样

    一个正样本,V-1个负样本,显然负样本比例太高,考虑对负样本做抽样,基于词出现的频率进行加权采样,一般取词频的0.75次方用于加权,以便够让低频词多一些出场机会


    Word2Vec仍然存在的问题

    • 只是利用了每个局部上下文窗囗信息进行训练,没有利用包含在全局矩阵中的统计信息
      ·GloVe(Global Vectors for Word Representation),用全局信息去编码词向量,但是应用还不多

    • 对多义词无法很好的表示和处理,因为使用了唯一的词向量

    至此

    展开全文
  • 文本处理-分词、向量化、TF-IDF理论和实现

    万次阅读 多人点赞 2018-06-28 18:00:18
    在上文中,我们讲到了文本挖掘的预处理的关键一步:“分词”,而在做了分词后,如果我们是做文本分类聚类,则后面关键的特征预处理步骤有向量化向量化的特例Hash Trick,本文我们就对向量化和特例Hash Trick预处理...
  • 针对影响瓦斯涌出量的因素复杂多样以及各因素之间的非线性问题,采用径向基核函数把支持向量机算法中的低维空间向量集映射到高维空间,进而建立基于实验数据的煤矿瓦斯涌出量预测模型。样本数据分为训练样本、测试...
  • 7.1 软间隔SVM等价于最小L2正则的合页损失 上一篇 说到,ξiξi \xi_i 表示偏离边界的度量,若样本点(xi,yi)(xi,yi)(x_i,y_i) 满足约束时,则 ξi=0ξi=0 \xi_i =0, 当不满足约束时,ξi=1−yi(w⋅xi+b)ξi=1−...
  • 作者简介:鲁伟:一个数据科学践行者的学习日记。数据挖掘与机器学习,R与Python,理论与实践并行。个人公众号:数据科学家养成记 (微信ID:louwill12) ...
  • 为什么要使用向量化

    千次阅读 2019-03-06 12:28:35
    其实大概每个人都知道向量化后进行计算的速度比循环求解计算快,可是快多少,我们还是不太清楚。那么我就想简单的说下理论再上代码(python)吧。 比如我们有矩阵 a = [1, 2] b = [3, 4] 循环相乘就是 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 911
精华内容 364
关键字:

向量化理论