独热编码(One-Hot Encoding),又被称为有效编码,其方法是使用N为状态寄存器来对多个状态进行编码,每个状态都有独立的寄存器位,并且只有一个有效位。独热编码也可以用来表示词向量,即每个单词使用一个长度为 N 的向量表示, N 表示语料库中单词的数量。假设我们有如表2.1所示的单词的语料库。
表2.1 单词的语料库
上述语料库中组成不重复的词典一共包含4个词语,分别为“橘子”“苹果”“葡萄”“香蕉”。根据独热编码的表示方式,我们可以用4位的向量表示每个词语,单词的独热编码表示如表2.2所示。
表2.2 单词的独热编码表示
词向量的独热编码表示比较简单,但是也有很多问题。当在语料库中加入新词时,整个向量的长度会改变,并且存在维数过高难以计算,以及向量的表示方法很难体现词与词之间的语义关系的问题。
独热编码表示只考虑使用0和1对词语进行表示,而词袋模型(Bag Of Words,BOW)需要考虑词语出现的频数。词袋模型将所有词语装进一个袋子里,不考虑其词法和语序,即每个词语都是独立的,对每个单词进行统计,同时计算每个单词出现的次数。
在如表2.1所示的语料库中,4个词语可以构成这样一个词典:“橘子”“苹果”“葡萄”“香蕉”。它们的编号为0、1、2、3。词典的长度为4,我们可以用一个4维的独热编码表示每个词语。词袋模型则把文本当成一个由词语组成的袋子,记录句子中包含各个词语的频数,则表2.1中语料库的文本对应的词袋模型如表2.3所示。
表2.3 语料库的文本对应的词袋模型
表2.3中的数字表示单词在句子中出现的次数,比如数字“2”表示苹果在句子2中出现了两次。上述例子中只有4个句子,词典的大小是4。当语料库很大时,词典的大小可以是几千甚至几万,这样大维度的向量,计算机很难去计算。此外,词袋模型忽略了词序信息,对语义理解来讲是丢失了重要信息。最后,词袋模型会造成语义鸿沟现象,即两个表达意思很接近的文本的文本向量差距很大。
词频-逆文本频率(Term Frequency-Inverse Document Frequency,TF-IDF)是一种用于信息检索与数据挖掘的常用加权技术,常用于挖掘文章中的关键词。
词频(Term Frequency,TF)指某一给定词语在当前文件中出现的频率。由于同一个词语在长文件中可能比短文件有更高的词频,因此需要根据文件的长度对给定词语进行归一化,即用给定词语的数量除以当前文件的总词数。
逆文件频率(Inverse Document Frequency,IDF)是一个词语普遍重要性的度量,即如果一个词语只在很少的文件中出现,表示它更能代表文件的主旨,它的权重也就越大;如果一个词在大量文件中都出现,表示不清楚它代表什么内容,它的权重就应该小。
TF-IDF的主要思想是,如果某个词语在一篇文章中出现的频率高,并且在其他文章中较少出现,则认为该词语能较好地代表当前文章的含义,即一个词语的重要性与它在文档中出现的次数成正比例,与它在语料库中文档出现的频率成反比例。式(2.1)~式(2.3)给出了TF-IDF的计算过程。
从TF-IDF的计算公式可以看出,如果一个单词在句子中出现的频率越高,说明该单词的权重越高,而如果该单词在正片语料库中出现的频率都很高,则说明该单词是一个普遍性的词语,这表示该单词在句子中的权重就降低了。
1.实验目标
(1)理解独热编码的实现原理。
(2)掌握词袋模型的实现方法。
(3)掌握词频-逆文本频率的实现方法。
2.实验环境
实验环境如表2.4所示。
表2.4 实验环境
3.实验环境
该项目由3个代码组成,分别为onehot.py、bow.py、tfidf.py。接下来分别解释3个代码的具体功能。
(1)onehot.py实现独热编码,具体功能是根据输入数据输出指定数字的独热编码,输入数据共3列,每一列表示不同的特征及取值范围,程序输出结果为数字0、1、3的独热编码。
(2)bow.py实现词袋模型,具体功能是输出语料库中每个句子对应的词袋模型的表示。
(3)tfidf.py实现TF-IDF模型,具体功能是输出语料库中每个句子对应的TF-IDF的表示。
分别创建onehot.py、bow.py、tfidf.py源码文件,实验目录如图2.3所示。
图2.3 实验目录
按照如下步骤分别编写代码。
(1)完成onehot.py代码编写,实现独热编码操作。
步骤一:导入模块
步骤二:调用独热编码,拟合训练数据
步骤三:将结果转化为数组,并打印显示
步骤四:运行代码
使用如下命令运行代码onehot.py。
运行的结果如下所示:
从运行结果可以看出,前两个数字(1.0.)表示数字0的独热编码;中间3个数字(0.1.0.)表示数字1的独热编码;后4个数字(0.0.0.1.)表示数字3的独热编码。
(2)完成bow.py代码编写,实现词袋模型编码操作。
步骤一:导入模块
步骤二:加载语料库
步骤三:文本向量化表示
步骤四:打印结果
步骤五:运行代码
使用如下命令运行代码bow.py。
运行的结果如下所示。
从运行结果可以看出,第一行打印信息表示语料库构建的词汇表,第二行打印信息表示每个句子对应的词袋模型表示。
(3)完成tfidf.py代码编写,实现词袋模型编码操作。
步骤一:导入模块
步骤二:加载语料库
步骤三:文本向量化表示
步骤四:打印结果
步骤五:运行代码
使用如下命令运行代码tfidf.py。
运行的结果如下所示:
从运行结果可以看出,第一行打印信息表示语料库构建的词汇表,第二行打印信息表示每个句子对应的TF-IDF模型表示。