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中类型关系和继承关系实例详解
May 25 Python
使用实现XlsxWriter创建Excel文件并编辑
May 04 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
python实现微信小程序用户登录、模板推送
Aug 28 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
Python解析json代码实例解析
Nov 25 Python
Python requests模块session代码实例
Apr 14 Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 Python
Python实现打包成库供别的模块调用
Jul 13 Python
python 利用toapi库自动生成api
Oct 19 Python
详解用Python把PDF转为Word方法总结
Apr 27 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实现WEB动态网页静态
2006/10/09 PHP
网页打开自动最大化的js代码
2012/08/22 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
小程序实现左滑删除效果
2019/07/25 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
使用JavaScript通过前端发送电子邮件
2020/05/22 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
Python 字典(Dictionary)操作详解
2014/03/11 Python
python开发之thread实现布朗运动的方法
2015/11/11 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
python实现名片管理系统
2018/11/29 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
考试违纪检讨书
2014/02/02 职场文书
激励员工的口号
2014/06/16 职场文书
社区党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
应收账款管理制度
2015/08/06 职场文书
《山中访友》教学反思
2016/02/24 职场文书
小学语文课《掌声》教学反思
2016/03/03 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
5行Python代码实现一键批量扣图
2021/06/29 Python
Python IO文件管理的具体使用
2022/03/20 Python