《NLP自然语言处理》—— 关键字提取之TF-IDF算法

2024-08-31 09:44

本文主要是介绍《NLP自然语言处理》—— 关键字提取之TF-IDF算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、TF-IDF算法介绍
  • 二、举例说明
  • 三、示例:代码实现
  • 四、总结

一、TF-IDF算法介绍

  • TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于信息检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。词语的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为这个词或者短语具有很好的类别区分能力,适合用来分类。
  • TF(Term Frequency,词频)
    • 词频(TF)指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
    • 计算公式如下:
      在这里插入图片描述
  • IDF(Inverse Document Frequency,逆文档频率)
    • 逆文档频率(IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。如果包含词条t的文档越少,IDF越大,则说明词条t具有很好的类别区分能力。
    • 计算公式如下:
      在这里插入图片描述
    • +1是为了避免包含该词的文档数为0的时候,分子为0的情况发生
  • TF-IDF的计算公式
    在这里插入图片描述

二、举例说明

  • 假设有一篇名为《中国的蜜蜂养殖》文章,假定该文长度为1000个词,“中国”、“蜜蜂”、养殖"各出现20次,则这三个词的"词频”(TF)都为0.02。

  • 然后,搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数(语料库的文档总数)。包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张

  • 则通过计算公式可以得到它们的逆文档频率(IDF)和TF-IDF如下:

    \包含该词的文档数(亿)IDFTFTF-IDF
    中国62.30.6030.020.0121
    蜜蜂0.4842.7130.020.0543
    养殖0.9732.4100.020.0482

三、示例:代码实现

  • TfidfVectorizer() 是 sklearn 库中用于将文本集合转换为 TF-IDF 特征矩阵的一个类。

  • TfidfVectorizer 类有许多参数,但以下是一些最常用的:

    • input: 指定输入数据的格式,可以是 ‘filename’、‘file’ 或 ‘string’。默认为 ‘content’,这意味着输入应该是字符串列表或字符串的生成器。
    • max_df: 指定词或短语的文档频率(DF)的上限。高于此值的词或短语将被忽略。这有助于去除一些太常见的词(如停用词)。
    • min_df: 指定词或短语的文档频率(DF)的下限。低于此值的词或短语将被忽略。这有助于去除一些非常罕见的词。
    • max_features: 指定要保留的词的最大数量(基于文档频率)。这有助于减少特征空间的维度。
    • ngram_range: 一个元组 (min_n, max_n),用于指定不同 n 值对应的 n-grams 的范围。例如,(1, 1) 表示单词(unigrams),(1, 2) 表示单词和二元组(bigrams)。
    • stop_words: 一个字符串列表,包含要忽略的停用词。可以是一个预定义的列表,如 - ‘english’,也可以是一个自定义的列表。
    • lowercase: 布尔值,指定是否将所有文本转换为小写。默认为 True。
    • use_idf: 布尔值,指定是否使用 IDF(逆文档频率)重新加权。默认为 True。
    • smooth_idf: 布尔值,指定在计算 IDF 时是否应用平滑(添加 1 到文档频率,以避免除以零)。默认为 True。
  • 主要方法

    • fit(X, y=None): 计算词汇表的词汇IDF值。
    • fit_transform(X, y=None): 拟合模型并转换 X。
    • transform(X): 将 X 转换为 TF-IDF 特征矩阵。
    • get_feature_names_out(): 返回词汇表中所有特征的名称
  • 示例

    from sklearn.feature_extraction.text import TfidfVectorizer  # 示例文本
    """
    corpus代表整个语料库,其中的每一句,代表一个文档
    """  
    corpus = [  'This is the first document.',  'This document is the second document.',  'And this is the third one.',  'Is this the first document?',  
    ]  # 创建 TF-IDF 向量化器  
    vectorizer = TfidfVectorizer()  # 拟合和转换数据  
    X = vectorizer.fit_transform(corpus)  # 获取特征名称(词汇)  
    feature_names = vectorizer.get_feature_names_out()  # 将 TF-IDF 矩阵转换为 DataFrame,可以清楚的看出每个词汇的TF-IDF值
    import pandas as pd  
    df = pd.DataFrame(X.toarray(), columns=feature_names)  
    print(df)
    
    • 由于输出面板中看不全结果,我们可以在调试模式中打开我们想要查看的内容
    • 我们可以查看这个语料库中一共有多少个特征词汇,注意这里每个词汇的前后顺序是根据26个英文字母的顺序进行排序的
      在这里插入图片描述
      在这里插入图片描述
    • 通过上图中的结果,我们可以直观的看到每篇文档中每个特征词汇的TF-IDF值,并且可以选出每篇文档中TF-IDF值最高的,作为关键词汇

四、总结

  • TF-IDF的优缺点
    • 优点:

      • 简单有效,易于实现。
      • 可以在不同长度的文档上进行比较。
      • 考虑了词语的普遍重要性(IDF)。
    • 缺点:

      • 没有考虑词语的语义信息,例如同义词和多义词。
      • 对于小数据集可能效果不佳,因为IDF的计算依赖于大量的文档。
      • 没有考虑词语的位置信息,如标题、段落等。
  • 总的来说,TF-IDF是一种简单而强大的文本特征提取方法,在许多自然语言处理任务中都有广泛的应用。然而,对于需要更深入理解文本语义的任务,可能需要结合其他更复杂的自然语言处理技术。

这篇关于《NLP自然语言处理》—— 关键字提取之TF-IDF算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123547

相关文章

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python使用date模块进行日期处理的终极指南

《Python使用date模块进行日期处理的终极指南》在处理与时间相关的数据时,Python的date模块是开发者最趁手的工具之一,本文将用通俗的语言,结合真实案例,带您掌握date模块的六大核心功能... 目录引言一、date模块的核心功能1.1 日期表示1.2 日期计算1.3 日期比较二、六大常用方法详

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir