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

news2024/10/6 12:57:46

在这篇文章中,我将通过机器学习中的线性回归来计算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] = 0
    times = 0
    for i in range(N):
        if key in contentList[i]:
            times += 1
    idf_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.coloradmin.cn/o/2191932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程

先上目录思维导图👇 大家好,我是程普。 前段时间,我发布了第一个出海产品 PH Copilot,是一个基于 Plasmo 开发的 Chrome 插件和 Next.js 开发的落地页与服务端的全栈产品。 现在我把这个产品的完整实现写成系统性教程&#xff0…

强化学习笔记之【Q-learning算法和DQN算法】

强化学习笔记(一)——Q-learning和DQN算法核心公式 文章目录 强化学习笔记(一)——Q-learning和DQN算法核心公式前言:Q-learning算法DQN算法 前言: 强化学习领域,繁冗复杂的大段代码里面&#…

华为平板与非华为电脑多屏协同及Bug处理

本文参考B站空降猫咪、鱼翅2002、知乎奔跑的小牛、夏风微微等博主。 电脑版本型号:拯救者Y7000,核显3050Ti,无集成显卡 平板版本型号:华为matepad pro解决办法: 下载空降猫咪的安装器PCManagerInstaller_20230801 CSDN下载链接 …

Redis中BitMap实现签到与统计连续签到功能

服务层代码 //签到Overridepublic Result sign() {//1.获取当前登录的用户Long userId UserHolder.getUser().getId();//获取日期LocalDateTime now LocalDateTime.now();//拼接keyString keySuffix now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String …

网页打不开、找不到服务器IP地址

现象:网络连接ok,软件能正常使用,当网页打不开。 原因:DNS 配置错误导致网站域名无法正确解析造成。 影响DNS设置的:VPN软件、浏览器DNS服务选择、IPv4属性被修改。 1、VPN代理未关闭 2、浏览器DNS解析选择 3、以太…

华为eNSP:端口隔离

一,什么是端口隔离 端口隔离是一种网络配置技术,用于将不同的网络设备或用户隔离在不同的虚拟局域网(VLAN)中,以实现网络流量的隔离和安全性提升。通过在交换机或路由器上配置端口隔离,可以将连接到同一设…

原来大模型训练实战,是需要这些项目!!

去年侧重大模型和GPT的原理,今年就侧重项目实战了。找到的这个合集不仅收集了大模型训练实战,还有微调实战,分布式训练,真的很全。 下面汇总了我在大模型实践中训练相关的所有教程。从6B到65B,从全量微调到高效微调(L…

【AIGC】2021-arXiv-LoRA:大型语言模型的低秩自适应

2021-arXiv-LoRA: Low-Rank Adaptation of Large Language Models LoRA:大型语言模型的低秩自适应摘要1. 引言2. 问题陈述3. 现有的解决方案还不够好吗?4. 我们的方法4.1 低秩参数化更新矩阵4.2 将 LORA 应用于 Transformer 5. 实证实验5.1 基线5.2 ROBE…

常用组件详解(十):保存与加载模型、检查点机制的使用

文章目录 1.保存、加载模型2.torch.nn.Module.state_dict()2.1基本使用2.2保存和加载状态字典 3.创建Checkpoint3.1基本使用3.2完整案例 1.保存、加载模型 torch.save()用于保存一个序列化对象到磁盘上,该序列化对象可以是任何类型的对象,包括模型、张量…

C++基础(10)——初识vector

目录 1.vector 2.vector的使用 2.1vector的定义 2.2vector迭代器的使用 2.2.1begin和end 2.2.2rbegin和rend 2.3增删查改 2.3.1pop_back和push_back 2.3.2inset和erase 2.3.3find函数 2.3.4swap函数 2.3.5元素访问 2.4空间函数 2.4.1size和capacity 2.4.2reserv…

用HTML5+CSS+JavaScript庆祝国庆

用HTML5CSSJavaScript庆祝国庆 中华人民共和国的国庆日是每年的10月1日。 1949年10月1日,中华人民共和国中央人民政府成立,在首都北京天安门广场举行了开国大典,中央人民政府主席毛泽东庄严宣告中华人民共和国成立,并亲手升起了…

茴香豆 + Qwen-7B-Chat-Int8

今天 打开config.ini 发现 茴香豆 支持 qwen/qwen-7b-chat-int8 1.0 拉取qwen/qwen-7b-chat-int8 cd /root/modelsgit clone https://gitee.com/hf-models/Qwen-7B-Chat-Int8.git 1.1 更改配置文件 茴香豆的所有功能开启和模型切换都可以通过 config.ini 文件进行修改 /roo…

【JAVA开源】基于Vue和SpringBoot的洗衣店订单管理系统

本文项目编号 T 068 ,文末自助获取源码 \color{red}{T068,文末自助获取源码} T068,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 顾…

Leetcode—200. 岛屿数量【中等】

2024每日刷题&#xff08;176&#xff09; Leetcode—200. 岛屿数量 C实现代码 class Solution { public:int numIslands(vector<vector<char>>& grid) {int m grid.size();int n grid[0].size();int ans 0;function<void(int, int)> dfs [&](…

企业架构TOGAF的理论指南:数字化转型中的企业架构实践

在当今全球市场的快速变革中&#xff0c;企业的数字化转型已经成为不可避免的趋势。无论是为了提高效率、增强竞争力&#xff0c;还是为了应对技术变革的挑战&#xff0c;企业都需要一个强有力的架构框架来指导其转型。TOGAF&#xff08;The Open Group Architecture Framework…

pytorch版本和cuda版本不匹配问题

文章目录 &#x1f315;问题&#xff1a;Python11.8安装pytorch11.3失败&#x1f315;CUDA版本和pytorch版本的关系&#x1f315;安装Pytorch2.0.0&#x1f319;pip方法&#x1f319;cuda方法 &#x1f315;问题&#xff1a;Python11.8安装pytorch11.3失败 &#x1f315;CUDA版…

【CSS Tricks】试试新思路去处理文本超出情况

目录 引言一、常规套路1. 单行文本省略2. 多行文本省略 二、新思路美化一下1. 单行/多行文本隐藏2. 看下效果 三、总结 引言 本篇为css的一个小技巧 文本溢出问题是一个较为常见的场景。UI设计稿为了整体的美观度会将文本内容限制到一定范围内&#xff0c;然而UI设计阶段并不能…

智慧学生宿舍管理平台|学生宿舍管理平台系统|基于Springboot+VUE的智慧学生宿舍管理平台系统设计与实现(源码+数据库+文档)

智慧学生宿舍管理平台 目录 基于SpringbootVUE的智慧学生宿舍管理平台系统设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕…

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

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

STM32F407 HAL库定时器触发ADC采集与DMA数据传输(定时器TIM+ADC+DMA)

在STM32F407系列微控制器的开发中&#xff0c;结合定时器、ADC&#xff08;模数转换器&#xff09;与DMA&#xff08;直接存储器访问&#xff09;控制器&#xff0c;能够显著提升数据采集与传输的效率。本文将指导你如何使用STM32 HAL库&#xff0c;通过定时器触发ADC1的单通道…