首先TF-IDF 全称:term frequency–inverse document frequency,是一种用于信息检索与数据挖掘的常用加权技术。

TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)。

上面是百度的结果

我的理解就是用来筛选特征的,看看那些词用来当特征比较好。

词频(TF):就是一个词在一个文本里出现的次数除以文本词数。(文本内词出现次数 /文本内词总数)

逆文本频率指数(IDF):就是总文本数除以包含这个词的文本数的10的对数,有点饶哈哈。lg(总文本数/包含这个词的文本数)

TF-IDF = TF*IDF

先看下调用的:

# CountVectorizer会将文本中的词语转换为词频矩阵
vectorizer = CountVectorizer(max_features=1200, min_df=12)

# TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值
tf_idf_transformer = TfidfTransformer()

# vectorizer.fit_transform()计算每个词出现的次数
# tf_idf_transformer.fit_transform将词频矩阵统计成TF-IDF值
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(train_features['features'].values.astype('U'))) # .values.astype('U')

x_train_weight = tf_idf.toarray() # 训练集TF-IDF权重矩阵

然后是我手写的:
参数格式是,[词1 词2 词3,词1 词2 词3,词1 词2 词3]
一个字符串列表,词与词间用空格隔开。
 print("-"*5+"构建tf-idf权重矩阵中"+"-"*5)
def get_tf_idf(list_words):
# 构建词典
wordSet = list(set(" ".join(list_words).split()))

# 统计词数
def count_(words):
wordDict = dict.fromkeys(wordSet, 0)
for i in words:
wordDict[i] += 1
return wordDict

# 计算tf
def computeTF(words):
cnt_dic = count_(words)
tfDict = {}
nbowCount = len(words)

for word, count in cnt_dic.items():
tfDict[word] = count / nbowCount

return tfDict

# 计算idf
def get_idf():
filecont = dict.fromkeys(wordSet, 0)
for i in wordSet:
for j in list_words:
if i in j.split():
filecont[i] += 1
idfDict = dict.fromkeys(wordSet, 0)
le = len(list_words)
for word, cont in filecont.items():
idfDict[word] = math.log10(le/cont+1)
return idfDict

# 计算每个词的TF*IDF的值
def get_tf_idf(list_words):
idf_dic = get_idf()
ret = []
for words in list_words:
tf_dic = computeTF(words.split())
tf_idf_dic = {}
temp = []
for word, tf in tf_dic.items():
idf = idf_dic[word]
tf_idf = tf * math.log(len(list_words) / (idf+1))
tf_idf_dic[word] = tf_idf

for word in wordSet:
temp.append(tf_idf_dic.get(word, 0))
ret.append(temp)
return ret
return np.array(get_tf_idf(list_words))
tf-idf矩阵:
word_tf_idf = get_tf_idf(features)

慢的飞起,哈哈哈哈。

TF-IDF笔记(直接调用函数、手写)的更多相关文章

  1. JDBC学习笔记(10)——调用函数&存储过程

    如何使用JDBC调用存储在数据库中的函数或存储过程: * 1.通过COnnection对象的prepareCall()方法创建一个CallableStatement *    对象的实例,在使用Con ...

  2. SVM学习笔记(二)----手写数字识别

    引言 上一篇博客整理了一下SVM分类算法的基本理论问题,它分类的基本思想是利用最大间隔进行分类,处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的.考 ...

  3. 【转】JDBC学习笔记(10)——调用函数&存储过程

    转自:http://www.cnblogs.com/ysw-go/ 如何使用JDBC调用存储在数据库中的函数或存储过程: * 1.通过COnnection对象的prepareCall()方法创建一个C ...

  4. 5 TensorFlow入门笔记之RNN实现手写数字识别

    ------------------------------------ 写在开头:此文参照莫烦python教程(墙裂推荐!!!) ---------------------------------- ...

  5. tensorflow笔记(五)之MNIST手写识别系列二

    tensorflow笔记(五)之MNIST手写识别系列二 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7455233.html ...

  6. 10分钟教你用python 30行代码搞定简单手写识别!

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 手写笔记还是电子笔记好呢? 毕业季刚结束,眼瞅着2018级小萌新马上就要来了,老腊肉小编为了咱学弟学妹们的学习,绞尽脑汁准备编一套大学秘籍, ...

  7. 一套手写ajax加一般处理程序的增删查改

    倾述下感受:8天16次驳回.这个惨不忍睹. 好了不说了,说多了都是泪. 直接上代码 : 这个里面的字段我是用动软生成的,感觉自己手写哪些字段太浪费时间了,说多了都是泪 ajax.model层的代码: ...

  8. python笔记六(函数的参数、返回值)

    一 调用函数 在写函数之前,我们先尝试调用现有的函数 >>> abs(-9) 9 除此之外,还有我们之前使用的len()等.可以用于数据类型转换的 int() float() str ...

  9. 第三节,TensorFlow 使用CNN实现手写数字识别(卷积函数tf.nn.convd介绍)

    上一节,我们已经讲解了使用全连接网络实现手写数字识别,其正确率大概能达到98%,这一节我们使用卷积神经网络来实现手写数字识别, 其准确率可以超过99%,程序主要包括以下几块内容 [1]: 导入数据,即 ...

随机推荐

  1. Ubuntu一键安装LAMP,LNMP

    参考: https://blog.csdn.net/xueyingqi/article/details/50674078 https://www.cnblogs.com/pengzheng/p/363 ...

  2. Delaunay三角剖分及MATLAB实例

    https://blog.csdn.net/piaoxuezhong/article/details/68065170 一.原理部分 点集的三角剖分(Triangulation),对数值分析(如有限元 ...

  3. path()和re_path()用法&区别

    path() 参数列表: 参数1:字符串类型,用来匹配请求路径 参数2:指定路径所对应的视图函数名 参数3:关键字参数 实际用的不多 参数4... # urls.py # 创建子应用的路由文件 fro ...

  4. 深度优先算法--对DFS的一些小小的总结(一)

    提到DFS,我们首先想到的是对树的DFS,例如下面的例子:求二叉树的深度 int TreeDepth(BinaryTreeNode* root){ if(root==nullptr)return 0; ...

  5. 客户端回调 Watcher ?

    客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调 Watcher. 客户端的 Watcher 机制同样是一次性的,一旦被触发后,该 Watcher 就失效了.

  6. 你将如何使用 thread dump?你将如何分析 Thread dump?

    新建状态(New) 用 new 语句创建的线程处于新建状态,此时它和其他 Java 对象一样,仅仅在堆区 中被分配了内存. 就绪状态(Runnable) 当一个线程对象创建后,其他线程调用它的 sta ...

  7. 你对 Spring Boot 有什么了解?

    事实上,随着新功能的增加,弹簧变得越来越复杂.如果必须启动新的 spring 项 目,则必须添加构建路径或添加 maven 依赖项,配置应用程序服务器,添加 spring 配置.所以一切都必须从头开始 ...

  8. 你是如何调用 wait()方法的?使用 if 块还是循环?为什么?

    wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条 件可能还没有满足,所以在处理前,循环检测条件是否满足会更好.下面是一段 标准的使用 wait 和 notify 方法 ...

  9. Altium Designer PCB文件的绘制(下:PCB布线和检查)

    在完成电路板的布局工作后,就可以开始布线操作了.在PCB的设计中,布线是完成产品设计的最重要的步骤,其要求最高.技术最细.工作量最大.PCB布线可分为单面布线.双面布线.多层布线.布线的方式有自动布线 ...

  10. 顺利通过EMC实验(16)