前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文本挖掘(二)python 基于scikit-learn计算TF-IDF

文本挖掘(二)python 基于scikit-learn计算TF-IDF

作者头像
forxtz
发布2021-03-11 12:07:17
3.9K0
发布2021-03-11 12:07:17
举报
文章被收录于专栏:源懒由码

简介:前文python jieba+wordcloud使用笔记+词云分析应用讲到可以自定义Idf文档,所以来处理处理。算法已经有现成,本文讲解基本原理及其使用。

参考链接:

sklearn-TfidfVectorizer 计算过程详解

百度百科-tf-idf

CountVectorize和TfidVectorizer实例及参数详解

1、TF-IDF算法的基本讲解

TF-IDF(Term Frequency-InversDocument Frequency)是一种常用于信息处理和数据挖掘的加权技术。该技术采用一种统计方法,根据字词的在文本中出现的次数和在整个语料中出现的文档频率来计算一个字词在整个语料中的重要程度。它的优点是能过滤掉一些常见的却无关紧要本的词语,同时保留影响整个文本的重要字词。

  • TF(Term Frequency)表示某个关键词在整篇文章中出现的频率。
  • IDF(InversDocument Frequency)表示计算倒文本频率。文本频率是指某个关键词在整个语料所有文章中出现的次数。倒文档频率又称为逆文档频率,它是文档频率的倒数,主要用于降低所有文档中一些常见却对文档影响不大的词语的作用。

计算方法:通过将局部分量(词频)与全局分量(逆文档频率)相乘来计算tf-idf,并将所得文档标准化为单位长度。文件中的文档中的非标准权重的公式,如图:

分开的步骤

(1)计算词频

  词频 = 某个词在文章中出现的总次数/文章的总词数

(2)计算逆文档频率

逆文档频率(IDF) = log(词料库的文档总数/包含该词的文档数+1)

2、sklearn计算过程详解

下面为sklearn.TfidfTransformer的计算过程,与百度百科的有些许区别,一是tf使用的是词频,并不是频率;二是idf计算有两种方法,第二种比较平滑。

代码语言:javascript
复制
tf-idf(t, d) = tf(t, d) * idf(t)
tf(t,d)表示文本d中词频t出现的词数
idf(t) =idf(t) = log [ n / (df(t) + 1) ]) (if ``smooth_idf=False``)
idf(t) = log [ (1 + n) / (1 + df(t)) ] + 1(if ``smooth_idf=True``)

3、常用参数讲解

代码语言:javascript
复制
class CountVectorizer(_VectorizerMixin, BaseEstimator):
    # stop_words 停用词:string {'english'}, list, default=None
    def __init__(self, *, input='content', encoding='utf-8',
                 decode_error='strict', strip_accents=None,
                 lowercase=True, preprocessor=None, tokenizer=None,
                 stop_words=None, token_pattern=r"(?u)\b\w\w+\b",
                 ngram_range=(1, 1), analyzer='word',
                 max_df=1.0, min_df=1, max_features=None,
                 vocabulary=None, binary=False, dtype=np.int64)
代码语言:javascript
复制
class TfidfTransformer(TransformerMixin, BaseEstimator):
    # norm = [None,'l1','l2'] 默认为'l2',可设为'l1'或None,计算得到tf-idf值后,如果norm='l2',则整行权值将归一化,即整行权值向量为单位向量,如果norm=None,则不会进行归一化。大多数情况下,使用归一化是有必要的。
    # use_idf 默认为True,权值是tf*idf,如果设为False,将不使用idf,就是只使用tf,相当于CountVectorizer了
    # smooth_idf 选择是否平滑计算Idf
    def __init__(self, *, norm='l2', use_idf=True, smooth_idf=True,
                 sublinear_tf=False):

4、例子展示-计算tf-idf,及输出idf

代码语言:javascript
复制
# coding:utf-8  
from sklearn.feature_extraction.text import CountVectorizer  
from sklearn.feature_extraction.text import TfidfTransformer 

#语料,已经分好词的预料
corpus=["我 来到 北京 清华大学",#第一类文本切词后的结果,词之间以空格隔开  
        "他 来到 了 网易 杭研 大厦",#第二类文本的切词结果  
        "小明 硕士 毕业 与 中国 科学院",#第三类文本的切词结果  
        "我 爱 北京 天安门"]#第四类文本的切词结果  
#将文本中的词语转换为词频矩阵  
vectorizer = CountVectorizer(stop_words=None)  
#计算个词语出现的次数  
X = vectorizer.fit_transform(corpus)  
#获取词袋中所有文本关键词  
word = vectorizer.get_feature_names()  
#查看词频结果  
df_word =  pd.DataFrame(X.toarray(),columns=vectorizer.get_feature_names())

# ---------------------------------------------------- 

#类调用  
transformer = TfidfTransformer(smooth_idf=True,norm='l2',use_idf=True)  
print(transformer)
#将计算好的词频矩阵X统计成TF-IDF值  
tfidf = transformer.fit_transform(X)  
#查看计算的tf-idf
df_word_tfidf = pd.DataFrame(tfidf.toarray(),columns=vectorizer.get_feature_names())
#查看计算的idf
df_word_idf = pd.DataFrame(list(zip(vectorizer.get_feature_names(),transformer.idf_)),columns=['单词','idf'])

输出:

因为norm='l2',所以tf-idf值会正则化,即每一行每一个字段的平方相加为1.

最后,这个是我们需要的idf值。

总结,训练idf值需要大量的语料库,如果有数据储备可以自行创建,如果没有,则只好寻找更好的资源。当然jieba库里面本身还自带着一个idf.big.txt文件可以使用。

目前学习了分词,tf-df创建,下一步学习snownlp基本使用,再往下就进行gensim的lda主题模型。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、TF-IDF算法的基本讲解
  • 2、sklearn计算过程详解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档