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 相关文章推荐
wxPython中文教程入门实例
Jun 09 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
Python中的浮点数原理与运算分析
Oct 12 Python
Zookeeper接口kazoo实例解析
Jan 22 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
使用Python制作表情包实现换脸功能
Jul 19 Python
如何爬取通过ajax加载数据的网站
Aug 15 Python
python 数据库查询返回list或tuple实例
May 15 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 Python
Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
Jan 28 Python
python实现不同数据库间数据同步功能
Feb 25 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中heredoc与nowdoc介绍
2014/12/25 PHP
PHP5.2下preg_replace函数的问题
2015/05/08 PHP
laravel返回统一格式错误码问题
2019/11/04 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
2014/04/08 Javascript
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
在vue中使用SockJS实现webSocket通信的过程
2018/08/29 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
vuex管理状态仓库使用详解
2020/07/29 Javascript
详解JavaScript 中的批处理和缓存
2020/11/19 Javascript
[44:33]EG vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
浅谈python字符串方法的简单使用
2016/07/18 Python
python使用turtle库与random库绘制雪花
2018/06/22 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
python实现密码强度校验
2020/03/18 Python
解决python父线程关闭后子线程不关闭问题
2020/04/25 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
我的中国心演讲稿
2014/09/04 职场文书
师德先进个人材料
2014/12/20 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
围城读书笔记
2015/06/26 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
Python字符串格式化方式
2022/04/07 Python