自然语言处理 | (17)文本的离散表示

目录

1.词向量的one-hot表示

2.文本表示:词袋模型

3.文本表示:TF-IDF


1.词向量的one-hot表示

拿英文举例,英语中大约有1300万个词组(token),不过他们是完全独立的吗?显然不是。例如,有一些词组,Feline猫科动物和Cat猫,Hotel宾馆和Motel汽车旅馆,其实有一定的关联或相似性存在。因此,我们希望用词向量编码词组,把词组表示为N维空间中的一个点(而点与点之间有距离的远近等关系,可以体现深层一点的信息,如含义的关联或相似性),每一个词向量的维度都可能会表征一些意义(物理含义),这些意义我们用"声明speech"来定义。例如,语义维度可以用来表明时态(过去,现在与未来),计数(单数与复数)和性别(男女)。

最简单的词向量编码方式是one-hot,这是一种离散表示方法:假设我们的词典总共有n个词,那我们开一个1*n的高维向量,而每个词都会在某个索引index下取到1,其余位置全部都取值为0(稀疏向量).词向量在这种类型的编码中如下图所示:

在one-hot表示方法下,每个词的词向量维度与词典大小相同,如a是词典中的第2个单词,那么在向量的第2个位置取1,其余位置全为0.

这种词向量编码方式简单粗暴,我们将每一个词作为一个完全独立的个体来表达。遗憾的是,这种方式下,我们的词向量没办法给我们任何形式的词组相似性权衡。例如

我们通常使用余弦相似度来衡量两个单词/词组的相似度,其中一个重要的操作就是对两个词向量做内积。我们期望如果两个词如果相似的话,那么他们对应词向量的余弦相似度应该接近于1。但是在one-hot的表示方法下,并不能体现这种关系,hotel和motel具有相似性,但他们的one-hot表示向量的内积却为0.

究其根本你会发现,是你开了一个极高维度的空间,然后每个词语都会占据一个维度,因此没有办法在空间中关联起来。因此我们可以把词向量的维度降低一些,在这样一个子空间中,可能原本没有关联的词就关联起来了

 

2.文本表示:词袋模型

文本可以看作是一句话,或者几句话组成的短文本。文本表示就是将一段短文本表示为向量。

词袋模型是一种非常经典的文本表示。顾名思义,它就是将字符串视为一个 “装满字符(词)的袋子” ,袋子里的 词语是随便摆放的。而两个词袋子的相似程度就以它们重合的词及其相关分布进行判断。

举个例子,对于句子:

我们先对语料库进行分词,去重,排序,将所有出现的词储存为一个词典。假设词典为:

然后依据 “词语是否出现在词典中” 可以将这句话变为这样的向量:

其中向量的每个维度唯一对应着词典中的一个词。比如第一个维度对应词典中的'我们',而该句子中出现了我们这个词,所以该维度取值为1。可见这个向量的大部分位置是0值,这种情况叫作“稀疏”。为了减少存储空间,我们也可以只储存非零值的位置。

在实际应用中,这种方法还是比较常用的。

  • 词袋模型的优点

1. 简单,方便,快捷

2. 在语料充足的情况下,对于简单的自然语言处理任务效果不错。如文本分类。

  • 词袋模型的缺点

1. 其准确率往往比较低。凡是出现在文本中的词一视同仁,不能体现不同词在一句话中重要性的不同。

2. 无法关注词语之间的顺序关系,这是词袋模型最大的缺点。如“武松打老虎”跟“老虎打武松”在词袋模型中被认为是一样的。

  • 词袋模型与one-hot的关系

词袋模型用于文本表示,将文本表示为向量。如果对文本进行分词,如果文本中的每个词用one-hot形式表示,然后把每个词的one-hot向量相加,得到的向量就是该文本基于词袋模型的向量表示。

 

3.文本表示:TF-IDF

文本可以看作是一句话,或者几句话组成的短文本。文本表示就是将一段短文本表示为向量。TF-IDF是对词袋模型的改进。

  • 不仅考虑词语是否出现,还考虑其出现的次数或频率(TF)

还是上例中的句子:"我们这些傻傻的路痴走啊走,好不容易找到了饭店的西门"。

假设词典是:[我们,你们,走,西门,的,吃饭,旅游,找到了,...],则该句的TF表示为:[1,0,2,1,2,0,0,1,…]。比如,'走'这个词在词典的第三个位置,在该句子中出现过,并且出现了2次,所以该句向量的第三个位置的值是2。与之前不同的是,不仅仅考虑其是否出现0/1,还考虑出现了几次。当然该值可以是词在句子中出现的次数,也可以是词在句子中出现的频率(更常用,该词在句子中出现的次数比上句子中所有词出现的次数之和。)。

但是仅仅考虑词在文本中出现的次数或频率(TF)有一个问题:比如“的”这个词占了词频的很大的比重(一般在文本中会多次出现),而它对确定文本信息几乎没什么用。所以我们应该忽略掉这些词,取消掉它们的影响。像这类词,我们称之为停用词。一种方法是维护一个停用词表,对文本(以及语料库,词典)做一个预处理,过滤掉其中的停用词。但这种方式太粗暴。

改进方式:一个词预测主题的能力越强(与主题的关联程度),权重越大,反之,权重越小。在网页中看到“原子能”这个词,或多或少能够了解网页的主题,而看到“应用”一词,则对主题基本上还是一无所知。因此,“原子能”的权重应该比应用大。 容易发现,如果一个关键词只在很少的网页出现,通过它就容易锁定搜索目标,它的权重也就应该比较大。反之,如果一个词在大量的网页中出现,看到它仍然不清楚要找什么内容,因此它的权重应该小。(比如你在搜索“python gensim”,“python”这个关键词会在很多的网页中出现,内容可能是python入门介绍,python官网,python应用,而“gensim”却只会在相对比较少的网页中出现,一般为gensim的官网,gensim的安装教程,gensim的学习笔记等,而后者是我们更倾向于看到的内容)。这就是我们接下来要学习的IDF。

  • 逆文档频率 -- IDF

不仅考虑这个词在当下文本/文档中出现的频率,还考虑出现该词语的文档数占总文档数的比例(DF)。其基本假设是如果一个词语在不同的文档中反复出现,那么它对于识别该文本并不重要。如高频词“我们”、“那么”,“的”之类。

逆文档频率(IDF)的公式:

如关键字“python”在10万个网页中出现,而“gensim”只在1000个网页中出现,那么“gensim”的权重就会比“python”多,这样搜索出来的结果就与你想要的结果越贴近。比如,假定中文网页数是=10亿,停止词'的'在所有的网页中都出现,即D=10亿,那么它的IDF = log(10亿 / 10亿) = log(1) =0,虽然'的'的频率(TF)很高,但其IDF为0,总体TF-IDF值为0。假如专用词“原子能”在两百万个网页中出现,即Dw=200万,则它的权重IDF=log(500) =2.7。又假定通用词“应用”,出现在五亿个网页中,它的权重IDF = log(2)则只有 0.3。

                                                               TF-IDF  = TF*IDF  

TF-IDF的概念被公认为信息检索中最重要的发明。在搜索,文献分类,与其他相关领域有广泛的应用。

 

所以,我们可以使用TF-IDF来进行文本表示:
 

上图的纵轴表示各个文档/文本,横轴表示词典(综合所有文档/文本构成一个巨大的语料库,对语料库进行分词(中文需要分词,英文按照空格切分就好)、去重,排序,得到词典)中的单词。每一行对应一个文档/文本的向量表示,维度与词典的大小相同,对于文本中的某个词,计算它的TF-IDF值,然后填入向量的相应位置(对应该词在词典中的索引)。

单纯使用TF表示时,需要对文本进行预处理如去除停用词;综合使用TF-IDF表示时,可以不用去除停用词(虽然停用词的出现频率TF很大,但IDF很小,TF-IDF也很小),当然也可以去掉。

更详细的关于TF-IDF的信息,可以查看我的另一篇博客:TF-IDF文本关键词抽取原理

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/sdu_hao/article/details/87686565