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程序中实现分布式进程的教程
Apr 28 Python
Python绘制并保存指定大小图像的方法
Jan 10 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
Python Tkinter 简单登录界面的实现
Jun 14 Python
python实现按首字母分类查找功能
Oct 31 Python
Python使用Pandas库常见操作详解
Jan 16 Python
基于python实现检索标记敏感词并输出
May 07 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
Python如何使用神经网络进行简单文本分类
Feb 25 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
Python正则表达式中flags参数的实例详解
Apr 01 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
关于php fread()使用技巧
2010/01/22 PHP
php使用session二维数组实例
2014/11/06 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
php编程实现简单的网页版计算器功能示例
2017/04/26 PHP
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
vue.js实现价格格式化的方法
2017/05/23 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
改变layer confirm弹窗按钮的颜色方法
2019/09/12 Javascript
Python脚本实现下载合并SAE日志
2015/02/10 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
Python之文字转图片方法
2018/05/10 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
2014年健康教育实施方案
2014/02/17 职场文书
高中军训感言800字
2014/03/05 职场文书
人事部经理岗位职责
2014/03/07 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
党员评议思想汇报
2014/10/08 职场文书
高中生逃课检讨书
2014/10/10 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
消防隐患整改通知书
2015/04/22 职场文书
2015社区个人工作总结范文
2015/05/13 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers