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实现的简单文本类游戏实例
Apr 28 Python
Django日志模块logging的配置详解
Feb 14 Python
python+django+sql学生信息管理后台开发
Jan 11 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
python实现扫描ip地址的小程序
Apr 16 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
python开根号实例讲解
Aug 30 Python
Python下载的11种姿势(小结)
Nov 18 Python
Python 内置函数速查表一览
Jun 02 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
PHP中=赋值操作符对不同数据类型的不同行为
2011/01/02 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
php遍历树的常用方法汇总
2015/06/18 PHP
ThinkPHP安装和设置
2015/07/27 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
js获取select标签选中值的两种方式
2014/01/09 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
jquery实现表格中点击相应行变色功能效果【实例代码】
2016/05/09 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
详解supervisor使用教程
2017/11/21 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
opencv 获取rtsp流媒体视频的实现方法
2019/08/23 Python
django 模型中的计算字段实例
2020/05/19 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
2016/10/23 HTML / CSS
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
计算机本科生自荐信
2013/10/15 职场文书
新闻专业大学生找工作的自我评价
2013/10/30 职场文书
商务英语毕业生自荐信范文
2013/11/08 职场文书
工商管理实习生自我鉴定范文
2013/12/18 职场文书
MySQL基础快速入门知识总结(附思维导图)
2021/09/25 MySQL