当前位置:   article > 正文

《深度学习进阶:自然语言处理》第2章 自然语言和单词的分布式表示_自然语言处理中,把文本分割成一个个的独立单词,称为分词将这些单词构成一个字典,

自然语言处理中,把文本分割成一个个的独立单词,称为分词将这些单词构成一个字典,

《深度学习进阶:自然语言处理》啃书系列

  第2章 自然语言和单词的分布式表示
  第3章 word2vec
  第4章 word2vec的高速化
  第5章 RNN
  第6章 Gated RNN
  第7章 基于RNN生成文本
  第8章 Attention

第2章 自然语言和单词的分布式表示

2.1 什么是自然语言处理

应用场景:

  • 搜索引擎
  • 机器翻译
  • 问答系统
  • 自动文本摘要
  • 情感分析

理解途径——单词含义

  • 基于同义词词典的方法
  • 基于计数的方法
  • 基于推理的方法(word2vec)(第3章)

2.2 同义词词典

同义词词典(thesaurus),具有相同含义的单词(同义词)或含义类似的单词(近义词)被归类到同一个组中。比如,car 的同义词有automobile、motorcar 等。

另外,同义词词典有时会定义单词之间的粒度更细的关系,比如“上位 - 下位”关系、“整体 - 部分”关系。

object
motor vehicle
car
go-kart
truck
SUV
compact
hatch-back

通过对所有单词创建近义词集合,并用图表示各个单词的关系,可以定义单词之间的联系。利用这个“单词网络”,可以教会计算机单词之间的相关性.

2.2.1 WordNet

最著名的同义词词典是WordNet,普林斯顿大学于1985年开始开发,中收录了超过 20 万个单词。

2.2.2 同义词词典的问题

  • 难以顺应时代变化
    新词、词义变化
  • 人力成本高
  • 无法表示单词的微妙差异
    即使是含义相近的单词,也有细微的差别

2.3 基于计数的方法

语料库(corpus):大量的文本数据,由人写出来的文章,包含了大量的关于自然语言的实践知识,即文章的写作方法、单词的选择方法和单词含义等。
基于计数的方法的目标就是从这些富有实践知识的语料库中,自动且高效地提取本质。

2.3.1 基于Python的语料库的预处理

有名的语料库,有Wikipedia和Google News等。另外,莎士比亚、夏目漱石等伟大作家的作品集也会被用作语料库。
语料库的预处理是指,将文本分割为单词(分词),并将分割后的单词列表转化为单词 ID 列表。

def preprocess(text):
    text = text.lower()
    text = text.replace('.', ' .')
    words = text.split(' ')
    word_to_id = {}
    id_to_word = {}
    for word in words:
        if word not in word_to_id:
            new_id = len(word_to_id)
            word_to_id[word] = new_id
            id_to_word[new_id] = word
    corpus = np.array([word_to_id[w] for w in words])
    return corpus, word_to_id, id_to_word
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

上面的代码含义很清晰,给每个词编号,使用两个字典记录词与编号的关系。

2.3.2 单词的分布式表示

单词的分布式表示将单词表示为固定长度的向量。这种向量的特征在于它是用密集向量表示的。密集向量的意思是,向量的各个元素(大多数)是由非0实数表示的。

2.3.3 分布式假设

分布式假设(distributional hypothesis):某个单词的含义由它在的上下文(语境)形成。
上下文的大小(即周围的单词有多少个)称为窗口大小(window size)

2.3.4 共现矩阵

基于计数的方法:对某个单词的周围出现了多少次别的单词进行计数,来表示这个单词。
例如对于下面的语料库:

You say goodbye and I say hello.
  • 1

窗口大小设置为1,能对其中出现的每个单词形成下面的表示:

yousaygoodbeyandihello.
you0100000
say1010110
goodbey0101000
and0010100
i0101000
hello0100001
.0000010

向量[0,1,0,0,0,0,0]表示单词you。
上面的表格就被称为共现矩阵(co-occurence matrix)

2.3.5 向量间的相似度

余弦相似度(cosine similarity)

2.3.6 相似单词的排序

  • 取出查询词的单词向量。
  • 分别求得查询词的单词向量和其他所有单词向量的余弦相似度。
  • 基于余弦相似度的结果,按降序显示它们的值。

2.4 基于计数的方法的改进

两个单词同时出现的“原始”的次数并不具备好的性质。高频词语和很多单词都会共现,但是有些高频词语本身没有过多的含义,比如the。
使用点互信息(Pointwise Mutual Information,PMI)对原始次数进行处理。
P M I ( x , y ) = l o g 2 P ( x , y ) P ( x ) P ( y ) PMI(x,y) =log_2 \frac{P(x,y)}{P(x)P(y)} PMI(x,y)=log2P(x)P(y)P(x,y)
使用PMI值替换原始的次数。
P ( x ) P(x) P(x)就是单词x在语料库中出现的概率, P ( x , y ) P(x,y) P(x,y)表示x和y一起出现的概率;分母就是语料库中不同单词的个数。
但是PMI有个问题,当两个单词的共现次数为0时, l o g 2 0 = − ∞ log_2 0 = -∞ log20=。实践中会使用正的点互信息(Positive PMI,PPMI)
P P M I ( x , y ) = m a x ( 0 , P M I ( x , y ) ) PPMI(x,y) = max(0, PMI(x,y)) PPMI(x,y)=max(0,PMI(x,y))
2.3.4中的共现矩阵经过PPMI处理后如下:

yousaygoodbeyandihello.
you0.1.8070.0.0.0.0.
say1.8070.0.8070.0.8070.8070.
goodbey0.0.8070.1.8070.0.0.
and0.0.1.8070.1.8070.0.
i0.0.8070.1.8070.0.0.
hello0.0.8070.0.0.0.2.807
.0.0.0.0.0.2.8070.

PPMI 矩阵还是存在一个很大的问题,那就是随着语料库的词汇量增加,各个单词向量的维数也会增加。其中很多元素都是0,太稀疏。这样的向量也容易受到噪声影响,稳健性差。

2.4.2 降维

降维(dimensionality reduction):在尽量保留“重要信息”的基础上减少向量维度。从稀疏向量中找出重要的轴,用更少的维度对其进行重新表示。结果,稀疏矩阵就会被转化为大多数元素均不为0的密集矩阵。这个密集矩阵就是我们想要的单词的分布式表示。
奇 异 值 分 解(Singular Value Decomposition,SVD)是一种降维方法。
SVD 将任意的矩阵 X 分解为 U、S、V 这 3 个矩阵的乘积,其中 U 和 V 是列向量彼此正交的正交矩阵,S 是除了对角线元素以外其余元素均为 0 的对角矩阵。
X = U S V T X = USV^T X=USVT
在这里插入图片描述
X: m*n
U: m*m
S: m*n
V: n*n

S对角线上的元素类似矩阵的特征值,不过是非方阵的适配,称为奇异值,在矩阵S中从大到小排列,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上。可以用前 r 大的奇异值来近似描述矩阵。
所谓的特征值,可以理解成假定待处理的矩阵有若干正交的轴(也就是U矩阵中的向量),特征值就是每个轴上的权重。特征值分解得到的前 r 个特征向量,就可以近似得到这个矩阵。
在这里插入图片描述

U`: m*r
S`: r*r
V ‘ T V`^T VT: r*n

这样就可以使用U`每行来表示对应的新的向量。向量的维度由n维降低到 r 维。

2.4.3 基于SVD的降维

NumPy的linalg模块中的svd方法

# SVD
# W是PPMI矩阵
U, S, V = np.linalg.svd(W)
  • 1
  • 2
  • 3

2.4.4 PTB数据集

Penn Treebank 语料库(简称为 PTB),在 word2vec 的 发 明 者 托 马 斯· 米 科 洛 夫(Tomas Mikolov)的网页上有提供。

2.4.5 基于PTB数据集的评价

sklearn 的randomized_svd()方法。该方法通过使用了随机数的 Truncated SVD,仅对奇异值较大的部分进行计算,计算速度比常规的 SVD 快。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/739727
推荐阅读
相关标签
  

闽ICP备14008679号