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中死锁的形成示例及死锁情况的防止
Jun 14 Python
python3.4下django集成使用xadmin后台的方法
Aug 15 Python
答题辅助python代码实现
Jan 16 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
通过Python编写一个简单登录功能过程解析
Sep 04 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
python实现超级马里奥
Mar 18 Python
matlab中二维插值函数interp2的使用详解
Apr 22 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
Django Paginator分页器的使用示例
Jun 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
php 获取本地IP代码
2013/06/23 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
Python sys.path详细介绍
2013/10/17 Python
python基础教程之数字处理(math)模块详解
2014/03/25 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
python检索特定内容的文本文件实例
2018/06/05 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
2019/07/01 Python
django删除表重建的实现方法
2019/08/28 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
捐书寄语赠言
2014/01/18 职场文书
逃课上网检讨书
2014/02/20 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
营销经理工作检讨书
2014/11/03 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
2015年度企业工作总结
2015/05/21 职场文书
Pytorch 如何实现LSTM时间序列预测
2021/05/17 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript