当前位置: 首页 > news >正文

NLP基础——TF-IDF

TF-IDF

TF-IDF全称为“Term Frequency-Inverse Document Frequency”,是一种用于信息检索与文本挖掘的常用加权技术。该方法用于评估一个词语(word)对于一个文件集(document)或一个语料库中的其中一份文件的重要程度。它是一种计算单词在文档集合中的分布情况的统计方法。

TF(Term Frequency,词频)

TF指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)进行归一化(通常是文档中单词总数),以防止它偏向长的文件。(即某个单词在文章中出现次数越多,其TF值也就越大)

TF的公式如下:
T F ( t , d ) = 在文档 d 中 t 出现的次数 文档 d 中所有字词数量 TF(t, d) = \frac{在文档d中t出现的次数}{文档d中所有字词数量} TF(t,d)=文档d中所有字词数量在文档dt出现的次数

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

IDF指的是一个特定单词有多少重要性。这需要通过整个语料库来评估每个单词提供多少信息:如果只有少数几篇文章使用了它,则认为它提供了很多信息。(即包含某个单纯越少,IDF值就越大)

IDF的公式如下:

I D F ( t , D ) = log ⁡ 总文档数量 包含 t ( 且不为 0 ) 的文档数量 IDF(t, D) = \log\frac{总文档数量}{包含t(且不为0) 的文档数量} IDF(t,D)=log包含t(且不为0)的文档数量总文档数量

然后将TF和IDF相乘得到一个单词在某一特定文件里面相对其他所有文件更加独特重要性评分:
T F I D F ( t , d , D ) = T F ( t , d ) × I D F ( t , D ) TFIDF(t, d, D) = TF(t, d) × IDF(t, D) TFIDF(t,d,D)=TF(t,d)×IDF(t,D)
其中:

  • ( t ): 单次(term)
  • ( d ): 文档(document)
  • ( D ): 语料库(corpus)

最终结果称为TF-IDF权重,高权重表示该术语对当前文章非常具有代表性。

举例来说,在搜索引擎优化(SEO)领域内,可以利用TF-IDF来确定哪些关键字对网页内容更加重要,并据此调整网页以便获得更好地搜索排名。

Python实现-sklearn

在Python中,可以使用scikit-learn库来实现TF-IDF的计算。以下是一个简单的示例:

from sklearn.feature_extraction.text import TfidfVectorizer# 示例文档集合
documents = ['The sky is blue.','The sun is bright.','The sun in the sky is bright.','We can see the shining sun, the bright sun.'
]# 初始化一个TFIDF Vectorizer对象
tfidf_vectorizer = TfidfVectorizer()# 对文档进行拟合并转换成特征向量
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)# 获取每个词汇在语料库中的词频-IDF权重值
feature_names = tfidf_vectorizer.get_feature_names_out()# 打印出每个词汇及其对应的IDF值(按照递增顺序)
for word in feature_names:print(f"{word}: {tfidf_vectorizer.idf_[tfidf_vectorizer.vocabulary_[word]]}")# 查看结果:第一个文档与所有特征名字对应的TF-IDF分数(稀疏矩阵表示)
print(tfidf_matrix[0])# 如果需要查看非稀疏版本,则需要转换为数组形式:
print(tfidf_matrix.toarray()[0])

这段代码首先导入了必要的类 TfidfVectorizer 并创建了一个实例。之后用这个实例去“学习”传入文本数据集合中所有单词的IDF值,并将每篇文章转换为TF-IDF特征向量。

最后两句打印输出了第一篇文章与全部特征(即单词)之间对应关系上各自的TF-IDF分数。由于大多数单词在大部分文件中并不会出现,因此 TfidfVectorizer 返回一个稀疏矩阵。

Python实现

不用依赖包,用math实现,代码如下:

import math# 示例文档集合
documents = ['The sky is blue.','The sun is bright.','The sun in the sky is bright.','We can see the shining sun, the bright sun.'
]# 用于分词和预处理文本(例如:转小写、去除标点)
def preprocess(document):return document.lower().replace('.', '').split()# 计算某个词在文档中出现的次数
def term_frequency(term, tokenized_document):return tokenized_document.count(term)# 计算包含某个词的文档数目
def document_containing_word(word, tokenized_documents):count = 0for document in tokenized_documents:if word in document:count += 1return count# 计算逆向文件频率(Inverse Document Frequency)
def inverse_document_frequency(word, tokenized_documents):num_docs_with_word = document_containing_word(word, tokenized_documents)# 加1防止分母为0,对结果取对数以平滑数据。# 使用len(tokenized_documents)而不是实际文档数量以避免除以零。# 这里使用了log10,但也可以使用自然对数ln(即log e)。if num_docs_with_word > 0:  return math.log10(len(tokenized_documents) / num_docs_with_word)else:return 0tokenized_documents = [preprocess(doc) for doc in documents]
vocabulary = set(sum(tokenized_documents, []))tfidf_matrix = []for doc in tokenized_documents:tfidf_vector = []for term in vocabulary:tf_idf_score=term_frequency(term, doc)*inverse_document_frequency(term,tokenized_documents)tfidf_vector.append(tf_idf_score)tfidf_matrix.append(tfidf_vector)print("TF-IDF Matrix:")
for row in tfidf_matrix:print(row)
http://www.lryc.cn/news/274279.html

相关文章:

  • kubernetes(四)
  • 安科瑞变电站综合自动化系统在青岛海洋科技园应用——安科瑞 顾烊宇
  • 紫光展锐5G扬帆出海 | 欧洲积极拥抱更多5G选择
  • Open3D聚类算法
  • swing快速入门(三十九)进度对话框
  • Oracle-存储过程
  • L1-085:试试手气
  • nginx+keepalived实现七层负载
  • 机器人制作开源方案 | 智能盲道除雪小车
  • Mypy: 把静态类型检查带给Python
  • 【心得杂记】简单聊聊限制高速面阵相机性能的因素
  • 金蝶Apusic应用服务器 loadTree JNDI注入漏洞
  • 计算机毕业设计 基于SpringBoot的公司资产网站的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 如何获取时间戳?
  • Vue页面传值:Props属性与$emit事件的应用介绍
  • 【mars3d】new mars3d.layer.GeoJsonLayer(实现环状面应该怎么传data
  • Websocket实时更新商品信息
  • 数据结构第六弹---带头双向循环链表
  • 洛谷——P1347 排序(图论-拓扑排序)
  • JVM内存管理
  • 将 Python 和 Rust 融合在一起,为 pyQuil® 4.0 带来和谐
  • Spring Boot应用程序中VO的理解及使用
  • 华为交换机ETH-TRUNK链路聚合lacp模式与手工模式
  • 函数图像化
  • gnu工程的编译 - 以libiconv为例
  • 在 CentOS 7.8 上安装 Node.js
  • 【数据分析实战】冰雪大世界携程景区评价信息情感分析采集词云
  • BIND-DNS配置介绍
  • Python技巧
  • 几种常见的CSS三栏布局?介绍下粘性布局(sticky)?自适应布局?左边宽度固定,右边自适应?两种以上方式实现已知或者未知宽度的垂直水平居中?