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语言的12个基础知识点小结
Jul 10 Python
老生常谈python之鸭子类和多态
Jun 13 Python
import的本质解析
Oct 30 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
在python中pandas读文件,有中文字符的方法
Dec 12 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
python时间序列按频率生成日期的方法
May 14 Python
python实现ip代理池功能示例
Jul 05 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
浅析关于Keras的安装(pycharm)和初步理解
Oct 23 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
DIY实用性框形天线
2021/03/02 无线电
PHP5+UTF8多文件上传类
2008/10/17 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
angularjs请求数据的方法示例
2019/08/06 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
[47:52]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第二场 11.26
2020/11/30 DOTA
解决python给列表里添加字典时被最后一个覆盖的问题
2019/01/21 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
pycharm配置pyqt5-tools开发环境的方法步骤
2019/02/11 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
python画环形图的方法
2020/03/25 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
报关简历自我评价怎么写
2013/09/19 职场文书
社区交通安全实施方案
2014/03/22 职场文书
四年级学生评语大全
2014/04/21 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
学前班教学反思
2016/02/24 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers