前面我们总结过词袋模型,词袋模型将文本中所有不重复的词看作一个集合,然后对文本中的每句话进行编码。在句子中对于出现的词标记为1,未出现的词标记为0。这样我们就完成了对文本向量的编码,然后就可以调用机器学习模型来对其进行拟合。词袋模型解决了文本编码的问题,但词袋模型本身也存在着巨大的缺点。比如:词袋模型中向量只考虑词的出现频率,不考虑该词的具体含义;词袋模型构造的向量不考虑词出现的先后顺序;词袋模型构造的向量为稀疏矩阵,模型的效果非常有限。基于以上问题,Tf-idf模型出现了。
1.Tf-idf(词频-逆文档频率)模型
首先解释Tf-idf模型中的关键词。
Tf(Term frequency):词频,每个词在文章中出现的频率。
Idf(Inverse document frequency ):逆文档频率,语料库所有的文档/含有该词的文档数目。
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)
得到的结果如图所示,每一个词都用一个数值表示,数值的大小表示其在文章中的重要程度。
[图片上传失败...(image-ae059c-1598494610636)]
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),将上下文语境引入词语的向量构造中