词袋bow与tf-idf

  机器学习模型需要特征来进行训练的,但对于文本数据来说,如何在文本中提取特征呢?一种最简单的方法是词袋特征化,词袋是基于单词数量统计的最简单的文本特征表示方法。

一、解析和分词

  在讲词袋前,我们需要知道计算机是怎么知道什么是一个单词的。我们一开始拿到的原始数据可能是网页、电子邮件或某种日志,所以首先,我们需要将这些原始数据解析成文本数据,然后再将文本数据分词得到一个字符序列,最后将字符序列数字化成标记序列。

1、解析
  解析是从原始数据中获取文本数据的操作。我们需要确定如何处理标记、头部和尾部,以及日志中我们不感兴趣的部分。如果文档是个网页,那么解析程序还需要处理URL。如果文档是封电子邮件,那么发件人、收件人和标题这些域都需要特殊处理,否则这些头信息在最终计数中就会和普通词一样,也就失去作用了。

2、分词
  经过简单的解析之后,就可以对文档的纯文本部分进行分词了,这会将字符串转换为一个标记序列,每个标记都可以作为一个单词来计数。分词程序需要知道哪些字符表示一个标记已经结束而且另一个标记已经开始了。在纯英文的数据中,空格是一个非常好的分隔符。

二、词袋

  在词袋特征化中,一篇文本文档被转代为一个计数向量。假设样本集Z有两个样本,文本A:“it is a apple and it is a pen”,文本B:“it is a cat and it is a dog”。词袋特征化过程中,会先将样本集的每个单词当作特征,然后对文本中的单词进行计数,从而转换成特征向量。例如文本A会转换成以下词袋向量:

以上是简单词袋的工作机制,因此词袋有以下特点:

1、词袋中没有任何序列,它只记录每个单词在文本中的出现次数;
2、词袋不表示任何单词层次,如"animal"这个概念包括"cat"、"dog"等,但在词袋表示中,这些单词在向量中都是平等的特征。

三、n元词袋

  单词与单词可能组成词组,词组的意思不是简单的单词的意思的组合,因此我们需要使用n-gram来挖掘词组特征,例如文本A可以得到以下二元词:
“it is”、“is a”、“a apple”、“apple and”、“and it”、“a pen”;
相对于一元词袋来说,n-gram能够便多地保留文本中的初始序列结构,有k个单词,就会有 k 2 k^2 k2个二元词组合。例如样本集Z可以得到以下的二元词矩阵:

共64个二元词,对于样本A来说可以得到以下二元词的矩阵:

  由此可以看出n元词袋是一个更大也更稀疏的特征空间,也意味着n元词袋需要更强的计算、存储和建模能力。

四、过滤

  使用词袋获取的特征中会有噪音,过滤可以将文本中的信号和噪音准确地区分开。

1、停用词
  分类提取通常不要求对文本进行深入的理解,在这些任务中,代词、冠词和介词没有什么价值。像"it"、“is”、“a”、"and"这些词是没有意义的,但上面的词袋却将它们当作了特征来处理,这个时候需要过滤掉这些停用词。但在情感分析中,情况就完全不同了,它需要对语义进行细粒度的深刻理解。

2、高频词
  停用词列表只能过滤通用的停用词,对于在数据集中频繁出现的常见单词无法过滤,而这种语料库专用的常见单词,在任务中也是起不到多大作用的。频率统计是一种非常强在的过滤技术,即可以过滤语料库专用的常见单词,也可以过滤通用的停用词。但有一个问题,就是如何划分二者的界限(即高频率的界限),这个问题没有统一的答案,多数情况下,需要人为地确定这个界限,而且随着数据集的变化而不断调整。

3、罕见词
  根据任务的不周,有时还需要过滤掉罕见词。罕见词可能是真正的生僻词,也可能是拼写错误的普通词。高频词是因为在数据集中太过常见而起不了作用,罕见词的原因也是同理,只了现过一两次的单词在任务中也是起不了作用的。罕见词不仅无法作为预测的凭据,还会增加计算上的开销。一般在数据集中,会有60%左右的罕见词,可想而知这个开销会增加多大。
  在单词数量统计的基础上,我们可以轻松地识别并清理罕见词,也可以将罕见词的数量累加到一个特殊的垃圾箱内,作为一个附加特征。例如我们可以创建一个"GARBAGE"特征,将一个样本中所有的罕见词的数量累加在这个特征中,作为一个附加特征。
  如果一个文本文档非常短,那么它很可能不会包含什么有价值的信息,在训练模型时不应该使用它。但是在应用这条原则时一定要小心。这里的"非常短"是相对来说的,对于推文来说,它本来就简短,需要专门的特征化和建模技巧。

4、词干提取
  词干提取是一种将每个单词转换为语言学中的基本词干形式的NLP技术。一个单词,它可以有多种形式,如进行时、过去时、将来时、复数等等,它们不是同一个单词,但却可能有同一个基本原形,为什么是"可能"?因为有一些单词可能跟别的单词的其它形式相同,但却不是同一个意思,例如"new"与"news"不是同一个意思,但词干提取时都会被木提取为"new",所以使用词干提取可能得不偿失,具体情况还是需要根据任务不断验检才行。但如果不使用词干提取,它们会被当作多个特征来处理,这也是一个问题。词干提取确实有一些计算成本,最终的收益能否超过成本要视具体应用而定。

五、搭配

1、什么是搭配
  搭配是单词与单词组合的词组,该词组能表达的意义比组成它的各个单词的总和还要多。搭配是一种表达方式,它由两个或两个以上的单词组成,并对应于某种约成俗成的事物说明。例如,“strong tea"的意义绝对不止"great physical strength"和"tea”,因此可以认为它是个搭配。另一方面,短语"cute puppy"的意义则就是两个单词"cute"和"puppy"之和,因此我们认为它不是个搭配。

2、搭配的特征
  搭配不一定是个连贯的序列。例如,可以认为句子"Emma knocked on the door"包含搭配"knocked door",因此,不是所有的搭配都是n元词。反之,也不是所有n元词都一定是有意义的搭配。

3、提取搭配

  • 1、基于频率的方法
      这是一种简单的方法,查看那些出现频率最高的n元词。这种方法的问题是最常出现的词不一定是最有用的,而且搭配不一定是n元词。

  • 2、假设检验提取搭配
      使用假设检验来检验单词a与单词b关系的显著性,从而达到搭配提取的效果。如果单词a与单词b的关系显著,那么ab是搭配,否则ab不是搭配。
      首先,我们要有两个假设,零假设:单词a与单词b不相关;对立假设:单词工与单词b相关。
      假设单词a与单词b不相关,我们在已经知数据集中求出它们不相关的概率:
    P ( b ∣ ! a ) = 1 − P ( b ) P ( a b ) P(b|!a)=1-\frac{P(b)}{P(ab)} P(b!a)=1P(ab)P(b)
    这也就求出了"单词a与单词b不相关"的似然: L ( D a t a ; 零 假 设 ) = P ( b ∣ ! a ) L(Data;零假设) = P(b|!a) L(Data;)=P(b!a)
      假设单词工与单词b相关,求出它们相关的概率:
    P ( b ∣ a ) = P ( b ) P ( a b ) P(b|a)=\frac{P(b)}{P(ab)} P(ba)=P(ab)P(b)
      那么"单词a与单词b相关"的似然 L ( D a t a ; 对 立 假 设 ) = P ( b ∣ a ) L(Data;对立假设) = P(b|a) L(Data;)=P(ba)
    最后我们要对比零假设和对立假设的似然相差是否显著,使用似然比表达这种差别:
    l o g λ = l o g L ( D a t a ; 零 假 设 ) L ( D a t a ; 对 立 假 设 ) log{\lambda} = log{\frac{L(Data;零假设)}{L(Data;对立假设)}} logλ=logL(Data;)L(Data;)
    如果单词a与单词b相关,那么 L ( D a t a ; 对 立 假 设 ) L(Data;对立假设) L(Data;)值较大 L ( D a t a ; 零 假 设 ) L(Data;零假设) L(Data;)值较小,所以 l o g λ log{\lambda} logλ较小;所以似然比 l o g λ log{\lambda} logλ越小,单词a与单词b相关性越大,ab越有可能是搭配。

  • 3、文本分块和词性标注
    //todo 之后再补。

4、搭配的表达
  因为搭配的意义比组成它的各个单词的总和还要多,所以单词的计数不能恰当地表示出它的意义。
//todo 之后再补。

六、tf-idf

  词袋仅通过简单的词频计数,无法突显出主要角色。高频词和罕见词我们可以去掉,因为它们的意义太小,这也是因为这两种情况是意义大小的两个极限,容易判断,这还是在特征外过滤的。对于其它词的特征也应该含有这个词的意义大小,这样对保留更多宝贵的信息。这就要使用到tf-idf了。

词袋公式: b o w ( w , d ) = 单 词 w 在 文 档 d 中 出 现 的 次 数 ; bow(w,d) = 单词w在文档d中出现的次数; bow(w,d)=wd

tf-idf公式:tf-idf(w,d) = b o w ( w , d ) ∗ 数 据 集 中 的 文 档 总 数 单 词 w 出 现 在 其 中 的 文 档 数 量 = bow(w,d)*\frac{数据集中的文档总数}{单词w出现在其中的文档数量} =bow(w,d)w

其中, 数 据 集 中 的 文 档 总 数 单 词 w 出 现 在 其 中 的 文 档 数 量 \frac{数据集中的文档总数}{单词w出现在其中的文档数量} w,就是逆文档频率

特点
1、很明显tf-idf突出了罕见词,并有效地忽略了高频词;
2、对于某个特征来说,逆文档频率是一个固定值,所有样本的这个特征都是词袋乘以一个常数,所以tf-idf是一种特征缩放的方法。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于TF-IDF模型和LDA模型是两种不同的文本处理模型,它们的表示方式也不同,因此需要将它们组合起来表示文本的特征。 下面是一个示例代码,展示如何使用Python中的gensim库实现TF-IDF模型和LDA模型的组合表示: ``` import gensim from gensim import corpora, models # 构建语料库 documents = [ "This is a sample document.", "Another sample document.", "This is the third sample document.", "And this is the fourth sample document." ] # 将文本转化为词袋表示 texts = [[word for word in document.lower().split()] for document in documents] # 构建词典 dictionary = corpora.Dictionary(texts) # 构建TF-IDF模型 corpus = [dictionary.doc2bow(text) for text in texts] tfidf = models.TfidfModel(corpus) # 构建LDA模型 lda = models.LdaModel(corpus, num_topics=2, id2word=dictionary) # 组合表示 for i in range(len(documents)): document = documents[i] text = texts[i] bow = dictionary.doc2bow(text) tfidf_vec = tfidf[bow] lda_vec = lda[bow] print("Document:", document) print("TF-IDF vector:", tfidf_vec) print("LDA vector:", lda_vec) print("Combined vector:", tfidf_vec + lda_vec) ``` 上述代码中,首先将文本转化为词袋表示,并构建词典。然后使用词典和词袋表示构建TF-IDF模型和LDA模型。最后,将每个文本的词袋表示通过TF-IDF模型和LDA模型转化为向量表示,并将它们组合起来表示为一个文本的特征向量。 需要注意的是,TF-IDF模型和LDA模型的向量表示的维度是不同的,因此在组合表示时需要对它们进行合并。一种常见的方法是将它们拼接成一个长向量。在上述示例代码中,我们简单地将它们相加作为组合表示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值