TF-IDF算法总结及python3实现

练习下写博客,编程新手,多多指教0.0

一.算法介绍

      TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆向文件频率(Inverse Document Frequency)。
     TFIDF实际上是:TF * IDF,TF指词频,IDF指逆向文件频率,IDF可以理解为:当包含词w的文档越少,IDF越大,即w只在文档d中频繁出现,说明w能很好的代表文档d的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档,这也是IDF的问题所在,当文档d过长,w出现的次数可能就多(与这个词的重要性可能无关),因此要乘以归一化的词频。
TF = 在某一类中词条w出现的次数 / 该类中所有的词条数目
IDF = log(语料库的文档总数 / (包含词w的文档数 + 1))           +1是为了防止分母为0
TF-IDF = TF * IDF

二.python3实现

# 计算路径下所有文本中词的tfidf值,文本都已分词并去停以空格分隔。
# @author 故事的小黄花
# 2018-2-6
# 
import os
import math

def get_tf(text):
	"""
	计算tf值
	text:该词所在文档
	return:dict word_tf(该文本出现的词的tf值)
	"""
	num_words = len(text)
	word_freq = {} #词频dict
	word_tf = {} #词的tf值dict
	for i in range(num_words):
		word_count = 1
		for j in range(num_words):
			if i!=j and text[i]!=" ":
				if text[i] == text[j]:
					word_count += 1
					text[j] = " "	
		if text[i] != " ":
			#word_freq[text[i]] = word_count
			word_tf[text[i]] = float(word_count / num_words)

	return word_tf

def get_idf(word,corpus_list):
	"""
	计算idf值
	word:要计算的词
	corpus_list:包含所有语料的list,一个文件为其中一个元素
	return:该词的idf值
	"""
	num_corpus = len(corpus_list)
	count = 0
	for cur_corpus in corpus_list:
		if word in set(cur_corpus):

			count += 1
	idf = math.log(float(num_corpus / (count + 1)))

	return idf

def get_tfidf(cur_corpus,corpus_list):
	"""
	分文本计算tfidf值
	cur_corpus:当前文本
	corpus_list:所有文本的list
	"""
	cur_word_tfidf = {}
	word_tf = get_tf(cur_corpus)
	for word in word_tf:
		tf = word_tf[word]
		idf = get_idf(word,corpus_list)
		cur_word_tfidf[word] = tf*idf
	print(cur_word_tfidf)

	return cur_word_tfidf

def get_corpus(path):
	"""
	获得路径下的所有文本的list,每个文本按空格分为list,形式为[[],[],[],·····]
	path:语料路径
	return:corpus_list语料  files_list语料文件名称
	"""
	corpus_list = []
	files_list = get_files(path)
	for cur_filename in files_list:
		f = open(str(path + "/" + cur_filename))
		cur_file = f.read().replace("\n"," ")
		cur_file = cur_file.split(" ")
		corpus_list.append(cur_file)
		f.close()

	return corpus_list,files_list

def get_files(path):
	"""
	获取文件目录,返回文件名list
	"""
	files_list = os.listdir(path)
	return files_list

def get_tfidf_file(path):
	"""
	分文本计算tfidf,并将结果分别写到相应文件中
	path:语料路径
	"""
	corpus_list,files_list = get_corpus(path)
	num_corpus = len(corpus_list)
	for i in range(num_corpus):
		word_tfidf = get_tfidf(corpus_list[i],corpus_list)
		cur_filename = files_list[i]
		cur_file = open(path+"/"+cur_filename+"_tfidf.txt","w")
		for cur_word in word_tfidf:
			cur_file.write(cur_word + ":" + str(word_tfidf[cur_word])+"\n")
		cur_file.close()
	return True
	
get_tfidf_file("corpus")


...........
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值