简介

  • 全称: Term Frequency-inverse document frequency(文本频率与逆文档频率指数)

  • 目的: 表征一个token(可以是一个字或者一个词)的重要程度

  • 是ElasticSearch的评分算法

  • TF - 如果该token出现的频率很高, 且不是常用连接词或语气词, 那么该词的重要程度就更高。

  • 如果该词是常用连接词或语气词, 那该词即使出现很多次也不是很重要。为了处理该种情况, 出现了逆文档频率指数(idf)。

  • 逆文档评率指数(idf)公式: log(所有的文档条数/有这个词的文档条数) => 这个词尽可能的只在某几条文档中出现过, 那样才更有区分性。

  • 举个小栗子:

    1. (a, b, c, d, e) 五个词, 所有词汇总数是5,若词d出现了1次, 那么其tf=1/5
    2. 若文档总数为4条, didf=log(4/1), 实际操作中会加入平滑因子, 防止统计数为0出现。
    3. 该词d的权重为 tf * idf = 1/5 * log(4 / 1)
    • 对每个词都做一下这样的计算,最后得到的是一个样品数量 * 唯一token总数维度的矩阵,在例子中样本数量为3,唯一token总数为5,那么我们会得到一个3*5的矩阵,如果这一条文档中没有这个词就直接赋值0就可以了。

使用python调numpy库实现

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. import numpy as np
  4. class TFIDF(object):
  5. """TFIDF简单实现"""
  6. def __init__(self, corpus):
  7. self.word_id = {}
  8. self.vocabulary_count = {}
  9. self.corpus = corpus
  10. self.smooth_idf = 0.01
  11. def fit_transform(self, corpus):
  12. pass
  13. def get_vocabulary_frequency(self):
  14. """
  15. 计算文本特征的出现次数, 返回self.vocabulary_count
  16. """
  17. # 统计各词出现个数
  18. id = 0
  19. for single_corpus in self.corpus:
  20. # 判断单个corpus是否为list类型
  21. if isinstance(single_corpus, list):
  22. pass
  23. # 判断是否为string类型
  24. if isinstance(single_corpus, str):
  25. # 去除换行符, 再按空格分开, 返回的应该是一个list
  26. single_corpus = single_corpus.strip("\n").split(" ")
  27. for word in single_corpus:
  28. # 如果该词不在词汇统计表的key中
  29. if word not in self.vocabulary_count:
  30. # 将该词放入到词汇统计表及词汇编码表中
  31. self.vocabulary_count[word] = 1
  32. self.word_id[word] = id
  33. id += 1
  34. else:
  35. # 如果已经在了, 词频统计加一就ok
  36. self.vocabulary_count[word] += 1
  37. # 生成corpus长度 X 词频统计表长度的全零矩阵
  38. X = np.zeros((len(self.corpus), len(self.vocabulary_count)))
  39. for i in range(len(self.corpus)):
  40. # 如果是string类型, 就去换行符并分割
  41. if isinstance(self.corpus[i], str):
  42. single_corpus = self.corpus[i].strip("\n").split(" ")
  43. else:
  44. single_corpus = self.corpus[i]
  45. # 遍历单个single_corpus
  46. for j in range(len(single_corpus)):
  47. # 获取特征值和特征id, 并将他们放入矩阵对应的位置上
  48. feature = single_corpus[j]
  49. feature_id = self.word_id[feature]
  50. X[i, feature_id] = self.vocabulary_count[feature]
  51. return X.astype(int) # 需要转为int
  52. def get_tf_tdf(self):
  53. """
  54. 计算idf并生成最后的TFIDF矩阵
  55. """
  56. X = self.get_vocabulary_frequency()
  57. num_samples, n_features = X.shape
  58. df = []
  59. for i in range(n_features):
  60. # 统计每个特征的非0的数量,也就是逆文档频率指数的分式中的分母,是为了计算idf
  61. # bincount: 传入一个数组, 返回对应索引出现的次数的数组(大致可以这么理解)
  62. df.append(num_samples - np.bincount(X[:,i])[0])
  63. df = np.array(df)
  64. # 是否需要添加平滑因子
  65. df += int(self.smooth_idf)
  66. num_samples += int(self.smooth_idf)
  67. idf = np.log(num_samples / df) + 1 # 核心公式
  68. return X*idf/len(self.vocabulary_count)
  69. if __name__ == '__main__':
  70. corpus = [["此", "生", "不", "换"],["此", "情", "此", "景"],["不", "蔓", "不", "枝"]]
  71. test = TFIDF(corpus)
  72. print(test.get_tf_tdf())

TFIDF介绍的更多相关文章

  1. TF-IDF介绍

    TF-IDF是什么 TF-IDF是一种统计方法,用以评估一个词对于一篇文章或语料库中一篇文章的重要性.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降. T ...

  2. Python TF-IDF计算100份文档关键词权重

    上一篇博文中,我们使用结巴分词对文档进行分词处理,但分词所得结果并不是每个词语都是有意义的(即该词对文档的内容贡献少),那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF. 一,TF- ...

  3. NLP入门(二)探究TF-IDF的原理

    TF-IDF介绍   TF-IDF是NLP中一种常用的统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度,通常用于提取文本的特征,即关键词.字词的重要性随着它在文件中出现的 ...

  4. TF-IDF基本原理

    1.TF-IDF介绍 TF/IDF(term frequency–inverse document frequency)用以评估字词 对于一个文件集其中一份文件的重要程度.字词的重要性随着它在文件中出 ...

  5. skearn自学路径

    sklearn学习总结(超全面) 关于sklearn,监督学习几种模型的对比 sklearn之样本生成make_classification,make_circles和make_moons pytho ...

  6. TF-IDF算法介绍及实现

    目录 1.TF-IDF算法介绍 (1)TF是词频(Term Frequency) (2) IDF是逆向文件频率(Inverse Document Frequency) (3)TF-IDF实际上是:TF ...

  7. 特征值提取之 -- TF-IDF值的简单介绍

    首先引用百度百科的话: "TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度.字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料 ...

  8. ES搜索排序,文档相关度评分介绍——TF-IDF—term frequency, inverse document frequency, and field-length norm—are calculated and stored at index time.

    Theory Behind Relevance Scoring Lucene (and thus Elasticsearch) uses the Boolean model to find match ...

  9. DBoW2库介绍

    DBoW2库是University of Zaragoza里的Lopez等人开发的开源软件库. 由于在SLAM回环检测上的优异表现(特别是ORB-SLAM2),DBoW2库受到了广大SLAM爱好者的关 ...

随机推荐

  1. 【PAT甲级】1029 Median (25 分)

    题意: 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数. 输入一个正整数N(<=2e5),接着输入N个非递减序的长整数.(重复一次) 输出两组数合并后的中位数.(200ms, ...

  2. Electromagnetic

    1. 电磁辐射 2. 电磁频谱 3. 可见光 4. 微波 5. 更多相关链接 1. 电磁辐射 https://en.wikipedia.org/wiki/Electromagnetic_radiati ...

  3. 为Docker Desktop安装kubernet-dashboard

    在上一篇,在windows上,用最简方法(比其他的脚本法,提前拉取镜像简便太多了)安装好了docker desktop,并启用了内置的kubernetes. 这种安装方法实际上是在Hyper-v虚拟机 ...

  4. 「HNOI2010」弹飞绵羊

    「HNOI2010」弹飞绵羊 传送门 考虑分块. 每一个位置 \(i\) ,记 \(to[i]\) 表示从这个位置一直往右跳回落在哪个位置. 然后修改的时候直接暴改,查询也是暴跳,复杂度 \(O(n ...

  5. 微信小程序 画布arc截取圆形图片

    画布提供了一种可以创建圆的方法 arc(x, y, r, s, e, counterclockwise) x,y:圆心 r:圆的半径 s:起始弧度 (0) e:终止弧度 (1.5 * Math.PI) ...

  6. JavaScript 中 new 关键字结合构造函数创建对象

    步骤: new会在内存中创建一个新的空对象 new 会让this指向这个新的对象 执行构造函数(给这个新对象添加属性和方法) new会返回这个新对象

  7. 吴裕雄--天生自然HADOOP操作实验学习笔记:pvuv统计案例理论

    实验目的 复习pv.uv的概念和原理 了解pv.uv的实际意义和获取方法 实验原理 前面我们已经基于mapreduce进行数据的etl处理,实验有很多不足之处,这次实验我们是基于url数据进行pv和u ...

  8. 【剑指Offer面试编程题】题目1386:旋转数组的最小数字--九度OJ

    题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  9. 【转载】Oracle创建数据库和用户

    以前开发的时候用得比较多的是mysql和sql server,oracle用的比较少,用起来比较生疏,mysql和sql server用起来比较类似,就oracle的使用方式和他们不同,oracle在 ...

  10. 1552146271@qq.com

    北京时间9月27日早间消息,美国外卖服务DoorDash周四宣布,一项安全漏洞暴露了该公司大约490万客户.商家和送货员的个人数据. 这家总部位于旧金山的公司在一份声明中说,此次泄露的信息可能包括大约 ...