简介

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

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

  • 是ElasticSearch的评分算法

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

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

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

  • 举个小栗子:

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

使用python调numpy库实现

#!/usr/bin/env python
# encoding: utf-8 import numpy as np class TFIDF(object):
"""TFIDF简单实现"""
def __init__(self, corpus):
self.word_id = {}
self.vocabulary_count = {}
self.corpus = corpus
self.smooth_idf = 0.01 def fit_transform(self, corpus):
pass def get_vocabulary_frequency(self):
"""
计算文本特征的出现次数, 返回self.vocabulary_count
""" # 统计各词出现个数
id = 0
for single_corpus in self.corpus:
# 判断单个corpus是否为list类型
if isinstance(single_corpus, list):
pass
# 判断是否为string类型
if isinstance(single_corpus, str):
# 去除换行符, 再按空格分开, 返回的应该是一个list
single_corpus = single_corpus.strip("\n").split(" ")
for word in single_corpus:
# 如果该词不在词汇统计表的key中
if word not in self.vocabulary_count:
# 将该词放入到词汇统计表及词汇编码表中
self.vocabulary_count[word] = 1
self.word_id[word] = id
id += 1
else:
# 如果已经在了, 词频统计加一就ok
self.vocabulary_count[word] += 1 # 生成corpus长度 X 词频统计表长度的全零矩阵
X = np.zeros((len(self.corpus), len(self.vocabulary_count)))
for i in range(len(self.corpus)):
# 如果是string类型, 就去换行符并分割
if isinstance(self.corpus[i], str):
single_corpus = self.corpus[i].strip("\n").split(" ")
else:
single_corpus = self.corpus[i]
# 遍历单个single_corpus
for j in range(len(single_corpus)):
# 获取特征值和特征id, 并将他们放入矩阵对应的位置上
feature = single_corpus[j]
feature_id = self.word_id[feature]
X[i, feature_id] = self.vocabulary_count[feature]
return X.astype(int) # 需要转为int def get_tf_tdf(self):
"""
计算idf并生成最后的TFIDF矩阵
"""
X = self.get_vocabulary_frequency()
num_samples, n_features = X.shape
df = []
for i in range(n_features):
# 统计每个特征的非0的数量,也就是逆文档频率指数的分式中的分母,是为了计算idf
# bincount: 传入一个数组, 返回对应索引出现的次数的数组(大致可以这么理解)
df.append(num_samples - np.bincount(X[:,i])[0])
df = np.array(df)
# 是否需要添加平滑因子
df += int(self.smooth_idf)
num_samples += int(self.smooth_idf)
idf = np.log(num_samples / df) + 1 # 核心公式
return X*idf/len(self.vocabulary_count) if __name__ == '__main__':
corpus = [["此", "生", "不", "换"],["此", "情", "此", "景"],["不", "蔓", "不", "枝"]]
test = TFIDF(corpus)
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. git push的时候报错: Out of memory, malloc failed (tried to allocate 82037333 bytes)

    原因:上传的文件过大,这里我上传的文件有10G+所以报了上面的错误 解决方法:依次运行:git config --global pack.threads 1 git,git config --glob ...

  2. navicat12破解详细教程

    以管理员身份运行此注册机: 运行注册机 打开注册机后,1) Patch勾选Backup.Host和Navicat v12,然后点击Patch按钮: 默认勾选 找到Navicat Premium 12安 ...

  3. SpringBoot + redis + @Cacheable注解实现缓存清除缓存

    一.Application启动类添加注解 @EnableCaching 二.注入配置 @Bean public CacheManager cacheManager(RedisTemplate redi ...

  4. 苹果系统 MacOS 安装根证书

    12306 网上购票以及一些其他内部使用的系统,需要安装.cer扩展名的根证书的情况,windows安装较为简单大家也比较熟悉,使用mac安装根证书在此做下详细介绍. 当前以10.13.5版本为例,其 ...

  5. Openstack----学习笔记

    ceph 分布式存储,用于存放新创建的云主机磁盘镜像文件和磁盘 创建云主机流程记录 简易版本: 上图中所有发送的请求都会存放在rabbit_mq(消息队列)中,各个组件会定时取消息队列中与自己相关的请 ...

  6. 【JAVA蓝桥杯】基础练习1 十进制转十六进制

    资源限制 时间限制:1.0s   内存限制:512.0MB 问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式.它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16 ...

  7. python下载图片的代码块

    import urllib.requestimgurl="https://ss3.baidu.com/9fo3dSag_xI4khGko9WTAnF6hhy/image/h%3D300/si ...

  8. exec函数的执行对用户ID的影响

    exec不会创建新进程,只是分析加载程序文件或者shell执行文件,替换父进程的代码段.数据段.栈段,一个进程可以执行多个exec来执行多个程序,但进程只有一个 父进程经常是waitpid,获取子进程 ...

  9. Laradock 开放 workspace 端口

    1.在 laradock/workspace/Dockerfile 文件的最后添加一行,申明开放端口:       EXPOSE 1215;   2.在 laradock/docker-compose ...

  10. Dockfile的详解

    Dockerfile是构建镜像的指令文件,按照dockerfile的规范分为如下几部分: FROM 基础镜像,FROM alpine:3.8(任何的一个镜像都可以作为基础镜像,主要看我们做的镜像是干嘛 ...