从大一开始接触TF-IDF,一直觉得这个特别简单,,但是图样图森破,,,

即使现在来说,也似乎并非完全搞懂

核心思想:

  计算词语在该文章中权重,与词语出现次数和词语价值有关

  词语出现次数,重复即强调,越重要

  词语价值,出现在越多的文档中越滥情,越廉价

公式:

  词频TF = 出现次数 / 总次数

  逆向文件频率IDF = log( 总文档数 / ( 出现文档数+1) )

  TF-IDF = TF * IDF

具体计算:

1.我的代码:

  # 由于算这个是为了求feature值,因此用了jieba,轻量级好用的分词包,具体可参见它的github:https://github.com/hosiet/jieba

  # 并且最终计算结果用json存储在文件中

  起初,自己写了个代码计算

 #coding=utf-8
import jieba
import re
import math
import json with open('stop_words.txt', 'r', encoding='utf-8') as f:
stopwords = [x[:-1] for x in f] data = []
tf = {}
doc_num = {}
tfidf = {} def calcu_tf():
'''计算tf值'''
with open('exercise.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
global TOTAL
TOTAL = 0
for l in lines:
# 使用jieba分词
lx = re.sub('\W', '', l)
list = jieba.lcut(lx)
# 每句话中一个词可能出现多次
tmp = {}
for i in list:
if(i not in doc_num):
doc_num[i] = 0
if (i not in stopwords)and(i not in tmp):
data.append(i)
# 计算出现在多少个文档里
tmp[i] = 1
doc_num[i] += 1
# 计算总文档数
TOTAL += 1
dataset = set(data)
for i in dataset:
tf[i] = data.count(i) def calcu_tfidf():
'''计算TF-IDF值'''
for i in tf:
tfidf[i] = tf[i] * math.log10(TOTAL / (doc_num[i]+1)) if __name__ == '__main__' :
calcu_tf()
calcu_tfidf()
print(tfidf)
with open('tfidf.json', 'w', encoding="utf-8") as file:
# json.dumps需要设置一下参数,不然文件中全是/u什么的
file.write(json.dumps(tfidf, ensure_ascii=False, indent=2))

是自己设置的测试文档。。以及运算结果(部分截图)

 

最终用时1.54041444018928秒

2.使用sklearn包

但后来觉得,有现成能用就用现成的,毕竟少好多代码

于是,使用scikit-learn计算TF-IDF值就诞生了

  # sklearn包的安装另一篇博客中有写http://www.cnblogs.com/rucwxb/p/7297733.html

计算过程:

  CountVectorizer计算TF

  TFidfTransformer计算IDF

核心代码:

 from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from numpy import *
import time
import jieba
import re def calcu_tfidf():
corpus = []
idfDic = {}
tf = {}
tfs = []
tfidf = {}
with open('exercise.txt', 'r', encoding='utf-8') as f:
for x in f:
lx = re.sub('\W', '', x)
jb = jieba.lcut(lx)
list = []
for i in jb:
if i not in stopwords:
list.append(i)
list = " ".join(list)
corpus.append(list)
#将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer(ngram_range=(1, 1), lowercase=False, token_pattern = r'\b\w+\b', min_df = 1)
#类调用
transformer = TfidfTransformer()
#计算个词语出现的次数
tf_mat = vectorizer.fit_transform(corpus)
tfidf = transformer.fit_transform(tf_mat)
#获取词袋中所有文本关键词
words = vectorizer.get_feature_names()
# 获得IDF和TF值
tfs = tf_mat.sum(axis=0).tolist()
for i, word in enumerate(words):
idfDic[word] = transformer.idf_[i]
tf[word] = tfs[i]
# 计算TF-IDF
for i in words:
tfidf[i] = idfDic[i] * tf[i] if __name__ == '__main__' :
startT = time.clock()
with open('stop_words.txt', 'r', encoding='utf-8') as f:
stopwords = [x[:-1] for x in f]
calcu_tfidf()
with open('tfidf2.json', 'w', encoding="utf-8") as file:
# json.dumps需要设置一下参数,不然文件中全是/u什么的
file.write(json.dumps(tfidf, ensure_ascii=False, indent=2))
endT = time.clock()
print(endT-startT)

TF-IDF学习(python实现)的更多相关文章

  1. tf–idf算法解释及其python代码实现(下)

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  2. tf–idf算法解释及其python代码

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  3. tf–idf算法解释及其python代码实现(上)

    tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...

  4. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

  5. Elasticsearch学习之相关度评分TF&IDF

    relevance score算法,简单来说,就是计算出,一个索引中的文本,与搜索文本,他们之间的关联匹配程度 Elasticsearch使用的是 term frequency/inverse doc ...

  6. 学习python

    最近感觉Python 很不错的样子,乘着这次寒假,不如就先学一下吧. 翻看了一些教程,发现<python 简明教程>质量上乘. 我目前学习python就是打算做一些上位机之类的,好像有点杀 ...

  7. Python学习--Python基础语法

    第一个Python程序 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗 ...

  8. Linux运维人员如何学习python编程

    Linux运维人员如何学习python编程 从不会写代码,到自己独立能写代码解决问题 .这个问题很重要!盲目学习所谓的项目,最后 还是不会自己写代码解决问题.首先解决了独立能写代码解决问题,再通过项目 ...

  9. 新手学习Python时常见的错误

    最近学习Python,现在把一些常见的错误总结如下: 1)忘记在 if , elif , else , for , while , class ,def 声明末尾添加 :(导致 "Synta ...

  10. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

随机推荐

  1. yii2 获取从前台传过来的post数据

    第一次使用yii写接口的时候,直接用了$_POST获取post数据,发现会报400错误,根本无法获取到post数据,用$_GET却能获取get数据. 纠结了很久,然后查资料,发现原来yii中默认的开启 ...

  2. win10 vmware下Linux系统联网

    本来,这个问题网上资源很多的,但是就因为多,就变得杂了,对于许多新手,并不理解为啥,故记录下来方便以后使用.此处我采用配置VWmare虚拟网关(上学期刚刚学计算机网络,正好可以复习下).关于虚拟机下L ...

  3. [补档][JLOI 2017]聪明的燕姿

    [NOI 2008]假面舞会 题目 阴天傍晚车窗外 未来有一个人在等待 向左向右向前看 爱要拐几个弯才来 我遇见谁会有怎样的对白 我等的人他在多远的未来 我听见风来自地铁和人海 我排着队拿着爱的号码牌 ...

  4. jQuery防京东浮动网站楼层导航代码

    jQuery防京东浮动网站楼层导航代码   <!DOCTYPE html > <html xmlns="http://www.w3.org/1999/xhtml" ...

  5. NYOJ-63 小猴子下落(二叉树及优化算法详解)

      小猴子下落 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,··· ...

  6. 响应式布局 —— Demo

    响应式布局实例演示What is 响应式布局? 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端--而不是为每个终端做一个特定的版本.这 ...

  7. python中的赋值和深浅拷贝

    python中,A object  = B object  是一种赋值操作,赋的值不是一个对象在内存中的空间,而只是这个对象在内存中的位置 . 此时当B对象里面的内容发生更改的时候,A对象也自然而然的 ...

  8. [算法题] Search in Rotated Sorted Array ii

    题目内容 题目来源:LeetCode Suppose an array sorted in ascending order is rotated at some pivot unknown to yo ...

  9. Cognos配置管理

    --Cognos配置管理 --------------------------2014/03/19 进入配置管理界面: /washome/cognos/c10/bin64 ./cogconfig.sh ...

  10. DOS批处理中%cd%和%~dp0的区别[forward]

    DOS批处理中%cd%和%~dp0的区别   在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0.      这两个变量的 ...