简单理解TFIDF及其算法python实现

简单理解TF-IDF

引出TF-IDF

通俗来讲TF-IDF就是考虑单词的重要性。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF简单介绍

TF-IDF(term frequency–inverse document frequency)是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。TF意思是词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数,IDF意思是逆文本频率指数(Inverse Document Frequency)是一个词语普遍重要性的度量。。

TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF的计算公式分三步走:

其统计公式如下:

其中,tf表示词频(Term Frequency),即词条在文档i中出现的频率;idf为逆向文件频率(Inverse Document Frequency),表示某个关键词在整个语料所有文章中出现的次数的倒数(该指标用于降低常用词的重要性)。

优点:能过滤掉一些常见的却无关紧要的词语,同时保留影响整个文本的重要词语。

缺点:不能有效反应特征词的分布情况,也没有体现词语的位置信息(通常文章首尾句词的重要性较高)。

算法实现

# -*- coding: cp936 -*-
import jieba
import jieba.posseg as pseg
import os
import sys
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
sys.path.append("你的路径")
from numpy import *

fr = open('你的文本名.txt')
fr_list = fr.read()
dataList = fr_list.split('\n')
data = []
for oneline in dataList:
    data.append(" ".join(jieba.cut(oneline))) 

#将得到的词语转换为词频矩阵
freWord = CountVectorizer()

#统计每个词语的tf-idf权值
transformer = TfidfTransformer()
#计算出tf-idf(第一个fit_transform),并将其转换为tf-idf矩阵(第二个fit_transformer)
tfidf = transformer.fit_transform(freWord.fit_transform(data))

#获取词袋模型中的所有词语
word = freWord.get_feature_names()

#得到权重
weight = tfidf.toarray()
tfidfDict = {}
for i in range(len(weight)):
    for j in range(len(word)):
        getWord = word[j]
        getValue = weight[i][j]
        if getValue != 0:
            if tfidfDict.has_key(getWord):
                tfidfDict[getword] += string.atof(getValue)
            else:
                tfidfDict.update({getWord:getValue})
sorted_tfidf = sorted(tfidfDict.iteritems(),
                      key = lambda d:d[1],reverse = True)
fw = open('result.txt','w')
for i in sorted_tfidf:
    fw.write(i[0] + '\t' + str(i[1]) +'\n')

 

你可能感兴趣的:(自然语言处理)