python实现TF-IDF算法解析


Posted in Python onJanuary 02, 2018

TF-IDF(term frequency?inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。

同样,理论我这里不再赘述,因为和阮一峰大神早在2013年就将TF-IDF用一种非常通俗的方式讲解出来

材料

1.语料库(已分好词)
2.停用词表(哈工大停用词表)
3.python3.5

语料库的准备

这里使用的语料库是《人民日报》2015年1月16日至1月18日的发表的新闻。并且在进行TFIDF处理之前已经进行了人工分词(当然也可以使用jieba分词,但效果不好)

三天的新闻篇章数量如下:

python实现TF-IDF算法解析 

语料库中共103篇新闻。每篇新闻存入在txt文件中,编码为UTF-8无BOM

这里放一篇文章示例下:

python实现TF-IDF算法解析

我在自己的项目路径下新建一个corpus的文件夹,用于存放已经分好词待计算的语料。corpus文件夹的架构如下:

python实现TF-IDF算法解析

2015年1月16日至1月18日共三天,每天可获取的新闻分了四版,因此针对每一天下的每一版我又分别建了编号为1、2、3、4的文件夹,用于存放每一版的新闻。

其实也没必要这么麻烦,可以直接把所有的新闻都放到一个文件夹下,只是我个人的文件管理习惯。当然放到数据库里面更好。

关于停用词表

较好用的停用词表有哈工大停用词表、百度停用词表、川大停用词表,网上一查一大堆。我这里选择的是哈工大停用词表。

代码实现

# -*- coding: utf-8 -*-
# @Date   : 2017-04-11 09:31:55
# @Author  : Alan Lau (rlalan@outlook.com)
# @Language : Python3.5
import os
import codecs
import math
import operator


def fun(filepath): # 遍历文件夹中的所有文件,返回文件list
  arr = []
  for root, dirs, files in os.walk(filepath):
    for fn in files:
      arr.append(root+"\\"+fn)
  return arr


def wry(txt, path): # 写入txt文件
  f = codecs.open(path, 'a', 'utf8')
  f.write(txt)
  f.close()
  return path


def read(path): # 读取txt文件,并返回list
  f = open(path, encoding="utf8")
  data = []
  for line in f.readlines():
    data.append(line)
  return data


def toword(txtlis): # 将一片文章按照‘/'切割成词表,返回list
  wordlist = []
  alltxt = ''
  for i in txtlis:
    alltxt = alltxt+str(i)
  ridenter = alltxt.replace('\n', '')
  wordlist = ridenter.split('/')
  return wordlist


def getstopword(path): # 获取停用词表
  swlis = []
  for i in read(path):
    outsw = str(i).replace('\n', '')
    swlis.append(outsw)
  return swlis


def getridofsw(lis, swlist): # 去除文章中的停用词
  afterswlis = []
  for i in lis:
    if str(i) in swlist:
      continue
    else:
      afterswlis.append(str(i))
  return afterswlis


def freqword(wordlis): # 统计词频,并返回字典
  freword = {}
  for i in wordlis:
    if str(i) in freword:
      count = freword[str(i)]
      freword[str(i)] = count+1
    else:
      freword[str(i)] = 1
  return freword


def corpus(filelist, swlist): # 建立语料库
  alllist = []
  for i in filelist:
    afterswlis = getridofsw(toword(read(str(i))), swlist)
    alllist.append(afterswlis)
  return alllist


def wordinfilecount(word, corpuslist): # 查出包含该词的文档数
  count = 0 # 计数器
  for i in corpuslist:
    for j in i:
      if word in set(j): # 只要文档出现该词,这计数器加1,所以这里用集合
        count = count+1
      else:
        continue
  return count


def tf_idf(wordlis, filelist, corpuslist): # 计算TF-IDF,并返回字典
  outdic = {}
  tf = 0
  idf = 0
  dic = freqword(wordlis)
  outlis = []
  for i in set(wordlis):
    tf = dic[str(i)]/len(wordlis) # 计算TF:某个词在文章中出现的次数/文章总词数
    # 计算IDF:log(语料库的文档总数/(包含该词的文档数+1))
    idf = math.log(len(filelist)/(wordinfilecount(str(i), corpuslist)+1))
    tfidf = tf*idf # 计算TF-IDF
    outdic[str(i)] = tfidf
  orderdic = sorted(outdic.items(), key=operator.itemgetter(
    1), reverse=True) # 给字典排序
  return orderdic


def befwry(lis): # 写入预处理,将list转为string
  outall = ''
  for i in lis:
    ech = str(i).replace("('", '').replace("',", '\t').replace(')', '')
    outall = outall+'\t'+ech+'\n'
  return outall


def main():
  swpath = r'D:\Alan\myBlog\20170411《人民日报》TFIDF\code\哈工大停用词表.txt'#停用词表路径
  swlist = getstopword(swpath) # 获取停用词表列表

  filepath = r'D:\Alan\myBlog\20170411《人民日报》TFIDF\corpus'
  filelist = fun(filepath) # 获取文件列表

  wrypath = r'D:\Alan\myBlog\20170411《人民日报》TFIDF\result\TFIDF.txt'

  corpuslist = corpus(filelist, swlist) # 建立语料库

  outall = ''

  for i in filelist:
    afterswlis = getridofsw(toword(read(str(i))), swlist) # 获取每一篇已经去除停用的词表
    tfidfdic = tf_idf(afterswlis, filelist, corpuslist) # 计算TF-IDF

    titleary = str(i).split('\\')
    title = str(titleary[-1]).replace('utf8.txt', '')
    echout = title+'\n'+befwry(tfidfdic)
    print(title+' is ok!')
    outall = outall+echout
  print(wry(outall, wrypath)+' is ok!')

if __name__ == '__main__':
  main()

运行效果:

python实现TF-IDF算法解析

最终结果

这里放两篇新闻的TFIDF

python实现TF-IDF算法解析

python实现TF-IDF算法解析

可以看到,第一篇新闻的关键词可以认为为:核工业、发展、安全

第二篇新闻:习近平总书记、廉政、党风

关于\u3000\u3000这个问题实在不知道怎么替换掉,各种方法使用过了,不知哪位大神看到恳请指点下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python爬取网站数据保存使用的方法
Nov 20 Python
使用Python求解最大公约数的实现方法
Aug 20 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 Python
Python 判断图像是否读取成功的方法
Jan 26 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
django模板结构优化的方法
Feb 28 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
openstack中的rpc远程调用的方法
Jul 09 Python
python实现xlsx文件分析详解
Jan 02 #Python
Python实现KNN邻近算法
Jan 28 #Python
Python+matplotlib+numpy绘制精美的条形统计图
Jan 02 #Python
基于Python实现的ID3决策树功能示例
Jan 02 #Python
python实现基于SVM手写数字识别功能
May 27 #Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 #Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 #Python
You might like
php版银联支付接口开发简明教程
2016/10/14 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
js用正则表达式来验证表单(比较齐全的资源)
2013/11/17 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
chosen实现省市区三级联动
2018/08/16 Javascript
小程序实现多选框功能
2018/10/30 Javascript
python实现从一组颜色中找出与给定颜色最接近颜色的方法
2015/03/19 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
美国著名手表网站:Timepiece
2017/11/15 全球购物
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
英国伦敦的睡衣品牌:Asceno
2019/10/06 全球购物
搬家公司的创业计划书
2014/01/01 职场文书
经理管理专业毕业自荐书范文
2014/02/12 职场文书
优秀医生事迹材料
2014/02/12 职场文书
《鸟岛》教学反思
2014/04/26 职场文书
测绘工程专业求职信
2014/07/15 职场文书
销售会议开幕词
2015/01/28 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
培训后的感想
2015/08/07 职场文书
《走遍天下书为侣》教学反思
2016/02/22 职场文书
Django debug为True时,css加载失败的解决方案
2021/04/24 Python
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers
vue elementUI批量上传文件
2022/04/26 Vue.js