NLP - 词的表示:Bow,One-hot, TF-IDF,Word2VNLP

文章目录

    • 词的表示
      • 潜在语义分析方法(BOW)
        • Countervector 计数
      • TF-IDF
      • BOW 和 TF-IDF 方法的问题
    • 词的独热(One-hot )表示
    • 独热问题的改进
      • 解决维度过大的问题
      • 解决无语义的问题 -- 词的分布式表示
    • Word Embedding 词嵌入
      • 使用场景
      • Word embedding的训练方法
        • 1、无监督或弱监督的预训练
        • 2、端对端(end to end)的有监督训练。
    • 参考资料


参考转载自:
https://www.jianshu.com/p/cede3ae146bb


词的表示

潜在语义分析方法(BOW)

潜在语义分析方法使用BOW(Bog of Words)的概念:每个词都被以编码的向量所表示,每个词都是一种稀疏的表示;
其中向量的维度就是词汇表的大小。
如果某个词出现了,那么我们就会对它进行计数。


Countervector 计数

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
data_corpus = ['guru99 is the best size for online tutorials. I love to visit guru99 .']
vocabulary = vectorizer.fit(data_corpus)
X          = vectorizer.transform(data_corpus)
print(X.toarray())
[[1 1 2 1 1 1 1 1 1 1 1]]
print(vocabulary.get_feature_names())
['best', 'for', 'guru99', 'is', 'love', 'online', 'size', 'the', 'to', 'tutorials', 'visit']

在潜在语义分析中,每一行(特征列)表示的是某个词,每个列表示的是词出现在在某个文本中的次数。
后来很多学者发现 Countervector 方法会忽律词在不同文本词库中的出现情况, 按理说如果某些词在不同的文本中都经常出现,那么应该降低此类词汇的重要性会更好。所以就出现了TFIDF方法。


TF-IDF

对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,所以如果特征空间坐标系取 tf 词频 作为测度,就可以体现同类文本的特点。

另外考虑到单词区别不同类别的能力,tf-idf法认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。因此引入了逆文本频度idf的概念。

TFIDF中,字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降.


TF-IDF 的不足:
以tf和idf的乘积作为特征空间坐标系的取值测度,并用它完成对权值tf的调整,调整权值的目的在于突出重要单词,抑制次要单词
但是在本质上idf是一种试图抑制噪声的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用,显然这并不是完全正确的。
idf 的简单结构并不能有效地反映单词的重要程度 和 特征词的分布情况,使其无法很好地完成对权值调整的功能,所以tf-idf法的精度并不是很高。


BOW 和 TF-IDF 方法的问题

不管是Countervector还是 TF-IDF,我们发现它们都是从全局词汇的分布来对文本进行表示,所以缺点也明显:
它忽略了单个文本句子中词的顺序,例如 ‘this is bad’ 在BOW中的表示和 'bad is this’是一样的;
它忽略了词的上下文,假设我们写一个句子,“He loved books. Education is best found in books”.

我们会在处理这两句话的时候是不会考虑前一个句子或者后一个句子是什么意思,但是他们之间是存在某些关系的


词的独热(One-hot )表示

到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个向量就代表了当前的词。

“可爱”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …]
“面包”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]

每个词都是茫茫 0 海中的一个 1。
这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。
比如刚才的例子中,可爱记为 3,面包记为 8(假设从 0 开始记)。

缺点分析:
1、向量的维度 会随着句子的词的数量类型 增大而增大;
2、任意两个词之间都是孤立的,无法表示语义层面上词汇之间的相关信息,而这一点是致命的。


独热问题的改进

解决维度过大的问题

独热编码存在维度过大的缺点。对此进行如下改进:

1、将vector每一个元素由整形改为浮点型,变为整个实数范围的表示;
2、将原来稀疏的巨大维度压缩嵌入到一个 更小维度的空间。如图所示:

NLP - 词的表示:Bow,One-hot, TF-IDF,Word2VNLP_第1张图片

“词嵌入”也由此得名。

本质:词向量是训练神经网络时候的隐藏层参数或者说矩阵。

NLP - 词的表示:Bow,One-hot, TF-IDF,Word2VNLP_第2张图片

解决无语义的问题 – 词的分布式表示

传统的独热表示仅仅将词符号化,不包含任何语义信息。如何将语义融入到词表示中?

Harris 在 1954 年提出的 分布假说 为这一设想提供了理论基础:上下文相似的词,其语义也相似。

Firth 在 1957年对分布假说进行了进一步阐述和明确:词的语义由其上下文决定。

以(CBOW)为例,如果有一个句子“the cat sits one the mat”,在训练的时候,将“the cat sits one the”作为输入,预测出最后一个词是“mat”。

NLP - 词的表示:Bow,One-hot, TF-IDF,Word2VNLP_第3张图片

分布式表示的最大优点在于它具有非常强大的表征能力,比如n维向量每维k个值,可以表征k的n次方个概念。

下图的神经网络语言模型(NNLM)采用的就是文本分布式表示。

而词向量(word embedding)是训练该语言模型的一个附加产物,即图中的Matrix C。

NLP - 词的表示:Bow,One-hot, TF-IDF,Word2VNLP_第4张图片

所以我们可以将我们的任务拆解成两部分:
一、选择一种方式描述上下文;
二、选择一种“模型”刻画某个词(即“目标词”)与其上下文之间的关系。


Word Embedding 词嵌入

基于神经网络的分布表示一般称为 词向量、词嵌入( word embedding)或分布式表示( distributed representation)。
核心依然是上下文的表示 以及 上下文与目标词之间的关系 的建模。

词嵌入(Word Embedding) 通过很多机器学习模型 将 原先不同的词转化为 不同的实数向量
目前的Word Embedding 的技术非常多,例如Google 的 Word2Vec, Stanford 的 Glove, Facebook的 Fastext 等等。

Word Embedding有的时候也被称作为分布式语义模型向量空间模型 等。
所以从名字和其转换的方式我们可以明白, Word Embedding 技术可以将 相同类型的词 归到一起;
例如苹果,芒果香蕉等在投影之后的向量空间距离就会更近;而书本,房子这些则会与苹果这些词的距离相对较远。


使用场景

目前为止,Word Embedding 可以用到特征生成,文件聚类,文本分类和自然语言处理等任务,例如:

  • 计算相似的词:Word Embedding可以被用来寻找与某个词相近的词。
  • 构建一群相关的词:对不同的词进行聚类,将相关的词聚集到一起;
  • 用于文本分类的特征:在文本分类问题中,因为词没法直接用于机器学习模型的训练,所以我们将词先投影到向量空间,这样之后便可以基于这些向量进行机器学习模型的训练;
  • 用于文件的聚类

上面列举的是文本相关任务,当然目前词嵌入模型已经被扩展到方方面面。典型的,例如:

  • 在微博上面,每个人都用一个词来表示,对每个人构建Embedding,然后计算人之间的相关性,得到关系最为相近的人;
  • 在推荐问题里面,依据每个用户的购买的商品记录,对每个商品进行Embedding,就可以计算商品之间的相关性,并进行推荐;
  • 在此次天池的航海问题中,对相同经纬度上不同的船进行Embedding,就可以得到每个船只的向量,就可以得到经常在某些区域工作的船只;

可以说,词嵌入为寻找物体之间相关性带来了巨大的帮助。
现在基本每个数据竞赛都会见到Embedding技术。本文我们主要关注用的最多的Word2Vec模型。


Word embedding的训练方法

大致可以分为两类:

1、无监督或弱监督的预训练

优点:不需要大量的人工标记样本就可以得到质量还不错的embedding向量
缺点:准确率有待提高
解决办法:得到预训练的embedding向量后,用少量人工标注的样本再去优化整个模型
典型代表:word2vec和auto-encoder
(这里解释一下AutoEncoder,AutoEncoder也可以用于训练词向量,先将one hot映射成一个hidden state,再映射回原来的维度,令输入等于输出,取中间的hidden vector作为词向量,在不损耗原表达能力的前提下压缩向量维度,得到一个压缩的向量表达形式。)


2、端对端(end to end)的有监督训练。

优点:学习到的embedding向量也往往更加准确
缺点:模型在结构上往往更加复杂
应用:通过一个embedding层和若干个卷积层连接而成的深度神经网络以实现对句子的情感分类,可以学习到语义更丰富的词向量表达。

word2vec不关心后续的应用场景,其学习到的是就是根据共现信息得到的单词的表达,用n-gram信息来监督,在不同的子task间都会有一定效果。而end2end训练的embedding其和具体子task的学习目标紧密相关,直接迁移到另一个子task的能力非常弱。

常用的word embedding分为dense和sparse两种形式:
常见的sparse就比如 co-occurence 或者one-hot的形式;对sparse embedding进行一些降维运算比如SVD、PCA就可以得到dense。


参考资料

  • https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py
  • http://mccormickml.com/2017/01/11/word2vec-tutorial-part-2-negative-sampling/

你可能感兴趣的:(NLP,自然语言处理,人工智能,nlp)