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实现网站文件的全备份和差异备份
Nov 30 Python
Python实现一个简单的验证码程序
Nov 03 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
Python拼接字符串的7种方法总结
Nov 01 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
python3字符串操作总结
Jul 24 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
Python是怎样处理json模块的
Jul 16 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
Python Selenium库的基本使用教程
Jan 04 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程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
php实现头像上传预览功能
2017/04/27 PHP
判断页面是关闭还是刷新的js代码
2007/01/28 Javascript
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
JQUERY操作JSON实例代码
2010/02/09 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
jQuery满屏焦点图左右滚动特效代码分享
2015/09/07 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
vue的全局提示框组件实例代码
2018/02/26 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
2019/02/28 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
jQuery实现判断滚动条滚动到document底部的方法分析
2019/08/27 jQuery
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
Python书单 不将就
2017/07/11 Python
人机交互程序 python实现人机对话
2017/11/14 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
使用HTML5进行SVG矢量图形绘制的入门教程
2016/02/19 HTML / CSS
越南综合购物网站:Lazada越南
2019/06/10 全球购物
公司前台辞职报告
2014/01/19 职场文书
群众路线表态发言材料
2014/10/17 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
代码复现python目标检测yolo3详解预测
2022/05/06 Python