关于Zipf定律与TF—IDF的一个实践

在这篇文章中,我将通过机器学习中的线性回归来计算zipf定律中一个经验常数alpha,还会画TF-IDF的图像,此外还将简单介绍下与zipf、TF-IDF有关的知识。

在之前的一篇文章中我曾介绍过TF-IDF,但之后我又阅读了Ricardo Baeza-Yates和Berthier Ribeiro-Neto所写的《Modern Information Retrieval》,发现其中所讲述的有关IF-IDF部分的内容与我之前了解的有许多不同,所以便又写了这篇文章。

一、 Zipf定律

1.1 介绍

Zipf's Law 是一种经验观察到的语言现象,它最初是由语言学家 George Kingsley Zipf 在 20 世纪初提出的。虽然 Zipf's Law 主要在语言学领域被讨论,但它也在自然语言处理(Natural Language Processing, NLP)和信息检索(Information Retrieval, IR)等领域得到了广泛应用。在这些领域中,Zipf's Law 被用来研究词汇频率分布,并且在建模文本数据的统计特性方面发挥着重要作用。

1.2 概念

Zipf's Law 描述了词汇的使用频率与其在频率表中的排名之间的关系。按照 Zipf's Law,最常用的词汇出现频率最高,而随着词汇排名的降低,其出现频率也会迅速下降。

1.3 表达式

^{n_{i}}是索引项k_{i}的文档频率。对所有的索引项的文档频率按降序排列,并设n(r)是第r个项的文档频率,那么根据Zipf定律就会有:n(r) \sim r^{-\alpha }

其中,α是经验常数。

那么,我们就可以将之改写为:n(r)=Cr^{-\alpha }

其中的C同样是经验常数。在英语中可以用α=1来提供一种简单的近似,而在中文里,本篇文章正是要去计算它。

在我们先取α等于1等情况下,我们可以对等式左右同时取log,变形为:

logn(r)=logC-logr

其中的log都是以2为底。

在之后还可以变形,这样就得到了IDF的公式:

IDF_{i}=log\frac{N}{n_{i}}

其中的IDFi称为索引项ki的反比文档频率。(关于TF的表达式一会再说)

1.4 python计算

接下来,我就将用python的线性回归模型来计算α在中文中的大小,注意,因为我引用的是一个kaggle中的一个数据集,其规模很大,所以我只在代码中对其进行切片,并只取用一小部分来计算。代码如下:

import jieba
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer'''文本预处理&停用词库'''
data_normal = pd.read_csv(r"C:\Users\20349\Desktop\ArtificialIntelligence\data_set\dataset\chinese_news.csv")
data = data_normal.iloc[:500]
data.dropna(inplace=True)# 删除有缺失值的行
N = len(data)
# 停用词库
with open(r"C:\Users\20349\Desktop\ArtificialIntelligence\wordCloud\stopWords.txt", 'r', encoding='utf-8') as swfile:stopwords = set(line.strip() for line in swfile)
# 文本预处理函数
def preprocess_text(text,stopwords):words = jieba.lcut(text)after_word = [w for w in words if w not in stopwords]# 处理后return ''.join(after_word)
data = data.copy()
for i in range(1,N):data.iloc[i,-1] = preprocess_text(data.iloc[i,-1],stopwords)'''计算alpha'''
word_str = ''.join(data.iloc[:,-1])
word_ls = list(jieba.cut(word_str))
# 统计词频
word_freq_dict = {word: word_ls.count(word) for word in set(word_ls)}
word_freq_df = pd.DataFrame(list(word_freq_dict.items()), columns=['word', 'frequency'])
# 排序
word_freq_df.sort_values(by='frequency', ascending=False, inplace=True)
# 排名与频率
rank = np.arange(1, len(word_freq_df) + 1)
freq = word_freq_df['frequency'].values
# log
log_rank = np.log(rank)
log_freq = np.log(freq)
# 线性回归
model = LinearRegression()
log_rank = log_rank.reshape(-1, 1)  # 转换为二维数组
model.fit(log_rank, log_freq)
# 计算
alpha = -model.coef_[0]
print("Alpha(α) is:{}".format(alpha))

那么,最后输出的α值是这样的:Alpha(α) is:0.9978112574757174

(关于我引用的文本数据集所在的url如下:新闻联播(Chinese official daily news) (kaggle.com))

1.5 代码解释

然后是关于代码的一个解释。

我先给出流程图:

可以看见代码分为两部分,一部分是停用词库的文本预处理,一部分是α的计算,关于预处理方面,我们要做的就是单独拿出每一项中的文本内容然后用jieba函数库的函数进行分词处理并将存在于停用词库中的词语直接忽略,将其余部分再重新组合成字符串写入即可;而在α的计算方面,我们需要获得排序于频率,但此时式子是相除的形式,无法引用线性回归的模型,所以我们需要log化,这样就变为相加的形式了,如此带入模型即可求得结果。

二、 TF-IDF

2.1 概念

TF-IDF(Term Frequency-Inverse Document Frequency)是一种在信息检索与数据挖掘领域中广泛使用的统计方法,用于评估一个词在一个文档或语料库中的重要程度。TF-IDF是两个独立度量的乘积:词频(TF)和逆文档频率(IDF)。

2.2 TF

TF是指词频,意思是某个词在文档中出现的次数。一个词出现得越多,通常意味着它对文档内容越重要。然而,一些非常常见的词汇(如“的”、“是”等)可能频繁出现,但并不具有多少实际意义。因此,词频只是一个局部指标,并不能单独决定一个词的重要性。

其表达式如下:

tf_{i}=\left\{\begin{matrix} 1& + & logf_{i,j}&f_{i,j} >0\\ 0 & & & other \end{matrix}\right.

2.3 IDF

IDF是指逆文档频率,逆文档频率是一个全局性的度量,它考虑了整个文档集或者语料库的情况。一个词如果在整个文档集合中出现的频次越多,那么该词的IDF就越低;反之则越高。通过这种方式,可以降低常见词汇的影响,增加独特或罕见词汇的重要性。

其表达式在刚才Zipf中已经推出。

2.4 TF-IDF

最流行的权重公式就是将IDF因素于词频结合起来的权重计算方法,公式如下:

w_{i,j}=\left\{\begin{matrix} (1 &+ &logf_{i,j} ) &* & log\frac{N}{n_{i}} & f_{i,j}>0\\ 0& & & & & otherwise \end{matrix}\right.

2.5 python计算

代码如下:

# 计算IDF
IDF = {}
for key in total_words_freq.keys():IDF[key] = 0times = 0for i in range(N):if key in contentList[i]:times += 1idf_value = log(N / times, 2)IDF[key] = idf_value# 计算TF-IDF
tf_list = []
idf_list = []
tfidf = []
word_indices = []
number = 1
for key, value in sorted_TF.items():tf_list.append(value)idf_list.append(IDF[key])tfidf.append(value * IDF[key])word_indices.append(number)number += 1# 绘制TF和IDF散点图
X = [log(i+1, 10) for i in range(len(sorted_TF))]
x_index = [0, 1, 2, 3, 4, 5]
labels = [1, 10, 100, 1000, 10000, 100000]plt.figure()
plt.scatter(X, tf_list, color='red', marker='+', label='TF')
plt.scatter(X, idf_list, color='blue', marker='x', label='IDF')
plt.xticks(x_index, labels)
plt.xlabel("Log Word Number")
plt.ylabel("TF or IDF")
plt.legend()
plt.show()# 绘制TF-IDF图
plt.figure()
plt.scatter(X, tfidf, color='black', marker='+', label='TF-IDF')
plt.xticks(x_index, labels)
plt.xlabel("Log Word Number")
plt.ylabel("TF-IDF")
plt.legend()
plt.show()

代码所绘制出的图像为:

 

这两幅图像与书中所给出的用《Wall Street Journal》的文档集绘制的图像极为相似,不过应该是我的数据量远远小于书中这个华尔街日报的数据量的缘故,我的图像略显杂乱,有许多异常的数据点。

此上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439765.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PELT算法

PELT算法的范畴 PELT算法(Pruned Exact Linear Time)属于时间序列分析和变点检测(Change Point Detection)范畴的算法。 从更广泛的角度来看,PELT算法还可以归类为以下几类算法的子集: 1. 时间序列分析&…

【数据结构】什么是红黑树(Red Black Tree)?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌红黑树的概念 📌红黑树的操作 🎏红黑树的插入操作 🎏红黑树的删除操作 结语 📌红黑树的概念 我们之前学过了…

codetop标签树刷题(四)!!暴打面试官!!!!

用于个人复习 1.二叉树的右视图2.二叉树最大宽度3.二叉树的最大深度4.N叉树的最大深度5.二叉树的最小深度6.子树的最大平均值7.求根节点到叶节点的数字之和8.另一棵树的子树9.对称二叉树 1.二叉树的右视图 给定一个二叉树的根节点root,想象自己站在它的右侧&#x…

TypeScript 封装 Axios 1.7.7

随着Axios版本的不同,类型也在改变,以后怎么写类型? yarn add axios1. 封装Axios 将Axios封装成一个类,同时重新封装request方法 重新封装request有几个好处: 所有的请求将从我们定义的requet请求中发送&#xff…

setTimeout,setInterval ,requestAnimationFrame定时器

setTimeout,setInterval ,requestAnimationFrame定时器 定时器函数通常用于执行定时任务,也就是说你做了一个功能放在定时器函数里,它可以在特定的时间去执行你的指令,或者说隔多长时间(单位时间内—毫秒为…

Centos Stream 9备份与恢复、实体小主机安装PVE系统、PVE安装Centos Stream 9

最近折腾小主机,搭建项目环境,记录相关步骤 数据无价,丢失难复 1. Centos Stream 9备份与恢复 1.1 系统备份 root权限用户执行进入根目录: cd /第一种方式备份命令: tar cvpzf backup.tgz / --exclude/proc --exclu…

计算机系统基础概述

什么是计算机? 计算机是一种利用电子技术进行信息处理的设备,它能够接收、存储、处理和提供数据。计算机通过执行一系列预定义的指令来处理数据,这些指令通常被称为程序。计算机的核心功能包括算术运算、逻辑判断、数据存储和信息检索 计算…

STM32 通用定时器

一、概述 STM32内部集成了多个定时/计数器,根据型号不同,STM32系列芯片最多包含8个定时/计数器。其中,TIM6、TIM7为基本定时器,TIM2~TIM5为通用定时器,TIM1、TIM8为高级控制定时器。 1.定时器的类型 基本定时器通用定…

微信小程序-npm支持-如何使用npm包

文章目录 1、在内建终端中打开2、npm init -y3、Vant Weapp4、通过 npm 安装5、构建 npm 1、在内建终端中打开 Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。尝试新的跨平台 PowerShell https://aka.ms/pscore6PS C:\Users\dgq\WeChatProjects\minip…

python泵站设备运行预警信息管理系统

目录 功能介绍具体实现截图技术栈和环境说明python语言解决的思路性能/安全/负载方面核心代码部分展示详细视频演示源码获取方式 功能介绍 用户端 注册登录:用户可以注册账号并登录系统。 西电泵站简介:提供泵站的历史、功能和重要性等详细介绍。 泵站…

余承东直播论道智能驾驶:激光雷达不可或缺,华为ADS 3.0引领安全创新

华为余承东:激光雷达,智能驾驶安全性的关键 9月29日,华为消费者业务集团CEO余承东在一场引人注目的直播中,与知名主持人马东就智能驾驶技术的最新进展进行了深入交流。在这场直播中,余承东针对激光雷达在智能驾驶中的必要性问题,发表了明确且深刻的观点,引发了业界和公众…

在Docker中运行微服务注册中心Eureka

1、Docker简介: 作为开发者,经常遇到一个头大的问题:“在我机器上能运行”。而将SpringCloud微服务运行在Docker容器中,避免了因环境差异带来的兼容性问题,能够有效的解决此类问题。 通过Docker,开发者可…

角色动画——RootMotion全解

1. Unity(2022)的应用 由Animtor组件控制 在Animation Clip下可进行详细设置 ​ 官方文档的介绍(Animation选项卡 - Unity 手册) 上述动画类型在Rag选项卡中设置: Rig 选项卡上的设置定义了 Unity 如何将变形体映射到导入模型中的网格,以便能够将其动画化。 对于人…

Linux驱动开发——LED驱动开发

文章目录 1 概述1.1 说明 2 基础知识2.1 地址映射2.1.1 ioremap函数2.1.2 iounmap函数 2.2 I/O内存访问函数2.2.1 读操作函数2.2.2 写操作函数 3 硬件原理图分析4 RK3568 GPIO驱动原理4.1 引脚复用设置4.2 引脚驱动能力配置4.3 GPIO输入输出设置4.4 GPIO引脚高低电平设置 5 实验…

【GeekBand】C++设计模式笔记5_Observer_观察者模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

HarmonyOS/OpenHarmony 自定义弹窗页面级层级控制解决方案

关键词:CuntomDialog自定义弹窗、SubWindow子窗口、页面级、弹窗层级控制、鸿蒙、弹窗展示层级异常 问题存在API版本:API10 - API12(该问题已反馈,期望后续官方能增加页面级控制能力) 在正常的鸿蒙app开发过程中&…

aws(学习笔记第二课) AWS SDK(node js)

aws(学习笔记第二课) 使用AWS SDK(node js) 学习内容: 使用AWS SDK(node js) 1. AWS SDK(node js) AWS支持多种SDK开发(除了AWS CLI,还支持其他的SDK) AndroidPythonNode.js(Javas…

约数个数约数之和

好久没发文章了.......不过粉丝还是一个没少...... 今天来看两道超级恶心的数论题目! No.1 约数个数 No.2 约数之和 先来看第一道:约数个数 题目描述 给定 n 个正整数 ai​,请你输出这些数的乘积的约数个数,答案对 10^97 取模 输入格式 第一行包含…

五种IO模型与阻塞IO

一、前言 在网络中通信的本质其实是网络中的两台主机的进程间进行通信,而进程通信的本质就是IO。 IO分为输入(input)和输出(output)站在进程的角度讲,进程出去数据为输出,外部数据进入进程为输…

YOLOv8 基于NCNN的安卓部署

YOLOv8 NCNN安卓部署 前两节我们依次介绍了基于YOLOv8的剪枝和蒸馏 本节将上一节得到的蒸馏模型导出NCNN,并部署到安卓。 NCNN 导出 YOLOv8项目中提供了NCNN导出的接口,但是这个模型放到ncnn-android-yolov8项目中你会发现更换模型后app会闪退。原因…