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的ORM框架SQLAlchemy入门教程
Apr 28 Python
简单的编程0基础下Python入门指引
Apr 01 Python
python MySQLdb Windows下安装教程及问题解决方法
May 09 Python
python引用DLL文件的方法
May 11 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
Jan 12 Python
Python在不同目录下导入模块的实现方法
Oct 27 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
python生成带有表格的图片实例
Feb 03 Python
Django 限制访问频率的思路详解
Dec 24 Python
python3从网络摄像机解析mjpeg http流的示例
Nov 13 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
php设计模式 Mediator (中介者模式)
2011/06/26 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
初识php MVC
2014/09/10 PHP
PHP对文件进行加锁、解锁实例
2015/01/23 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
thinkphp分页集成实例
2017/07/24 PHP
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
jquery事件重复绑定的快速解决方法
2014/01/03 Javascript
Ajax提交与传统表单提交的区别说明
2014/02/07 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
javascript(js)的小数点乘法除法问题详解
2014/03/07 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
基于jQuery插件实现点击小图显示大图效果
2016/05/11 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
python文件写入实例分析
2015/04/08 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Python函数中不定长参数的写法
2019/02/13 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
2014年教师党员公开承诺书
2014/05/28 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
反四风对照检查材料
2014/09/22 职场文书
辞职信标准格式
2015/02/27 职场文书
2015年企业团支部工作总结
2015/05/21 职场文书
zabbix自定义监控nginx状态实现过程
2021/11/01 Servers