一、前言
NLP区别与CV的一个重要特征之一,在于模型的输入需要预先处理,从CV转行NLP的炼丹者一开始定会对模型的输入形式感到疑惑。不像CV中模型的输入就是图像的RGB值,本来就是数值型,且像素值可以认为是连续型变量,不需要再做什么处理,最多就是做一下归一化,或者翻转、裁剪等数据增强处理。而NLP输入的是文字,非数值型变量,要如何将文字更加合理地映射成某种数值型变量,是NLP要解决的一个重要问题。
在NLP中数值型变量一般是以向量的形式展现出来,本文接下来将阐述NLP中出现过的多种词向量表示方式,并阐述词向量好坏的评判标准。
二、表示方式
文本特征的的表示方式有两大类共六种。
1、离散型表示方式(离散)
i. one-hot独热编码
将词(或字)表示成一个向量,该向量的维度是词典(或字典)的长度(该词典是通过语料库生成的),该向量中,该单词索引的位置值为1,其余的位置为0。one-hot是一种极为稀疏的表示形式。
缺点:
- 不同词的向量表示互相正交,无法衡量不同词之间的关系;
- 该编码只能反映某个词是否在句中出现,无法衡量不同词的重要程度;
- 使用One-Hot 对文本进行编码后得到的是高维稀疏矩阵,会浪费计算和存储资源;
ii. 词袋模型(Bag Of Word, BOW)
在词袋模型中不考虑语序和词法的信息,每个单词都是相互独立的,将词语放入一个“袋子”里,统计每个单词出现的频率。
和one-hot独热编码不同,词袋模型是对文本进行编码而不是对字、词进行编码,编码的后向量是表示整篇文档的特征,而不是单一个词。向量中每个元素表示的是某个单词在文档中的出现次数,可想而知,向量的长度等于词典的长度。在sklearn库中可以直接调用CunterVectorizer实现词袋模型。
缺点
- 词袋模型丢失了词的位置信息,位置信息在文本中是一个很重要信息,词的位置不一样语义会有很大的差别;
- 该编码方式虽然统计了词在文本中出现的次数,但是单靠这个指标无法衡量每个词的重要程度,文中大量出现的词汇比如“你”、“我”以及一些介词等对于区分文本类别意义不大。
iii. 词频-逆文档频率(TF-IDF)
这是一种词袋模型的升级版,为的是解决词袋模型无法区分常用词(如:“是”、“的”等)和专有名词(如:“自然语言处理”、“NLP ”等)对文本的重要性的问题。跟词袋模型一样,它也是对文档编码,编码后词向量的长度就是词典的长度。
- 统计的方式主要是计算词的词频(TF)和逆向文件频率(IDF):
- TF (Term Frequency )
- 某个词在当前文本中出现的频率,频率高的词语或者是重要的词
- T F = 某单词在文章中出现的总次数 文章包含的总词数 TF=\frac{某单词在文章中出现的总次数}{文章包含的总词数} TF=文章包含的总词数某单词在文章中出现的总次数
- **IDF (Inverse Document frequency )**逆文本频率。
- 文本频率是指:含有某个词的文本在整个语料库中所占的比例。逆文本频率是文本频率的倒数,所以分子分母看起来颠倒了过来。
- I D F = l o g ( 语料库的文本总数 包含某词的文本数量 + 1 ) IDF = log({\frac{语料库的文本总数}{包含某词的文本数量+1}}) IDF=log(包含某词的文本数量+1语料库的文本总数)
- TF (Term Frequency )
- 最终词频-逆文档频率 T F − I D F = T F ∗ I D f TF-IDF=TF*IDf TF−IDF=TF∗IDf(注意“-“不是减号而是连接符)
- 还需要提一点,在sklearn的TF-IDF实现中,对一篇文本算完tf-idf后还会进行一次欧式距离归一化,所以特征向量中的每次位置都是[0,1)之间的数值,这也省去了后续调用SVM等分类方法时对输入进行归一化的步骤。而TF在sklearn就是单词在文章中出现的总词数,不用再除以文章包含的总词数。
缺点
- 和词袋模型一样,依然不能反映词的位置信息。
- IDF 是一种试图抑制噪声的加权,本身倾向于文本中频率比较小的词,这使得IDF 的精度不高;
- TF-IDF 严重依赖于语料库(尤其在训练同类语料库时,往往会掩盖一些同类型的关键词;如:在进行TF-IDF 训练时,语料库中的娱乐新闻较多,则与娱乐相关的关键词的权重就会偏低 ),因此需要选取质量高的语料库进行训练;
2、分布型表示方式(连续)
前面提到的词向量表示为离散型,另一种是分布型表示,区别两种表示的最重要区别是分布型表示需要建立统计语言模型,那么什么是统计语言模型?统计语言模型就是用来计算一个句子的概率的模型,通常是基于语料库来构建,一个句子的概率可以表示为:
p ( W ) = p ( w 1 T ) = p ( w 1 , w 2 , . . . , w T ) = p ( w 1 ) ⋅ p ( w 2 ∣ w 1 ) ⋅ p ( w 3 ∣ w 1 2 ) … p ( w T ∣ w 1 T − 1 ) p(W)=p(w_1^T)=p(w_1,w_2,...,w_T)=p(w_1) \cdot p(w_2|w_1) \cdot p(w_3|w_1^2) \dots p(w_T|w_1^{T-1}) p(W)=p(w1T)=p(w1,w2,...,wT)=p(w1)⋅p(w2∣w1)⋅p(w3∣w12)…p(wT∣w1T−1)
上面这条公式中,W表示一个句话,它是由单词 w 1 , w 2 , . . . , w T w_1,w_2,...,w_T w1,w2,...,wT按顺序排列而构成的,三个括号里的符号内容是等价的,见到 w 1 T w_1^T w1T不要往幂次想,它就是表示首单词为 w 1 w_1 w1,长度为T,末尾单词为 w T w_T wT的一句话。
统计语言模型描述的是一段词序列的概率,通俗点说,就是计算一个句子属于正常人类所说的话的概率。那么统计语言模型和词向量有何关系,这里需要提及统计语言模型的一个重要观点:词的语意可以通过一系列句子来传达,一个中心词如果能存在与某句子中而不违和,那么其上下文所出现的词就可以用来解析中心所蕴含的意义。句子违不违和应该怎么评判?就是通过统计语言模型,如果一段词序列的概率越大P(W),说明这段话越不违和。现在问题的关键就是,如何用词向量来构造统计语言模型。
i. n-gram
n-gram 是简单地基于统计语言模型的词向量表示,词向量可以认为是共现矩阵中每一行或者每一列,但是共现矩阵是通过统计得到的,所以n-gram是完全基于词频统计的模型,没有需要学习的参数或词向量。
注意区分n-gram和词袋模型,虽然都是在计算词频,但是他们有两个区别:
- 词袋模型就是简单地计算整篇文档中各个单词出现的频率,而n-gram计算两个词在一个窗口下出现的频率,它强调的是词与词间的关系。
- 词袋模型目的是对一篇文章编码,而n-gram是对词编码,颗粒度有巨大差异。
同理由于TF-IDF是词袋模型的改进版,它和n-gram有一样的差异
关于n-gram的详细解释,请点击另一篇文章:
优点
- 相比起词袋模型和TF-IDF,n-gram考虑了句子中词的顺序;
缺点
- 词典的长度很大,导致词的向量长度也很大;
- 共现矩阵会随着词典的增大而增大
- 共现矩阵也是稀疏矩阵(可以使用 SVD、PCA 等算法进行降维,但是计算量很大);
ii. word2vec
两种形式,CBOW利用上下文的词预测中心词,SKIP-GRAM利用中心词预测上下文的词。
关于word2vec的详细解释,请点击另一篇文章:
优点
- 考虑到词语的上下文,学习到了语义和语法的信息;
- 得到的词向量维度小,节省存储和计算资源;
- 通用性强,可以应用到各种NLP 任务中;
缺点
- 词和向量是一对一的关系,无法解决多义词的问题;
- word2vec是一种静态的模型,虽然通用性强,但无法针对特定的任务做动态优化;
iii. GloVe
GloVe 是斯坦福大学Jeffrey、Richard 等提供的一种词向量表示算法,GloVe 的全称是Global Vectors for Word Representation,是一个基于全局词频统计(count-based & overall staticstics)的词表征(word representation)算法。该算法综合了global matrix factorization(全局矩阵分解) 和 local context window(局部上下文窗口) 两种方法的优点。
关于Glove的详细解释,请点击另一篇文章:
iv. ELMO
word2vec 和 glove 算法得到的词向量都是静态词向量(静态词向量会把多义词的语义进行融合,训练结束之后不会根据上下文进行改变),静态词向量无法解决多义词的问题(如:“我今天买了7斤苹果” 和 “我今天买了苹果7” 中的 苹果 就是一个多义词)。而ELMO模型进行训练的词向量可以解决多义词的问题。
该算法的精髓是:用语言模型训练神经网络,在使用word embedding 时,单词已经具备上下文信息,这个时候神经网络可以根据上下文信息对word embedding 进行调整,这样经过调整之后的word embedding 更能表达在这个上下文中的具体含义,这就解决了静态词向量无法表示多义词的问题。
三、词向量的评判标准
词向量的评判标准可以分为内部标准(intrinsic criteria or intrinsic evaluation)和外部标准(external criteria or external evaluation)。
1. 内部标准
所谓的内部标准,就是不考虑下游任务,仅从词向量本身是否能够准确地表征语义来评判词向量的好坏,比如词向量间的距离是不是能够很好地表示语义上的联系,这里举CS224N上在讲解word2vec时很爱说的一个例子:
考虑man、woman、king三个词,我们可以计算woman和man在向量空间上的差 d i f f = w w o m a n − w m a n diff = w_{woman}-w_{man} diff=wwoman−wman,来表示woman和man间的差异性,如果king在向量空间上加上这个差, w k i n g + d i f f w_{king}+diff wking+diff,那么直觉上应该得到queue的向量 w q u e u e w_{queue} wqueue,因为男人对女人、国王对女王。我们希望最终训练出来的词向量能够很好地表示这种词之间的联系,这样的词向量才是好的词向量。
在讲解glove时也有这种类似的分析:各种词从原型变换到比较级再变换到最高级,在向量空间上如果具有相同的变换方向,那么这样的词向量是好的词向量。像上述这种评价方式也叫做类比评估(analogy evaluation),它对词向量好坏的评价仅仅在向量空间倒来倒去,因此算是一种内部标准。
另外一种内部标准的评价方式就要借用人手工的评判了:给定两个词,让多个人去给这两个词的相似性打分,然后同样是计算这两个词的向量距离,看看它跟人类打的分是不是比较吻合。
2.外部标准
外部标准就是通过词向量在下游任务表现的优劣来评价词向量的好坏了,常见的任务有:
- 命名实体识别(named entity recogniton,简称NER),判断一个词是不是某种实体的名字比如人名(PER)、组织名(ORG)、地点名(LOC)、歌名(MISC)等。
- 词义消歧,判断近义词、多义词
- 文本分类
四、参考文献
- https://blog.csdn.net/zwqjoy/article/details/103546648
- CS224N Lecture 1~2 slides