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编写脚本获取手机当前应用apk的信息
Jul 21 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
python抓取百度首页的方法
May 19 Python
Python抓取电影天堂电影信息的代码
Apr 07 Python
python+pandas+时间、日期以及时间序列处理方法
Jul 10 Python
BP神经网络原理及Python实现代码
Dec 18 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
Python lambda表达式filter、map、reduce函数用法解析
Sep 11 Python
Python通过yagmail实现发送邮件代码解析
Oct 27 Python
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
Apr 12 Python
变长双向rnn的正确使用姿势教学
May 31 Python
Python turtle实现贪吃蛇游戏
Jun 18 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模块 Memcached功能多于Memcache
2011/06/14 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
PHP数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
javascript中的绑定与解绑函数应用示例
2013/06/24 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
vue.js声明式渲染和条件与循环基础知识
2017/07/31 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
localstorage实现带过期时间的缓存功能
2019/06/28 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
[52:26]完美世界DOTA2联赛决赛 FTD vs Phoenix 第一场 11.08
2020/11/11 DOTA
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
python单例模式的应用场景实例讲解
2021/02/24 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
东南亚冒险旅行与活动:Adventoro
2019/10/16 全球购物
教师对学生的寄语
2014/04/03 职场文书
学校运动会广播稿
2014/10/11 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
关于颐和园的导游词
2015/01/30 职场文书
旅游投诉信范文
2015/07/02 职场文书