python TF-IDF算法实现文本关键词提取


Posted in Python onMay 29, 2019

TF(Term Frequency)词频,在文章中出现次数最多的词,然而文章中出现次数较多的词并不一定就是关键词,比如常见的对文章本身并没有多大意义的停用词。所以我们需要一个重要性调整系数来衡量一个词是不是常见词。该权重为IDF(Inverse Document Frequency)逆文档频率,它的大小与一个词的常见程度成反比。在我们得到词频(TF)和逆文档频率(IDF)以后,将两个值相乘,即可得到一个词的TF-IDF值,某个词对文章的重要性越高,其TF-IDF值就越大,所以排在最前面的几个词就是文章的关键词。

TF-IDF算法的优点是简单快速,结果比较符合实际情况,但是单纯以“词频”衡量一个词的重要性,不够全面,有时候重要的词可能出现的次数并不多,而且这种算法无法体现词的位置信息,出现位置靠前的词和出现位置靠后的词,都被视为同样重要,是不合理的。

TF-IDF算法步骤:

(1)、计算词频:

词频 = 某个词在文章中出现的次数

考虑到文章有长短之分,考虑到不同文章之间的比较,将词频进行标准化

词频 = 某个词在文章中出现的次数/文章的总词数

词频 = 某个词在文章中出现的次数/该文出现次数最多的词出现的次数

(2)、计算逆文档频率

需要一个语料库(corpus)来模拟语言的使用环境。

逆文档频率 = log(语料库的文档总数/(包含该词的文档数 + 1))

(3)、计算TF-IDF

TF-IDF = 词频(TF)* 逆文档频率(IDF)

详细代码如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
 
'''
计算文档的TF-IDF
'''
import codecs
import os
import math
import shutil
 
#读取文本文件
def readtxt(path):
 with codecs.open(path,"r",encoding="utf-8") as f:
  content = f.read().strip()
 return content
 
#统计词频
def count_word(content):
 word_dic ={}
 words_list = content.split("/")
 del_word = ["\r\n","/s"," ","/n"]
 for word in words_list:
  if word not in del_word:
   if word in word_dic:
    word_dic[word] = word_dic[word]+1
   else:
    word_dic[word] = 1
 return word_dic
 
#遍历文件夹
def funfolder(path):
 filesArray = []
 for root,dirs,files in os.walk(path):
  for file in files:
   each_file = str(root+"//"+file)
   filesArray.append(each_file)
 return filesArray
 
 
#计算TF-IDF
def count_tfidf(word_dic,words_dic,files_Array):
 word_idf={}
 word_tfidf = {}
 num_files = len(files_Array)
 for word in word_dic:
  for words in words_dic:
   if word in words:
    if word in word_idf:
     word_idf[word] = word_idf[word] + 1
    else:
     word_idf[word] = 1
 for key,value in word_dic.items():
  if key !=" ":
   word_tfidf[key] = value * math.log(num_files/(word_idf[key]+1))
 
 #降序排序
 values_list = sorted(word_tfidf.items(),key = lambda item:item[1],reverse=True)
 return values_list
 
#新建文件夹
def buildfolder(path):
 if os.path.exists(path):
  shutil.rmtree(path)
 os.makedirs(path)
 print("成功创建文件夹!")
 
#写入文件
def out_file(path,content_list):
 with codecs.open(path,"a",encoding="utf-8") as f:
  for content in content_list:
   f.write(str(content[0]) + ":" + str(content[1])+"\r\n")
 print("well done!")
 
def main():
 #遍历文件夹
 folder_path = r"分词结果"
 files_array = funfolder(folder_path)
 #生成语料库
 files_dic = []
 for file_path in files_array:
  file = readtxt(file_path)
  word_dic = count_word(file)
  files_dic.append(word_dic)
 #新建文件夹
 new_folder = r"tfidf计算结果"
 buildfolder(new_folder)
 
 #计算tf-idf,并将结果存入txt
 i=0
 for file in files_dic:
  tf_idf = count_tfidf(file,files_dic,files_array)
  files_path = files_array[i].split("//")
  #print(files_path)
  outfile_name = files_path[1]
  #print(outfile_name)
  out_path = r"%s//%s_tfidf.txt"%(new_folder,outfile_name)
  out_file(out_path,tf_idf)
  i=i+1
 
if __name__ == '__main__':
 main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 线程的暂停, 恢复, 退出详解及实例
Dec 06 Python
django rest framework之请求与响应(详解)
Nov 06 Python
tornado 多进程模式解析
Jan 15 Python
python实现自动发送邮件
Jun 20 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
python如何利用cv2.rectangle()绘制矩形框
Dec 24 Python
详解Python odoo中嵌入html简单的分页功能
May 29 #Python
Python 3.8中实现functools.cached_property功能
May 29 #Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 #Python
Python安装与基本数据类型教程详解
May 29 #Python
python登录WeChat 实现自动回复实例详解
May 28 #Python
Python语言进阶知识点总结
May 28 #Python
python图像和办公文档处理总结
May 28 #Python
You might like
使用PHP获取网络文件的实现代码
2010/01/01 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
js实现日历的简单算法
2017/01/24 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
python中循环语句while用法实例
2015/05/16 Python
详解Python中的type()方法的使用
2015/05/21 Python
python实现二分查找算法
2017/09/21 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
python点击鼠标获取坐标(Graphics)
2019/08/10 Python
django实现类似触发器的功能
2019/11/15 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
旷课检讨书2000字
2014/01/14 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
消防标语大全
2014/06/07 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
2016高中社会实践心得体会范文
2016/01/14 职场文书
JavaScript 定时器详情
2021/11/11 Javascript
vue封装数字翻牌器
2022/04/20 Vue.js