首页 > 编程语言 >TF-IDF算法

TF-IDF算法

时间:2024-05-30 15:00:54浏览次数:23  
标签:word list IDF 算法 dict words TF

TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)

TF-IDF本质上是一种统计方法,用来评估一个词/token在整个语料库中当前文档中的重要程度,字词的重要性随着它在当前文档中出现的频率成正比增加,随着它在整个语料库中出现的频率成反比降低。

主要思想:某个单词在当前文章中出现的次数越多,并且在其他文章中出现的次数越少,则说明该词是当前文档的一个关键词,对于当前文档具有较好的类别区分能力,适合用来分类。

1)TF(Term Frequency)  词频

这个数字通常会被归一化(一般是词频除以文章总词数,也可以是这篇文章中出现最多的词的出现次数),以防止它偏向长的文件。

2)IDF(Inverse Document Frequency) 逆向文件频率

IDF是针对某一特定词语进行计算,可以由总文件数目除以包含该词语的文件的数目再将得到的商取对数得到

如果包含该特定词语的文档越少, IDF越大,则说明词条具有很好的类别区分能力。

 

3)计算TF-IDF

4)TF-IDF的用法

  • 文档关键词提取

  • 文档信息检索

 5)TF-IDF的优缺点

优点:简单快速,结果比较符合实际情况

缺点:1.没有考虑关键词的位置信息,词语出现在文档不同位置,贡献度是不一样的(首行和末行权重应更大);2.生僻词的idf会高;不够全面,有些关键的人名、地名提取效果不好

import math
# 建立一个语料库
corpus = [
    "what is the weather like today",    
    "what is for dinner tonight",    
    "this is a question worth pondering",    
    "it is a beautiful day today"
]
# 进行分词,去停用词
# 如果有自定义的停用词典,我们可以用下列方法来分词并去掉停用词
words = []
f = ["is", "the"]
for i in corpus:
    all_words = i.split()
    new_words = []
    for j in all_words:
        if j not in f:
            new_words.append(j)
    words.append(new_words)
print(words)

# 计算词频TF
TF_list = []
def counter_Tf(words):
  for i in words:
    temp = []
    all_words = len(i)
    for word in i:
        temp.append(i.count(word)/all_words)
    TF_list.append(temp)
  return TF_list
counter_Tf(words)
print(TF_list)



# 计算IDF
word_dict = {}
def counter_Word_IDF(words):
  for i in words:
    for word in i:
      if word in word_dict:
        word_dict[word] += 1
      else:
        word_dict[word] = 0
  return word_dict

IDF_list = []
def counter_Tf(words):
  all_words = len(words)
  for i in words:
    temp = []
    for word in i:
        temp.append(math.log(all_words/(1+word_dict[word])))
    IDF_list.append(temp)
  return IDF_list
counter_Word_IDF(words)
counter_Tf(words)
print(IDF_list)
# 计算TF-IDF
TF_IDF = TF*IDF

 

 

import math # 建立一个语料库 corpus = [     "what is the weather like today",         "what is for dinner tonight",         "this is a question worth pondering",         "it is a beautiful day today" ] # 进行分词,去停用词 # 如果有自定义的停用词典,我们可以用下列方法来分词并去掉停用词 words = [] f = ["is", "the"] for i in corpus:     all_words = i.split()     new_words = []     for j in all_words:         if j not in f:             new_words.append(j)     words.append(new_words) print(words)
# 计算词频TF TF_list = [] def counter_Tf(words):   for i in words:     temp = []     all_words = len(i)     for word in i:         temp.append(i.count(word)/all_words)     TF_list.append(temp)   return TF_list counter_Tf(words) print(TF_list)


# 计算IDF word_dict = {} def counter_Word_IDF(words):   for i in words:     for word in i:       if word in word_dict:         word_dict[word] += 1       else:         word_dict[word] = 0   return word_dict
IDF_list = [] def counter_Tf(words):   all_words = len(words)   for i in words:     temp = []     for word in i:         temp.append(math.log(all_words/(1+word_dict[word])))     IDF_list.append(temp)   return IDF_list counter_Word_IDF(words) counter_Tf(words) print(IDF_list) # 计算TF-IDF TF_IDF = TF*IDF

标签:word,list,IDF,算法,dict,words,TF
From: https://www.cnblogs.com/Revelation/p/18222358

相关文章

  • 编程奇境:C++之旅,从新手村到ACM/OI算法竞赛大门(基础语法)
    踏入C++王国的神秘之门,首要任务是装备上基础语法这把万能钥匙,它不仅是你与代码世界对话的初级咒语,更是构筑编程魔法塔的基石。想象自己是一位即将踏上征途的勇士,先要学会站立、行走,方能奔跑、飞跃。基础语法:勇者的起跑线顺序结构:这就像是一场精心策划的冒险,你的每一个指令—......
  • 自己实现dubbo参数校验(类似RestFul 参数校验)
    1.场景:因为工作中经常需要做参数校验,在springboot项目中使用@Valid+@NotNull、@NotBlank…注解开发API接口非常丝滑,相反在开发RPC接口时却还是需要编写大量的参数判断,严重影响主业务流程的开发(公司目前用的是Dubbo2.7.2)且代码整洁度、风格都受到了挑战。基于以上原因萌生了写一......
  • react+three.js导入外部gltf格式
    我把gltf文件放在了public/static下面了。其他地方还没适用。因为之前想导入obj一直没成功,就跟着官网和各种例子成功导入了gltf格式的然后其他的没啥。看代码吧。大部分我都写了备注components组件importReact,{useEffect,useRef}from"react";import*asTHREE......
  • 基于 MATLAB 的麻雀算法 (SSA) 优化注意力机制卷积神经网络结合门控循环单元 (SSA-Att
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)基于MATLAB的麻雀算法(SSA)优化注意力机制卷积神经网络结合门控循环单元......
  • Tron_CTF2024新生赛 WEB
    web业余憨憨简单复现一下,不过有两题环境挂了s1mple_php题目easy我的解答:源码:<?phphighlight_file(__FILE__);include("flag.php");$c=$_POST['c'];$v=$_GET['v'];$e=$_GET['e'];if(isset($_GET['v'])andisset($_GET['......
  • 算法课程笔记——快速幂
    算法课程笔记——快速幂......
  • 常见的算法题
    冒泡排序privatestaticint[]queryArr(int[]arr1){intlen=arr1.length;if(len==0||len==1){returnarr1;}        for(inti=0;i<len;i++){            for(intj=0,lenArr=len-1-i;j<lenArr;j++){    ......
  • 基于Matlab OMP和KSVD算法的彩色图像修复
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在数字图像处理领域,图像修复技术一直是一个重要的研究方向。彩色图像修复旨在恢复图像中由于各种原因(如划......
  • 十四.吊打面试官系列-JVM优化-JVM垃圾回算法详解
    前言说到JVM不可避免的会聊到垃圾回收器,(GarbageCollection,简称GC)。它负责跟踪哪些对象仍然在使用,哪些对象已经不再被引用,并释放那些不再被引用的对象所占用的内存空间。这一过程涉及到对象的标记、清除、压缩等多个阶段,每个阶段都有其特定的算法和策略。随着Java技术的不......
  • 尽管依赖行者未找到任何缺失的依赖项,但在尝试使用 Ctypes 加载 DLL 时仍出现 FileNotF
    答案:设置winmode=0我是第一次使用ctypes,因此在尝试真正实现它之前先玩了一下。但是,我无法使用ctypes.CDLL()加载我编译的DLL,因为它会抛出FileNotFoundError。这是完整的错误信息:FileNotFoundError:无法找到模块'E:\absolute\path\to.dll'(或其依赖项之一)。请尝试使用带有构......