词集模型、词袋模型、词向量模型

分词与统计

词集模型(set of words): 单词构成的集合,集合里面的元素不重复,有且只有一个。所以该模型仅仅考虑词是否在文本中出现,不考虑词频,只需一维。
不足:一个词在文本在文本中出现1次和多次特征处理是一样的,所有词同等对待。

词袋模型(Bag of Words): 将所有词语装进一个袋子里,把每一个单词都进行统计,同时计算每个单词出现的次数,所以需要两个维度进行统计。
不足:不考虑词法和语序的问题,不考虑文本中词与词之间的上下文关系,即每个词语都是独立的,丢失一部分文本的语义。只考虑词的权重(词频)。

词袋模型的三步走:分词(tokenizing),统计修订词特征值(counting)与标准化(normalizing)


陈年代码

#生成词汇表
def createVocabList(dataSet):
    vocabSet = set([])  # 创建一个空的不重复列表
    for document in dataSet:
        vocabSet = vocabSet | set(document)  # 取并集
    return list(vocabSet)

#为每一个文档创建词集向量/词袋向量
def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0] * len(vocabList)  # 创建一个其中所含元素都为0的向量
    for word in inputSet:             # 遍历每个词条
        if word in vocabList:         # 如果词条存在于词汇表中,则计数加一
            returnVec[vocabList.index(word)] += 1
    return returnVec  # 返回词袋模型
    
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)               #创建一个其中所含元素都为0的向量
    for word in inputSet:                          #遍历每个词条
        if word in vocabList:                      #如果词条存在于词汇表中,则置1
            returnVec[vocabList.index(word)] = 1
        else:
            print("the word: %s is not in my Vocabulary!" % word)
    return returnVec

直接用scikit-learn的CountVectorizer类来完成,这个类可以帮我们完成文本的词频统计与向量化。CountVectorize函数比较重要的几个参数为:

decode_error——处理解码失败的方式,分为‘strict’、‘ignore’、‘replace’三种方式。
strip_accents——在预处理步骤中移除重音的方式。默认为None,可设为ascii或unicode,将使用ascii或unicode编码在预处理步骤去除raw document中的重音符号。
max_features——词袋特征个数的最大值。
stop_words——设置停用词,设为english将使用内置的英语停用词,设为一个list可自定义停用词,设为None不使用停用词,设为None且max_df∈[0.7, 1.0)将自动根据当前的语料库建立停用词表。
max_df——可以设置为范围在[0.0 1.0]的float,也可以设置为没有范围限制的int,默认为1.0。这个参数的作用是作为一个阈值,当构造语料库的关键词集的时候,如果某个词的document frequence大于max_df,这个词不会被当作关键词。如果这个参数是float,则表示词出现的次数与语料库文档数的百分比,如果是int,则表示词出现的次数。如果参数中已经给定了vocabulary,则这个参数无效。
min_df——类似于max_df,参数min_df=n表示词必须要在至少n个文档中出现过,否则就不考虑。
binary——默认为False,当与TF-IDF结合使用时需要设置为True。

【1】  CountVectorizer是通过fit_transform()函数将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在第i个文本下的词频。即各个词语出现的次数,通过get_feature_names()可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。

【2】  使用现有词袋的特征,对其他文本进行特征提取
定义词袋的特征空间叫做词汇表vocabulary:vocabulary=vec.vocabulary_

链接【1】这位博主算比较用心,下面都是参考他的说法


hash trick

  由于特征的维度对应分词词汇表的大小,所以维度可能非常恐怖,此时需要进行降维,最常用的文本降维方法是Hash Trick。这里的Hash意义也类似。
在这里插入图片描述
 在Hash Trick里,我们会定义一个特征Hash后对应的哈希表的大小,这个哈希表的维度会远远小于我们的词汇表的特征维度,因此可以看成是降维。具体的方法是,对应任意一个特征名,我们会用Hash函数找到对应哈希表的位置,然后将该特征名对应的词频统计值累加到该哈希表位置。如果用数学语言表示,假如哈希函数h使第i个特征哈希到位置j,即h(i)=j,则第i个原始特征的词频数值ϕ(i)将累加到哈希后的第j个特征的词频数值ϕ¯上,即:
  ϕ ˉ = ∑ i ∈ n ; h ( i ) = j ϕ ( i ) \bar{\phi} = \sum_{i\in n;h(i)=j}\phi(i) ϕˉ=in;h(i)=jϕ(i)
 其中n是原始特征的维度。
 但是上面的方法有一个问题,有可能两个原始特征的哈希后位置在一起导致词频累加特征值突然变大。意识是它不会像哈希表那样解决哈希冲突,而是默认相同,直接相加。
在这里插入图片描述

  和PCA类似,Hash Trick降维后的特征我们已经不知道它代表的特征名字和意义。此时我们不能像上一节向量化时候可以知道每一列的意义,所以Hash Trick的解释性不强。
 使用Hash Trick降维速度很快,降维后的特征仍然可以帮我们完成后续的分类和聚类工作。当然由于分布式计算框架的存在,其实一般我们不会出现内存不够的情况。因此,实际工作中我使用的都是特征向量化。
  链接【2】里面有sk-learn代码,但想了解hash trick需要看其他文章。

TF-IDF

  有些词在文本中尽管词频高,但是并不重要,这时向量化完后一般会使用TF-IDF进行特征的权重修正,再将特征进行标准化。
 TF-IDF(Term Frequency–Inverse Document Frequency),即“词频-逆文本频率”,是一种用于资讯检索与文本挖掘的常用加权技术。

TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF-IDF实际上是:TF * IDF。

  (1)词频(Term Frequency,TF):指的是某一个给定的词语在该文件中出现的频率。

  (2)逆向文件频率(Inverse Document Frequency,IDF):是一个词语普遍重要性的度量,强调词对文档的区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低,比如“to”;反过来,如果一个词在比较少的文本中出现,那么它的IDF值应该高。比如一些专业的名词如“Machine Learning”。一个极端的情况,如果一个词在所有的文本中都出现,那么它的IDF值应该为0。公式如下:
I D F ( x ) = log ⁡ N N ( x ) IDF(x) = \log \frac{N}{N(x)} IDF(x)=logN(x)N
  其中,N代表语料库中文本的总数,而N(x)代表语料库中包含词x的文本总数。

上面的IDF公式已经可以使用了,但是在一些特殊的情况会有一些小问题,比如某一个生僻词在语料库中没有,这样分母为0, IDF没有意义了。所以常用的IDF需要做一些平滑,使语料库中没有出现的词也可以得到一个合适的IDF值。平滑的方法有很多种,最常见的IDF平滑公式之一为:

I D F ( x ) = log ⁡ N + 1 N ( x ) + 1 + 1 IDF(x) = \log \frac{N+1}{N(x)+1}+1 IDF(x)=logN(x)+1N+1+1

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

T F _ I D F ( x ) = T F ( x ) ∗ I D F ( x ) TF\_IDF(x) = TF(x) * IDF(x) TF_IDF(x)=TF(x)IDF(x)

  TF-IDF是非常常用的文本挖掘预处理基本步骤,但是如果预处理中使用了Hash Trick,则一般就无法使用TF-IDF了,因为Hash Trick后我们已经无法得到哈希后的各特征的IDF的值。使用了IF-IDF并标准化以后,我们就可以使用各个文本的词特征向量作为文本的特征,进行分类或者聚类分析。


词向量模型(Word Embedding): 词向量只能表征单个词,如果要表示文本,需要做一些额外的处理。
 词向量模型是考虑词语位置关系的一种模型。通过大量语料的训练,将每一个词语映射到高维度(几千、几万维以上)的向量当中,通过求余弦的方式,可以判断两个词语之间的关系。
 现在常用word2vec构成词向量模型,它的底层采用基于CBOW和Skip-Gram算法的神经网络模型。

reference:

https://www.cnblogs.com/pinard/p/6688348.html【1】nlp 31篇
https://blog.csdn.net/qq_27586341/article/details/90286751【2】nlp(含文本挖掘,HMM,word2vec)23篇

https://blog.csdn.net/sinat_36521655/article/details/79993369【3】他好像不懂深度学习啊
https://www.pianshen.com/article/43341051451/【5】
【3】、【5】都一样抄袭别人的,剔除

https://www.zhihu.com/question/44832436/answer/266068967【4】
https://www.cnblogs.com/pinard/p/7160330.html 【6】

【4】、【6】等到再读Embedding在看吧,引申太多不好。重点是输入输出及如何实现。


你敢相信我本来在看李宏毅hw_4的RNN代码,结果却无限跑偏。。。
不过东西始终要学。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值