TF-IDF算法的Python语言实现

哈哈一晃就是一个学期

开始使用python做一些小玩意,比如写了爬虫,写了文本处理的小脚本(文本预处理,词频统计,实体抽取,,tfidf的计算……),但还是有点疑惑,为什么我所应用到python文本处理的程序,都没有使用面向对象呢?这可能是我一个很简单的程序还得写个100多行的原因。不过写python用的比较多的是模块——各种模块,比如BeautifulSoup、requests等,可能是这些开源的模块封装的太好,剩下的就是写过程了?不过,能抓到耗子的就是好猫,能够把结果运行出来的程序就是我要的程序。

最近王老师给买了几本书,感觉只要掌握其中一本书,我就“发”了~……咳咳。

 

努力!

 

———附上我渣渣的tfidf计算程序———

# coding = utf-8
# author:zzh-748
""" 程序功能:遍历名为“赫”的文件夹中所有文件集
			 计算每一篇文档的tfidf值,输出屏幕,并写入文档中
"""

import os
import math

def list_dir(filepath):# 获得当前文件夹下所有文件名
	# dir_names=os.listdir(filepath)
	dir_names=os.walk(filepath)
	return dir_names


def lines_spilt(lines): # 将一篇文献,按照'/'切分,并存入列表tf_list
	t_list=[] # 存储切分词列表
	for line in lines:
		line=line.split('/')
		for i in range(len(line)):
			buf_line=line[i].replace('\n','').replace(' ','').replace('\u3000','')
			if(buf_line!=''):
				t_list.append(str(buf_line))
	return t_list


def Num_in_set(tf_dic):
	global wordNum_in_set # 准备将此篇文献中的词,导入到词出现总数文档中
	for term in tf_dic:
		if term in wordNum_in_set:
			wordNum_in_set[term]+=1
		else:
			wordNum_in_set[term]=1


def dic_fw(a_dic,file,dicname):
	a_dic=sorted(a_dic.items(),key=lambda item:item[1])
	# print(a_dic)
	max_num=a_dic[-1][-1] # 取本文中的最大词频
	fw_path=dicname+'-result\\'+file.split('\\')[-3]+'\\'+file.split('\\')[-2]+'\\'

	if os.path.exists(fw_path)==False:
		os.makedirs(fw_path) 

	if dicname=='tf':
		fw_path=fw_path+file.split('\\')[-1].replace('.txt','-'+dicname+'.txt') # 写入文档位置
		fw=open(fw_path,'w+',encoding='utf-8')
		for term in a_dic:
			fw.write(term[0]+'\t'+str(term[1]/max_num)+'\n')
			# print(term[0]+'\t'+str(term[1]/max_num)) #计算出tf值
	
	if dicname=='tf_idf':
		fw_path=fw_path+file.split('\\')[-1].replace('-tf.txt','-'+dicname+'.txt') # 写入文档位置
		fw=open(fw_path,'w+',encoding='utf-8')
		for term in a_dic:
			fw.write(term[0]+'\t'+str(term[1])+'\n')
			# print(term[0]+'\t'+str(term[1]/max_num)) #计算出tf值
	fw.close()

def tf(lines,file): # 统计一篇文献的词频。lines=[]。获取路径
	global stopword_list # 引入停用词表
	tf_dic={} # 记录tf的初始字典
	t_list=lines_spilt(lines) # 切分后列表
	for term in t_list:
		if term not in stopword_list: # 去掉停用词	
			if term in tf_dic:
				tf_dic[term]+=1
			else:
				tf_dic[term]=1
	
	Num_in_set(tf_dic)
	dic_fw(tf_dic,file,'tf')#写入文档
	
def idf_write():
	global wordNum_in_set
	wordNum_in_set=sorted(wordNum_in_set.items(),key=lambda item:item[1])
	with open('idf.txt','w+',encoding='utf-8') as idf:
		for term in wordNum_in_set:
			idf.write(term[0]+'\t'+str(term[1])+'\n')
	print('词出现次数写入完成---idf.txt')

def get_Doc_path_lists(filepath): # 获取文献地址,返回列表
	filelists=[]
	dir_names=list_dir(filepath)
	for root,dirs,files in dir_names:
		for file in files:
			if '.txt' in file: 
				# print(root+'\\'+file)
				filelists.append(root+'\\'+file) # 加地址	
	return filelists

def tfidf(Doc_Num):
	fw=open("关键词.txt",'a+',encoding='utf-8')

	global wordNum_in_set
	files=get_Doc_path_lists(tf_filepath)#获得tf结果
	for file in files:
		tf_idf_dic={} # 记录结果数字
		with open(file,'r',encoding='utf-8') as f:
			lines=f.readlines()
		try:
			for line in lines:
				word=line.split('\t')[0].replace(' ','').replace('\n','')
				tf=line.split('\t')[1].replace('\n','') # tf值
				buf=float(Doc_Num/(wordNum_in_set[word]+1))
				tf_idf=float(tf)*math.log(buf)
				# print(word)
				tf_idf_dic[word]=tf_idf
			# print(file.replace('.txt','idf.txt')+': tfidf计算完成')
			dic_fw(tf_idf_dic,file,'tf_idf')
			tf_idf_dic=sorted(tf_idf_dic.items(),key=lambda item:item[1])
			fw.write(file.split('\\')[-1].replace('.txt','idf.txt')+' 关键词:'+'\t'+tf_idf_dic[-1][0]+'\t'+tf_idf_dic[-2][0]+'\t'+tf_idf_dic[-3][0]+'\t'+tf_idf_dic[-4][0]+'\t'+tf_idf_dic[-5][0]+'\n')
			print(file.replace('.txt','idf.txt')+' 关键词:'+'\t'+tf_idf_dic[-1][0]+'\t'+tf_idf_dic[-2][0]+'\t'+tf_idf_dic[-3][0]+'\t'+tf_idf_dic[-4][0]+'\t'+tf_idf_dic[-5][0]+'\n')
		except Exception as e:
			pass	
	print('ok')
	fw.close()
def main():
	global stopword_list
	with open('stop.txt','r',encoding='utf-8') as stopf:
		stopword_list = stopf.readlines()
		for i in range(len(stopword_list)):
			stopword_list[i]=stopword_list[i].replace('\n','')
	files=get_Doc_path_lists(filepath)
	Doc_Num=len(files)  #文献总数
	for file in files:
		try:	
			with open(file,'r',encoding='utf-8') as f:
				lines=f.readlines()
			tf(lines,file)
			print(file+': 写入完成')
		except Exception as e:
			print(file+"------------error")
	# idf_write() # 记录idf 
	tfidf(Doc_Num) #计算tf-idf

global filepath # 根地址,可改
filepath=r"D:\python\workspace\tfidf\赫"

global stopword_list # 停用词表
stopword_list=[] 

global wordNum_in_set # 记录出现过某词的文档数
wordNum_in_set={}

global tf_filepath
tf_filepath=r"D:\python\workspace\tfidf\tf-result"

if __name__=='__main__':
	main()


 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: nltk是一个Python自然语言处理库,可以用来实现tf-idf算法tf-idf算法是一种用于文本挖掘和信息检索的常用算法,它可以计算一个词在文本中的重要性。 在nltk中,可以使用TfidfVectorizer类来实现tf-idf算法。首先需要导入nltk和TfidfVectorizer类: ``` import nltk from sklearn.feature_extraction.text import TfidfVectorizer ``` 然后,可以使用TfidfVectorizer类来计算tf-idf值: ``` # 定义文本列表 texts = ["This is a sample text", "Another text sample", "And one more sample text"] # 创建TfidfVectorizer对象 tfidf = TfidfVectorizer() # 计算tf-idftfidf_values = tfidf.fit_transform(texts) # 输出tf-idf值 print(tfidf_values) ``` 输出结果如下: ``` (, 4) .5773502691896257 (, 1) .5773502691896257 (, ) .5773502691896257 (1, 3) .5773502691896257 (1, 2) .5773502691896257 (1, 1) .5773502691896257 (2, 4) .5773502691896257 (2, ) .5773502691896257 (2, 5) .5773502691896257 ``` 其中,每一行表示一个文本的tf-idf值,每一列表示一个词。如果一个词在文本中出现的次数越多,它的tf-idf值就越大。 ### 回答2: TF-IDF算法是一种经典的文本挖掘算法,用于衡量某个词语在文本集中的重要程度。通过计算每个词语的TF(Term Frequency)和IDF(Inverse Document Frequency)值,得出一个词语的重要性权重,从而进行文本分类、关键词提取和相似度计算等任务。 在Python中,nltk是实现TF-IDF算法的常用工具。下面我们来介绍如何使用nltk进行TF-IDF计算: 1. 准备数据集 首先需要准备一个文本数据集,可以是多个文本文件或者一篇长文本。将数据读入Python,并对文本进行分词和处理,得到一个词语列表。 2. 计算TF值 对于每个文本,计算其中每个词语在文本中出现的频率TF。可以使用nltk库中的FreqDist函数,该函数可以计算一个列表中每个元素的出现次数,并按照出现次数从高到低排序。 3. 计算IDF值 对于所有文本,计算每个词语在文本集中出现的文档频率IDF。IDF值反映了一个词语在文本集中的普遍重要程度,如果一个词语在多数文本中都出现,则IDF值较低,反之则较高。 计算IDF值可以使用nltk库中的TextCollection函数,该函数可以把所有文本的词语列表传入,并计算每个词语的IDF值。 4. 计算TF-IDF值 将每个词语在每个文本中的TF值和在文本集中的IDF值相乘,得到TF-IDF值。可以使用Python中的pandas库将TF和IDF值整合到一个数据框中,方便计算。 5. 应用TF-IDF算法 计算得到TF-IDF值后,可以应用到各种文本挖掘任务中。例如: - 文本分类:将每个文本的TF-IDF向量作为输入,使用机器学习算法(如支持向量机)对文本进行分类。 - 关键词提取:选取每个文本中TF-IDF值最高的几个词语作为关键词。 - 相似度计算:将每个文本的TF-IDF向量作为输入,计算各文本之间的余弦相似度,从而判断它们之间的相似程度。 总之,nltk是一款强大的文本挖掘工具,能够轻松实现TF-IDF算法以及其他文本处理任务。我们可以使用其提供的函数和方法快速地进行数据处理和分析,从而得到更多有意义的信息。 ### 回答3: TF-IDF算法是一种被广泛应用的文本挖掘算法,在自然语言处理领域中有着广泛的应用。Python中的自然语言处理工具包NLTK可以实现TF-IDF算法,下面将具体介绍。 首先需要导入NLTK和其依赖包: ``` import nltk import string from nltk.corpus import stopwords from nltk.tokenize import word_tokenize from nltk.stem import PorterStemmer from nltk.stem import WordNetLemmatizer from collections import Counter import math ``` 接下来,可以创建一个处理器类来进行数据的预处理,如下: ``` class Processor: def __init__(self): self.stop_words = set(stopwords.words('english')) self.punctuations = set(string.punctuation) self.stemmer = PorterStemmer() self.lemmatizer = WordNetLemmatizer() def process(self, text): tokens = word_tokenize(text.lower()) filtered_tokens = [self.stemmer.stem(self.lemmatizer.lemmatize(token)) for token in tokens if not token in self.stop_words and not token in self.punctuations] return filtered_tokens ``` 这里使用了一些常用的数据预处理方法,如过滤停用词、过滤标点符号、词根提取和词形还原等。 接下来,可以实现TF-IDF算法的主要部分。具体步骤如下: 1. 进行数据预处理; 2. 统计每个词在每个文档中出现的次数,得到词频矩阵; 3. 对于每个文档,计算每个单词的TF值; 4. 统计每个单词在多少个文档中出现过,得到逆文档频率(IDF); 5. 对于每个文档,计算每个单词的TF-IDF值。 具体代码实现如下: ``` class TFIDF: def __init__(self, docs): self.docs = docs self.D = len(docs) self.processor = Processor() def term_frequency(self, term, doc): return doc.count(term) / len(doc) def inverse_document_frequency(self, term): n = sum(1 for doc in self.docs if term in doc) return math.log(self.D / n) def tf_idf(self, term, doc): tf = self.term_frequency(term, doc) idf = self.inverse_document_frequency(term) return tf * idf def tf_idf_doc(self, doc): tf_idf_dict = {} tokens = self.processor.process(doc) counter = Counter(tokens) for token in np.unique(tokens): tf_idf_dict[token] = self.tf_idf(token, tokens) return tf_idf_dict def tf_idf_corpus(self): tf_idf_corpus = [] for doc in self.docs: tf_idf_dict = self.tf_idf_doc(doc) tf_idf_corpus.append(tf_idf_dict) return tf_idf_corpus ``` 其中,term_frequency用于计算TF值,inverse_document_frequency用于计算IDF值,tf_idf用于计算TF-IDF值,tf_idf_doc用于计算单篇文档的TF-IDF值。最后,可以在实例化TFIDF类后,调用tf_idf_corpus方法,得到整个语料库的TF-IDF矩阵。 这样,就可以使用NLTK实现TF-IDF算法啦!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值