词语是NLP里面最基本的要处理的单元,词语组合成能句子,句子组成段落,段落组成文章,因此,最基本要处理的就是词语了,我们知道,词语都是一个个的符号表示的。我们怎么用数值化的方式表示呢,这样才能方便计算机去计算处理。
在字符编码中也被分配了一定的数字来代表某个字符,比如UTF-8等字符编码方式。每一个数字都可以对应于某个字符,对于一些离散的应用来说,这个编码也就够了,但是这种编码仅仅能对字符做个区分表示而已。
一:词语的表示
原始的方法就是one-hot向量的方法。
假如我们有个词库,一共有V个词汇,罗列了所有的词语,组成一个V维度的向量,给每个词语排一个编号,如果表示某个词语,则该词语对应编号位置设置为1,其余位置都是0,这个比较好理解,简单举个例子。
例如我有一个词汇表:【篮球,足球,羽毛球,乒乓球,排球】
则篮球可以是表示成:[1,0,0,0,0]
则乒乓球可以是表示成:[0,0,0,1,0]
这是一种离散的表示方式,非常稀疏,想象一下如果词汇库很大,100W级别的,那么只有一个位置是1,其他的位置都是0,带来了巨大的计算量和存储量,数据显得很稀疏。
且数据之间没有什么联系,数据之间的距离都是一样的,cos值余弦相似度都是0,都是看做是完全独立的存在,词汇之间毫无相关,这个很明显不符合常理的,因此这样的表示方法不适合NLP的语言模型计算,毕竟语言词语是有相互联系的,不是完全独立的存在。
但它也有用武之处,比如适用于表示类别的离散值应用场景下,还记得我们之前学习过那么多的神经网络模型,对于类别的数据,MNIST数据(不需要进行任何比较的,且独立的,相互等价的离散取值的情况下),都是用的是one-hot向量啊。
二:词袋模型(Bag of words)
就是想象成一个袋子,里面装的就是各个词语,但是里面的词语没有顺序,只有频率统计。
比如有词库【我,爱,篮球,你,喜欢,科研,和】
句子1:我爱篮球和爱科研
句子2:你喜欢篮球
句子1的词袋模型就是:[1,2,1,0,0,1,1]
句子2的词袋模型就是:[0,0,0,1,1,1,0]
这样我们就得到每个句子的词袋统计模型,其实也就是向量,如果我们想计算两个句子的相似度,也就是两个向量的相似度,可以用到欧氏距离相似度,也可以用到余弦相似度(求cos)。
该模型表示文本有如下优点:
1:简单,方便,快速建立
2:对于简单的NLP问题还可以解决的,比如文本分类,文学类的,科技类的,体育类的,金融类的文章的词语使用,和词频统计就会不一样。因此可以简单用于文本分类。
该模型表示文本有如下缺点:
1:句子中的词语顺序信息丢失,因为词语的顺序也是很有含义的,毕竟句子“我爱你”比“你我爱”这个句子更像人话,但是词袋模型下是一样的。
2:句子中的词语的重要性的关键词也丢失了,这只能看到某个词语的出现次数或者频率,但是某关键词(重要性高的词语)不代表出现的频率就很高,如果不理解这个意思,请参考TF-IDF的学习。
三:TF-IDF
这个我之前已经学过了,可以参考之前学习的文档,这个算法是能够得到某个句子或者文档的关键词,能提取得到重要性高的关键词,不仅仅是有词语的频率统计(TF),还有词语的重要程度(IDF)。
如上都是基于传统的统计模型的,简单的NLP处理。
后面将会逐渐学习基于神经网络模型的语言模型。