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获得时间的实例说明
Mar 25 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
Python 操作文件的基本方法总结
Aug 10 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
python读取csv文件并把文件放入一个list中的实例讲解
Apr 27 Python
Python中的集合介绍
Jan 28 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
python求最大公约数和最小公倍数的简单方法
Feb 13 Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
Jul 07 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 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
在mysql数据库原有字段后增加新内容
2009/11/26 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
PHP运行模式的深入理解
2013/06/03 PHP
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
2016/09/20 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
vue+vant实现商品列表批量倒计时功能
2020/01/13 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
Python数组遍历的简单实现方法小结
2016/04/27 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Python中整数的缓存机制讲解
2019/02/16 Python
Python之lambda匿名函数及map和filter的用法
2019/03/05 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
安装PyInstaller失败问题解决
2019/12/14 Python
Python实现微信好友的数据分析
2019/12/16 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
python3将变量输入的简单实例
2020/08/19 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
银行员工犯错检讨书
2014/09/16 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
沈阳故宫导游词
2015/01/31 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书