自然语言处理(NLP)的一些常见任务有:文本分类、指代消歧、自动摘要、机器翻译、主题识别等。传统的处理方法是基于规则的,现在更倾向于使用机器学习或深度学习的方法解决。那么如何在计算机中表达一段文本/一个词的意思呢?第一步必然是将这些语言特征转化为量化的表达方式。本篇文章总结一下NLP中常用的文本特征表示方式,并提供实际案例和代码实现,用于解决文本分类问题。

1. 离散表示(Discrete Representation)

1.1 One-Hot,独热表示法

NLP 中最常用、最传统的词特征表示方式是采用One-Hot 编码,即每一个词特征都被表示成一个很长的向量,其长度等于词表大小,当前词对应位置为1,其他位置为0。

举个简单的例子,如果语料中有以下三段内容:

建立的词表中词汇依次为:I,like,deep,learning,NLP,enjoy, flying .

将第一句中的词汇用 One-Hot 的方法表示:

但是这种表示方式存在显而易见的问题:

\1. 不同词之间总是正交的,无法衡量不同词之间的相似关系。

\2. 只能反映每个词是否出现,但无法突出词之间重要性的区别。

1.2 Bag of Words(BOW),词袋表示法

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

但这种表示方式只能表达词在当前文本中的重要程度。很多停用词由于频次较高,权重很大。为了表示词特征在整个语料中重要程度,可以使用TF-IDF对词特征加权。

>> TF:词频,即每个词在该文本中的频数,表示该词的重要程度。

>> IDF: 倒排文档频率。如果有些词在所有文章中出现的次数(DF,文档频率)都很多,可能是停用词或者常见词,一般重要性不高。IDF是DF的倒数形式,值越大说明该词越重要。

TF*IDF提供了一种词重要程度的较合理的度量。

对上述文本进行TF-IDF权重表示后的结果:

相比较只计算频数的Bag of Words表示,I 和 like 权重被降低了,看起来更合理。但这种方式仍然存在几点问题:

\1. 词之间是独立的,无法提供词序信息和上下文信息。

\2. 数据十分稀疏。

1.3 N-Gram,N元组表示法

上述提到的Bag of Words表示方法每个词都是独立的,忽略了词序问题。增加N-Gram特征可以获取局部的上下文信息。

以 Bigram 为例重新构建词典:I, like, deep, learning, NLP, enjoy, flying, I like, deep learning, like deep,like NLP, I enjoy, enjoy flying

注意到词汇表的长度从7增加到13, 使用One-Hot 每个词被表示为13维的向量:

使用 Bag of Words 结合TF-IDF Weight,每段文本被表示为13维的向量:

当然,这种方法也有它自己的缺陷:

\1. N-Gram 中随着N的增大增加了更多前后文信息,但是词表的维度也会急剧增大。(通常选取2~3)

\2. 语料库的增加会导致词表维度不断增大,同时N-Gram词序列也急剧增大。

\3. 基于词表示:词之间的关系无法度量 。

\4. 数据十分稀疏。

1.4 实例: Bag of Words + SVM 分类实现

下面举个简单的例子来展示词袋模型的应用。

>> 训练语料:一些公开网站的信息流新闻语料,使用其中的语料标题和网站提供的分类标签。

>> 特征表示:使用 jieba 进行分词,并进行 Bag of Words 表示。

>> 模型: 使用机器学习模型SVM 实现文本分类。本次实现使用 sklearn中的SGD分类器,设置loss为hinge损失。

代码实现:

2. 分布表示(Distributed Representation)

Distributed representation 被称为“Word Representation”或“Word Embedding”, 中文也叫“词向量”或“词嵌入”,1986 年由Hinton 在论文《Learning distributed representations of concepts》中提出。

2.1 Co-Occurrence 词向量

上文中提到的几种离散表示方式存在诸多问题,如无法提供充分的上下文的信息、词之间的联系无法度量,即使间接的增加n-gram特征也会导致词表维度急剧增大。一种解决办法是使用上下文来表示单词,这是NLP中很现代的一种想法。2005 年 Rohde等在《An Improved Model of Semantic Similarity Based on Lexical Co-Occurrence》中介绍了使用共现矩阵(Co-Occurrence matrix) 结合SVD降维处理的方法,实现了使用上下文表示单词。

共现是指不同的词同时出现的文档数。继续使用上面的例子,选择窗宽为1,共现矩阵表示为

上述共线矩阵存在维度灾难和数据稀疏的问题。一种想法是高维信息用低维的向量表征,因此需要通过降维的方法来解决,一种常用的方法是奇异值分解(SVD)。

对上例中的共现矩阵进行分解后,各词在二维坐标中的位置:

即使是结合降维技术的Co-Occurrence matrix 方法也存在一些问题:

\1. 时间复杂度高,尤其对百万级的单词或者文档表现就很糟糕了。

\2. 新词或新文本难以做到及时更新。

\3. 相对于 deep learning 模型, 会有不同的学习框架。

2.2 Word2Vec 词向量

2013年Google 开源了一款直接计算低维词向量的工具 ——Word2Vec,不仅能够在百万级的词典亿级数据集上高效训练,而且能够很好的度量词与词之间的相似性。

先回顾一下统计语言模型,2003年Bengio等人用三层的神经网络构建了统计语言模型的框架(Neural Network Language Model,简称NNLM),其基本思想是:

\1. 假定词表中的每个词都对应一个连续的特征向量。

\2. 假定一个连续平滑的概率模型,输入一段词向量序列,可以输出这个序列的联合概率。

\3. 同时学习词向量和概率模型中的参数。

模型的网络结构如下图:

NNLM 的问题是:只能处理定长序列,而且训练速度慢。

2013 年Mikolov对原始NNLM 进行了一些改造:

\1. 移除前向反馈神经网络中的非线性hidden layer,直接将中间层的embedding layer 与 softmax layer 连接。

\2. 输入所有词向量到一个embedding layer 中 。

\3. 将特征词嵌入上下文环境。这是Word2Vec的第一个模型——CBoW。

CBoW的结构图如下:

从数学上看CBoW等价与一个词袋模型的向量乘以一个embedding 矩阵,从而得到一个embedding 向量。实际上CBoW是从周边词到中心词的训练中学习到的词向量,相反如果从中心词到周边词训练得到词向量的方法是word2vec的另一个模型——Skip-Gram。

Skip-Gram 的主要思路:预测一个中心词窗口内(窗口长度为c)的周边单词概率。

目标函数:对于一个中心词其目标为最大化其周边任意单词的log概率。

Skip-Gram 本质是计算输入词的输入向量与目标词的输出向量之间的余弦相似度,再经过softmax 归一化。显然对词典里的所有词计算相似度并归一化是一件极其耗时的事情。因此,Mikolov 引入两种优化算法:Herarchical Softmax 和 Negative Sampling。

2.3 GloVe 词向量

比较以Co-Occurrence为代表的计数方法和word2vec为代表的直接预测方法。

GloVe 思路和Word2Vec很相似,但充分考虑了词的共现情况。而且训练速度更快,在大规模、小规模语料上性能都能表现的很好。其优化目标函数为:

2.4 实例: fastText 分类中训练词向量

类似于 Word2Vec 中 CBoW 模型,fastText 的分类模型更灵活的使用了 Hierarchical Softmax,主要体现在:

\1. Wordvec 最终在输入层得到词向量,输出层对应的 Herarchical Softmax 也会生成一系列的向量,但最终都不会使用。而fastText的输出层对应是分类的label,目的是遍历分类树的所有叶节点,找到概率最大的label。

\2. Word2Vec的输入是上下文窗口内的词,而fastText 对应的整个文本,包括周边词和 N-Gram的内容。

模型: 继续使用上面处理好的test和train数据,训练fastText 的分类模型。

或直接使用命令行执行, 词向量结果将保存在文件model.vec中。

对于数据训练样本不充足时,最好使用别人训练好的词向量,但要注意得使用相同内容领域的词向量, 另外要调整dim 参数,使其与 pretrainedVectors 具有相同维数。

3. 小结(Brief Summary)

文本特征的向量表示是NLP的基础,也是直接影响模型效果的重要因素。离散的表示结合传统的机器学习模型已经有了较好的效果,但存在缺少上下文信息、数据稀疏等问题。分布式的表达方式不仅能够使用到上下文信息进行表征、建立词与词之间的联系,而且在具体任务中也能很好地利用神经网络进行传播。

4. 参考资料(Reference Material)

>> A Neural Probabilistic Language Model(Bengio et al., 2003)

>> word2vec(Mikolov et al. 2013)

>> Improving Word Representations via Global Context and Multiple Word Prototypes(Eric H. Huang et al. 2012)

>> Bag of Tricks for Efficient Text Classification (A. Joulin, E. Grave, P. Bojanowski, T. Mikolov, 2016)

>> A Primer on Neural Network Models for Natural Language Processing(Yoav Goldberg , 2015)

>> 斯坦福大学“深度学习与自然语言处理”课程:CS224d: Deep Learning for Natural Language Processing,word vector部分的slides

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

  1. chatgpt赋能python:Python断句:一种快速且便利的文本处理方法

    Python 断句:一种快速且便利的文本处理方法 Python作为一种通用编程语言,在文本处理方面也有很强的能力.其中,断句是在Python中应用广泛的一种文本处理方法.本篇文章将介绍如何使用Pyth ...

  2. 高等数理统计(part2)--常见的离散型分布

    学习笔记,仅供参考,有错必纠 文章目录 常见的离散型分布 常见的离散型分布 单点分布P(x=a)=1P(x = a) = 1P(x=a)=1 离散均匀分布X∼U(m)X \sim U(m)X∼U(m) ...

  3. NLP:自然语言处理领域常见的文本特征表示/文本特征抽取(本质都是“数字化”)的简介、四大类方法(基于规则/基于统计,离散式【one-hot、BOW、TF-IDF】/分布式)之详细攻略

    NLP:自然语言处理领域常见的文本特征表示/文本特征抽取(本质都是"数字化")的简介.四大类方法(基于规则/基于统计,离散式[one-hot.BOW.TF-IDF]/分布式[CO- ...

  4. Linux下常见的文本处理命令

    众所周知,在Linux下"一切皆文件"的原则,一切配置文件都可以以文本的方式进行编辑.存储.故对文本文件的操作能力,决定着你是否能够在Linux下操纵自如.今天,就写下几个关于Li ...

  5. Pytorch 文本数据分析方法(标签数量分布、句子长度分布、词频统计、关键词词云)、文本特征处理(n-gram特征、文本长度规范)、文本数据增强(回译数据增强法)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 文本数据分析 学习目标: 了解文本数据分析的作用. 掌握常用的 ...

  6. stats | 概率分布与随机数生成(一)——离散型分布

    随机变量的分布模式是统计模型的基础,R的基础包stats提供了许多关于概率分布的函数.本篇主要介绍离散型分布,包括两点分布.二项分布.帕斯卡分布.负二项分布.几何分布.超几何分布和泊松分布. 1 st ...

  7. 概率论复习笔记二——离散型分布和连续型分布

    一.离散型分布 1.1 伯努利分布 在一次试验中,事件AAA出现的概率为ppp,不出现的概率为q=1−pq=1-pq=1−p,若以β\betaβ记事件AAA出现的次数,则β\betaβ取0,10, 1 ...

  8. 概率统计Python计算:自定义离散型分布

    假定有自定义的分布数据(X, P),其中X表示随机变量XXX的取值序列,P表示对应XXX的每个取值的概率序列.scipy.stats包为我们提供了一个rv_discrete类,可以用数据(X, P)创 ...

  9. 实例复习机器学习数学 - 2. 几种典型离散随机变量分布

    随机变量的引入 上一节我们讨论的都是随机事件,某一个随机事件可能包含若干个随机试验样本空间中的随机结果,如果对于每一个可能的实验结果都关联一个特定的值,这样就形成了一个随机变量. 例如抛一个骰子,将抛 ...

最新文章

  1. grdraw显示区域 lisp_lisp函数按功能分类
  2. RLC协议简单理解2-RLC窗口的维护
  3. [数据结构与算法] 单链表的简单demo
  4. 时间旅行java_[ 一起学React系列 -- 7 ] 秘术之时间旅行-2
  5. C#窗体控件-文本框控件TextBox
  6. httpunit测试遭遇org.mozilla.javascript.NativeGlobal.constructError
  7. 怎么把安装包挂在HTML,怎么把安装包拷贝到u盘
  8. 前端实战项目:前端框架Vue3.0项目教程(一)Vue3.0环境的搭建
  9. 苹果系统摩尔庄园是什么服务器,摩尔庄园手游服务器怎么选 数据互通规则详解...
  10. SPH(光滑粒子流体动力学)流体模拟实现五:PCISPH
  11. 伺服舵机四方运动程序以及角度确定
  12. 注册商标流程需要材料
  13. C++ for循环嵌套 实现 打印10行10列星图
  14. SSR(服务端渲染)
  15. 虚拟分区魔术师 v4.6 绿色
  16. 托业考试 与 托福考试
  17. 方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要
  18. 书单|如何成为一个真正的写作高手?
  19. MyBatisPlus代码生成器(CodeGenerator)
  20. 高通Android随身WIFI屏蔽商家远程控制断网

热门文章

  1. nodejs技术摘要
  2. python open函数参数_python中open函数的使用
  3. AppImage 使用技巧
  4. osgi之Eventadmin通信
  5. C++ binary_function与unary_function使用详解
  6. 接口,纯虚函数和虚函数的区别以及适用场合
  7. 脊髓损伤怎么康复好?成都顾连康复治疗专业可靠
  8. uni-app购物车页面开发
  9. 不论你技术多牛逼,30岁后,这3件事越早做越好!
  10. Uint8Array 拷贝操作的坑(buffer)