首页 > 技术文章 > TF-IDF学习笔记(二)

171207xiaohutu 2018-07-18 19:53 原文

这篇文章将将TF-IDF的python实现。TF-IDF的原理可以参考:TF-IDF学习笔记(一)

(一)库介绍

    使用的库为Scikit-learn:它是一个用于数据挖掘和数据分析的简单且有效的工具,它是基于Python的机器学习模块,基于BSD开源许可证。

    Scikit-learn的基本功能主要被分为六个部分:分类(Classification)、回归(Regression)、聚类(Clustering)、数据降维(Dimensionality reduction)、模型选择(Model selection)、数据预处理(Preprocessing)。

    Scikit-Learn中的机器学习模型非常丰富,包括SVM,决策树,GBDT,KNN等等,可以根据问题的类型选择合适的模型,具体可以参考官网文档,推荐大家从官网中下载资源、模块、文档进行学习。

    Scikit-Learn的安装需要numpy、scipy、matplotlib等模块。

    官方网址:http://scikit-learn.org/stable/

(二)TF-IDF计算

     Scikit-Learn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。

 1.CountVectorizer

    CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获取词袋中所有文本的关键字,通过toarray()可看到词频矩阵的结果。

   代码如下:

# coding=utf-8
from sklearn.feature_extraction.text import CountVectorizer

#语料
corpus = [
    'This is the first document.',
    'This is the second second document.',
    'And the third one.',
    'Is this the first document?',
]

vectorizer = CountVectorizer()  #类调用
X = vectorizer.fit_transform(corpus)   #计算个词语出现的次数
word = vectorizer.get_feature_names()  #获取词袋中所有文本关键词
print word  #查看词袋中所有文本关键词
print X.toarray()  #查看词频结果

  输出结果为:

 2.TfidfTransformer

     TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。具体用法如下:

# coding:utf-8
from sklearn.feature_extraction.text import CountVectorizer

#语料
corpus = [
    'This is the first document.',
    'This is the second second document.',
    'And the third one.',
    'Is this the first document?',
]
vectorizer = CountVectorizer()  #将文本中的词语转换为词频矩阵
X = vectorizer.fit_transform(corpus)#计算个词语出现的次数
word = vectorizer.get_feature_names()#获取词袋中所有文本关键词

from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer()  #类调用
tfidf = transformer.fit_transform(X)  #将词频矩阵X统计成TF-IDF值
print tfidf.toarray()  #查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重

  运行结果如下:

(三)liuxuejiang158大神的例子:python scikit-learn计算tf-idf词语权重

代码如下:

# coding:utf-8
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

if __name__ == "__main__":
    #语料库是分词后的结果
    corpus=["我 来到 北京 清华大学",
		"他 来到 了 网易 杭研 大厦",
		"小明 硕士 毕业 与 中国 科学院",
		"我 爱 北京 天安门"]
    vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
    transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值
    tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
    word=vectorizer.get_feature_names()#获取词袋模型中的所有词语
    weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
    for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
        print u"-------这里输出第",i,u"类文本的词语tf-idf权重------"
        for j in range(len(word)):
            print word[j],weight[i][j]

  运行结果为:

-------这里输出第 0 类文本的词语tf-idf权重------
中国 0.0
北京 0.52640543361
大厦 0.0
天安门 0.0
小明 0.0
来到 0.52640543361
杭研 0.0
毕业 0.0
清华大学 0.66767854461
硕士 0.0
科学院 0.0
网易 0.0
-------这里输出第 1 类文本的词语tf-idf权重------
中国 0.0
北京 0.0
大厦 0.525472749264
天安门 0.0
小明 0.0
来到 0.414288751166
杭研 0.525472749264
毕业 0.0
清华大学 0.0
硕士 0.0
科学院 0.0
网易 0.525472749264
-------这里输出第 2 类文本的词语tf-idf权重------
中国 0.4472135955
北京 0.0
大厦 0.0
天安门 0.0
小明 0.4472135955
来到 0.0
杭研 0.0
毕业 0.4472135955
清华大学 0.0
硕士 0.4472135955
科学院 0.4472135955
网易 0.0
-------这里输出第 3 类文本的词语tf-idf权重------
中国 0.0
北京 0.61913029649
大厦 0.0
天安门 0.78528827571
小明 0.0
来到 0.0
杭研 0.0
毕业 0.0
清华大学 0.0
硕士 0.0
科学院 0.0
网易 0.0

  

 

 

 

 

  

 

推荐阅读