tf–idf算法解释及其python代码
tf–idf算法python代码实现
这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四句话,每句表示一个文档
1 | copus = [ '我正在学习计算机' , '它正在吃饭' , '我的书还在你那儿' , '今天不上班' ] |
由于中文需要分词,jieba分词是python里面比较好用的分词工具,所以选用jieba分词,文末是jieba的链接。首先对文档进行分词:
1 2 3 4 | import jieba copus = [ '我正在学习计算机' , '它正在吃饭' , '我的书还在你那儿' , '今天不上班' ] copus = [[word for word in jieba.cut(doc)] for doc in copus] print (copus) |
输出结果:
1 | [[ '我' , '正在' , '学习' , '计算机' ], [ '它' , '正在' , '吃饭' ], [ '我' , '的' , '书' , '还' , '在' , '你' , '那儿' ], [ '今天' , '不' , '上班' ]] |
文档变成我们想要的格式了,然后开始词频统计,计算tf值,这里用Counter类来把每篇文档都转换成词和词频的字典,其实就已经得到tf值了
1 2 3 4 | tf = [] for doc in copus: tf.append(Counter(doc)) print (tf) |
输出结果:
1 | [Counter({ '我' : 1 , '正在' : 1 , '学习' : 1 , '计算机' : 1 }), Counter({ '它' : 1 , '正在' : 1 , '吃饭' : 1 }), Counter({ '的' : 1 , '书' : 1 , '你' : 1 , '在' : 1 , '那儿' : 1 , '我' : 1 , '还' : 1 }), Counter({ '今天' : 1 , '不' : 1 , '上班' : 1 })] |
计算idf值
1 2 3 4 5 6 7 8 9 | import math from collections import defaultdict idf = defaultdict( int ) for doc in tf: for word in doc: idf[word] + = 1 for word in idf: idf[word] = math.log( len (idf) / (idf[word] + 1 )) print (idf) |
输出结果:
1 | defaultdict(< class 'int' >, { '的' : 2.0149030205422647 , '正在' : 1.6094379124341003 , '学习' : 2.0149030205422647 , '计算机' : 2.0149030205422647 , '今天' : 2.0149030205422647 , '书' : 2.0149030205422647 , '那儿' : 2.0149030205422647 , '它' : 2.0149030205422647 , '不' : 2.0149030205422647 , '在' : 2.0149030205422647 , '吃饭' : 2.0149030205422647 , '我' : 1.6094379124341003 , '你' : 2.0149030205422647 , '还' : 2.0149030205422647 , '上班' : 2.0149030205422647 }) |
剩下的事情就很简单了,只需要把tf和idf相乘就可以了。
下面是一个tfidf的实现代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | from collections import Counter,defaultdict import jieba import math def file2list( file ): ''' 把文件转换成列表,并对数据进行简单的预处理 ''' with open ( file ) as f: corpus = f.readlines() corpus = [[word.replace( '\n' ,'') for word in jieba.cut(line)] for line in corpus if line.strip()] return corpus #c = file2list('E:\hei.txt') def get_tf(corpus): return [Counter(doc) for doc in corpus] #用Counter函数把每篇文档转换成词和词频的字典 def get_idf(tf_dict): idf = defaultdict( int ) for doc in tf_dict: for word in doc: idf[word] + = 1 for word in idf: idf[word] = math.log( len (idf) / (idf[word] + 1 )) #idf的公式 return idf def get_tfidf(doc_id, file ): '''doc_id是语料库中文档的id,file是txt的路径''' corpus = file2list( file ) tf = get_tf(corpus) idf = get_idf(tf) if doc_id > len (tf): print ( "doc_id should smaller than %i" % len (tf)) else : id_tf = tf[doc_id - 1 ] for word in id_tf: id_tf[word] = id_tf[word] * idf[word] #计算tfidf值 print (id_tf) |
千行代码,Bug何处藏。 纵使上线又怎样,朝令改,夕断肠。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2018-10-15 dns-prefetch应用好,网上速度能提高一半!