词向量构造 - Tf-idf模型

前面我们总结过词袋模型,词袋模型将文本中所有不重复的词看作一个集合,然后对文本中的每句话进行编码。在句子中对于出现的词标记为1,未出现的词标记为0。这样我们就完成了对文本向量的编码,然后就可以调用机器学习模型来对其进行拟合。词袋模型解决了文本编码的问题,但词袋模型本身也存在着巨大的缺点。比如:词袋模型中向量只考虑词的出现频率,不考虑该词的具体含义;词袋模型构造的向量不考虑词出现的先后顺序;词袋模型构造的向量为稀疏矩阵,模型的效果非常有限。基于以上问题,Tf-idf模型出现了。

1.Tf-idf(词频-逆文档频率)模型

首先解释Tf-idf模型中的关键词。

Tf(Term frequency):词频,每个词在文章中出现的频率。

T f = 单 个 词 该 文 章 的 总 词 数 Tf = \frac {单个词} {该文章的总词数} Tf=

Idf(Inverse document frequency ):逆文档频率,语料库所有的文档/含有该词的文档数目。

I d f = l o g ( 语 料 库 中 所 有 的 文 档 数 目 含 有 该 词 的 文 档 数 目 ) Idf = log(\frac{语料库中所有的文档数目}{含有该词的文档数目}) Idf=log()

T f − i d f = T f ∗ I d f Tf-idf = Tf * Idf Tfidf=TfIdf

Tf-idf模型相比较于词袋模型的改进点:引入了词的重要性。

举个例子:假如有《中国陕西特色美食羊肉泡馍》这篇文章,这篇文章中可能“陕西”和“羊肉泡馍”出现的频率都很高,但是这两个词的Idf值是不同的。因为“羊肉泡馍”只出现在特定的文章中,而陕西可以出现在很多文章中,这样“羊肉泡馍”的Idf值就会很大。所以“羊肉泡馍”更能代表该文章的主题,这是Tf-idf的升级之处。

2.Tf-idf词向量实现

自己创建一段文本,然后调用sklearn库中的Tf-idf算法。

#导入工具包
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

#创建文本内容
text = ['The dog runs to a cat', 'the cat finds a fish in the basin', 'the bird is flying freely in the sky ']

#初始化Tf-idf模型并训练文本
tf_idf = TfidfVectorizer(analyzer = 'word',stop_words = 'english')
tf_matrix = tf_idf.fit_transform(text)

#查看Tf-idf模型中的关键词
tf_idf.get_feature_names()
#['basin', 'bird', 'cat', 'dog', 'finds', 'fish', 'flying', 'freely', 'runs', 'sky']

#展示Tf-idf训练后的文本格式
pd.DataFrame(data = tf_matrix.toarray(),columns = vocab)

得到的结果如图所示,每一个词都用一个数值表示,数值的大小表示其在文章中的重要程度。
在这里插入图片描述

3.Tf-idf文档说明

class sklearn.feature_extraction.text.TfidfVectorizer(*, 
input='content', encoding='utf-8', decode_error='strict', 
strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, 
analyzer='word', stop_words=None, token_pattern='(?u)\b\w\w+\b', 
ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None, 
vocabulary=None, binary=False, dtype=<class 'numpy.float64'>, 
norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)

关键参数说明

  • encoding:编码方式,默认utf-8
  • lowercase:是否将文本转化为小写,默认为True
  • analyser:编码的对象,默认为word,也可以选择字符char
  • stop_words:停用词,默认为None,英文文本可以指定为’englishi’,也可以自己制定停用此表
  • ngram_range:词组的范围,默认为(1,1),即一个词为一个单位。也可以自己指定如(1,2),(2,2)等
  • max_df:可以设置为范围在[0.0 1.0]的float,也可以设置为没有范围限制的int,默认为1.0。这个参数的作用是作为一个阈值,当构造语料库的关键词集的时候,如果某个词的document frequence大于max_df,这个词不会被当作关键词。如果这个参数是float,则表示词出现的次数与语料库文档数的百分比,如果是int,则表示词出现的次数。如果参数中已经给定了vocabulary,则这个参数无效
  • min_df:类似于max_df,不同之处在于如果某个词的document frequence小于min_df,则这个词不会被当作关键词
  • max_features:默认为None,可设为int,对所有关键词的term frequency进行降序排序,只取前max_features个作为关键词集

4.小结

  • Tf-idf模型,引入了词的重要程度指标,使得构造的文本向量更加准确
  • Tf-idf模型,仍然没有考虑词语的具体含义
  • 下一小结,了解词嵌入模型(word2vec),将上下文语境引入词语的向量构造中
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值