TF-IDF算法是一种用于信息检索与数据挖掘的常用加权技术。TF的意思是词频(Term - frequency),IDF的意思是逆向文件频率(inverse Document frequency).

TF-IDF是传统的统计算法,用于评估一个词在一个文档集中对于某一个文档的重要程度。它与这个词在当前文档中的词频成正比,与文档集中的其他词频成反比。

首先说一下TF(词频)的计算方法,TF指的是当前文档的词频,,在这个公式中,分子表示的是改词在某一文档中出现的次数,分母表示在该文档中所有关键词出现的次数之和。

然后来说下IDF(逆向词频)的计算方法,IDF指的是某个词汇普遍性的度量。,这个公式中,log内的部分,分子表示的是文档集中文档的个数,分母表示的是包含当前关键词的文档的个数,对于这个分数取对数,得到的就是,当前词汇的IDF的值。

下面,我来介绍下通过python对TF-IDF算法的设计及实现:

对象1:文章集(属性:文章对象的集合,包含关键字的文章数)

对象1: 文章(属性:关键词对象的集合;关键词出现的总次数;关键词对应对象的字典)

对象2:文章-关键词(属性:关键词名称;关键词在当前文章中出现的次数;TF_IDF)

实现流程:

1、创建文章对象,初始关键字的Map集

2、遍历关键字,每遍历一个关键字,

2.1 关键词出现的总次数加一

2.2 判断文章关键字中是够存在当前关键字,如果存在,找出他,加一,如果不存在,创建一个文章关键字对象,塞到文章的关键字的集中去;

2.3 若果这个关键字是第一次出现,则记录关键字出现的文章数(如果关键字在关键字-文章数 字典中存在,则文章数+1,否则将其加入到关键字-文章数字典中,并赋初始值1)

2.4 遍历完成,文章的关于关键词的Map集装载完成,然后将当前的文章add到文章集的对象中去

3 遍历文章集,计算出关键字对应的TF-IDF,并输出

实现代码:(实现代码以读取一个文件模拟多个文档)

# TF_IDF.py
# -*- coding: utf-8 -*-
import jieba
import math class DocumentSet():
documentList = []
key_Count = {} #关键词对应的文章数 class Document():
docKeySumCount=0 #文章中所有关键词总次数
docKeySet={} #关键词对象列表
def __init__(self,docid):
self.docid = docid class DocKey():
docKeyCount = 1 #当前关键词在当前文章中出现的次数
TF_IDF = 0 #当前关键词的TF-IDF值
def __init__(self,word):
self.word = word
f = open("C:/Users/zw/Desktop/key-words.txt", 'r')
line='start'
docList = DocumentSet()
while line:
line = f.readline()
datafile = line.split('\t')
if(datafile.__len__()>=2):
doc = Document(datafile[0])
wordList = list(jieba.cut(datafile[1]))
for i in wordList:
doc.docKeySumCount = doc.docKeySumCount + 1
if i not in doc.docKeySet.keys():
doc.docKeySet[i] = DocKey(i)
else:
doc.docKeySet[i].docKeyCount = doc.docKeySet[i].docKeyCount+1
#记录包含关键词的文章数
if doc.docKeySet[i].docKeyCount <= 1:
if i not in docList.key_Count.keys():
docList.key_Count[i]=1
else:
docList.key_Count[i]=docList.key_Count[i]+1
docList.documentList.append(doc)
f.close()
for d in docList.documentList:
for k in d.docKeySet.keys():
d.docKeySet[k].TF_IDF = d.docKeySet[k].docKeyCount/d.docKeySumCount + math.log(docList.documentList.__len__()/docList.key_Count[k])
print ('文章id :%s 关键字【%s】的TF-IDF值为:%s',d.docid ,k, d.docKeySet[k].TF_IDF)

  

TF-IDF算法——原理及实现的更多相关文章

  1. Elasticsearch由浅入深(十)搜索引擎:相关度评分 TF&IDF算法、doc value正排索引、解密query、fetch phrase原理、Bouncing Results问题、基于scoll技术滚动搜索大量数据

    相关度评分 TF&IDF算法 Elasticsearch的相关度评分(relevance score)算法采用的是term frequency/inverse document frequen ...

  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. 55.TF/IDF算法

    主要知识点: TF/IDF算法介绍 查看es计算_source的过程及各词条的分数 查看一个document是如何被匹配到的         一.算法介绍 relevance score算法,简单来说 ...

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

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

  6. 25.TF&IDF算法以及向量空间模型算法

    主要知识点: boolean model IF/IDF vector space model     一.boolean model     在es做各种搜索进行打分排序时,会先用boolean mo ...

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

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

  8. 基于TF/IDF的聚类算法原理

        一.TF/IDF描述单个term与特定document的相关性TF(Term Frequency): 表示一个term与某个document的相关性. 公式为这个term在document中出 ...

  9. 信息检索中的TF/IDF概念与算法的解释

    https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...

  10. 广告系统中weak-and算法原理及编码验证

    wand(weak and)算法基本思路 一般搜索的query比较短,但如果query比较长,如是一段文本,需要搜索相似的文本,这时候一般就需要wand算法,该算法在广告系统中有比较成熟的应 该,主要 ...

随机推荐

  1. CodeForces 1083 E The Fair Nut and Rectangles 斜率优化DP

    The Fair Nut and Rectangles 题意:有n个矩形,然后你可以选择k个矩形,选择一个矩形需要支付代价 ai, 问 总面积- 总支付代价 最大能是多少, 保证没有矩形套矩形. 题解 ...

  2. Spring boot 自定义 Resolver 支持 interface 类型参数

    在编写 RestController 层的代码时,由于数据实体类定义了接口及实现类,本着面向接口编程的原则,我使用了接口作为 RestController 方法的入参. 代码大致如下(省略具体业务部分 ...

  3. 271.已正确安装证书,但https显示连接不安全(此页面的部分内容不安全)

    1.问题描述 成功安装证书,但是显示连接不安全 此页面的部分内容(例如图像)不安全 如下图 2.问题原因 页面引用(含有)http资源的文件.图片.脚本 如:图片引自其他http资源的网站 我的是引自 ...

  4. Map.Entry 接口

    Map.Entry Map 接口下面的 Entry 接口. 该接口,定义一个键值对实体接口.Map.entrySet 方法返回的 Set 集合中的实体就是实现这个 它.只有一种方法可以获得 Map.E ...

  5. 【Redis】哨兵机制

    一.概述 什么是哨兵机制 二.环境配置 2.1 虚拟机 2.2 安装Redis 2.3 配置主从复制 2.4 配置哨兵 2.5 测试 2.6 疑惑(待解决) 一.概述 什么是哨兵机制 Redis的哨兵 ...

  6. debug 模式缓慢

    debug 模式启动服务器,然后在 breakopints下可以看到打的断点.清除全部重启服务器,问题解决.

  7. myslq5.7安装以及root密码找回

    一.mysql安装 创建用户和用户组: groupadd mysqluseradd -g mysql mysql -s /sbin/nologin 解压压缩文件并创建软链接 tar -xvf mysq ...

  8. Python入门基础:七段数码管绘制

    1.在学习Python的过程中,运用所学的一些基础知识,进行一些简单的编程,可以收获很多乐趣.在生活中,LED灯无处不在,荧幕显示的广告词,给我们呈现出动态的视觉效果.下面,则以最简单的显示日期为例, ...

  9. Webdriver元素定位的方法

    webdriver提供了8种元素定位方法: 1.id 2.name 3.tag name 4.class name 5.link text 6.partial link text 7.xpath 8. ...

  10. kafka入门配置

    问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行“随机读写”的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? ...