NLP(10)--TFIDF优劣势及其应用Demo

前言

仅记录学习过程,有问题欢迎讨论

TF*IDF:

在这里插入图片描述
优势:

  1. 可解释性好
    可以清晰地看到关键词
    即使预测结果出错,也很容易找到原因

  2. 计算速度快
    分词本身占耗时最多,其余为简单统计计算

  3. 对标注数据依赖小
    可以使用无标注语料完成一部分工作

  4. 可以与很多算法组合使用
    可以看做是词权重

劣势:
1.受分词效果影响大

2.词与词之间没有语义相似度

3.没有语序信息(词袋模型)

4.能力范围有限,无法完成复杂任务,如机器翻译和实体挖掘等

5.样本不均衡会对结果有很大影响

6.类内样本间分布不被考虑

代码

Demo1:手动实现TFIDF

"""
实现一个 TFIDF
"""
import jieba
import math
import os
import json
from collections import defaultdictdef build_tf_idf_dict(corpus):tf_dict = defaultdict(dict)  # key:文档序号,value:dict,文档中每个词出现的频率idf_dict = defaultdict(set)  # key:词, value:set,文档序号,最终用于计算每个词在多少篇文档中出现过for text_index, text_words in enumerate(corpus):for word in text_words:if word not in tf_dict[text_index]:tf_dict[text_index][word] = 0tf_dict[text_index][word] += 1idf_dict[word].add(text_index)idf_dict = dict([(key, len(value)) for key, value in idf_dict.items()])return tf_dict, idf_dict# 根据tf值和idf值计算tfidf
def calculate_tf_idf(tf_dict, idf_dict):tf_idf_dict = defaultdict(dict)for text_index, word_tf_count_dict in tf_dict.items():for word, tf_count in word_tf_count_dict.items():tf = tf_count / sum(word_tf_count_dict.values())# tf-idf = tf * log(D/(idf + 1))tf_idf_dict[text_index][word] = tf * math.log(len(tf_dict) / (idf_dict[word] + 1))return tf_idf_dict# 计算样本的 tfidf
def calculate_tfidf(corpus):corpus = [jieba.cut(text) for text in corpus]tf_dict, idf_dict = build_tf_idf_dict(corpus)tf_idf_dict = calculate_tf_idf(tf_dict, idf_dict)return tf_idf_dict# 取出前k个 tfidf最大的数据
def tf_idf_topk(tfidf_dict, paths=[], top=10, print_word=True):topk_dict = {}for text_index, text_tfidf_dict in tfidf_dict.items():# idf 逆序word_list = sorted(text_tfidf_dict.items(), reverse=True, key=lambda x: x[1])# 去排序后的前top个topk_dict[text_index] = word_list[:top]if print_word:print(text_index, paths[text_index])for i in range(top):print(word_list[i])print("----------")return topk_dictdef main():dir_path = r"week4/category_corpus/"corpus = []paths = []for path in os.listdir(dir_path):path = os.path.join(dir_path, path)if path.endswith("txt"):corpus.append(open(path, encoding="utf8").read())paths.append(os.path.basename(path))tf_idf_dict = calculate_tfidf(corpus)tf_idf_topk(tf_idf_dict, paths)if __name__ == "__main__":main()

Demo2:利用 tfidf 实现简单搜索引擎功能

"""
利用 tfidf 实现简单搜索引擎功能"""import jieba
import math
import os
import json
from collections import defaultdict# 加载文档数据(可以想象成网页数据),计算每个网页的tfidf字典
from day0429_1 import calculate_tfidfdef load_data(path):# path = "/week4/news.json"corpus = []with open(path, encoding="utf8") as f:documents = json.loads(f.read())for document in documents:corpus.append(document['title'] + "\n" + document["content"])tf_idf_dict = calculate_tfidf(corpus)return tf_idf_dict, corpusdef search_engine(query_str, tf_idf_dict, corpus, top=3):query_words = jieba.lcut(query_str)res = []for doc_id, tf_idf in tf_idf_dict.items():score = 0for word in query_words:# 搜到关键词了 score++score += tf_idf.get(word, 0)res.append([doc_id, score])res = sorted(res, reverse=True, key=lambda x: x[1])for i in range(top):doc_id = res[i][0]print(corpus[doc_id])print("--------------")return resif __name__ == "__main__":path = "C:\\Users\\Administrator\\Desktop\\LearnPython\\week4\\news.json"tf_idf_dict, corpus = load_data(path)while True:query = input("请输入您要搜索的内容:")search_engine(query, tf_idf_dict, corpus)

Demo3 :基于tfidf实现简单文本摘要

import jieba
import math
import os
import random
import re
import json
from collections import defaultdictfrom day0429_1 import calculate_tfidf"""
基于tfidf实现简单文本摘要
"""# 加载文档数据(可以想象成网页数据),计算每个网页的tfidf字典
def load_data(file_path):corpus = []with open(file_path, encoding="utf8") as f:documents = json.loads(f.read())for document in documents:assert "\n" not in document["title"]assert "\n" not in document["content"]corpus.append(document["title"] + "\n" + document["content"])tf_idf_dict = calculate_tfidf(corpus)return tf_idf_dict, corpus# 计算每一篇文章的摘要
# 输入该文章的tf_idf词典,和文章内容
# top为人为定义的选取的句子数量
# 过滤掉一些正文太短的文章,因为正文太短在做摘要意义不大
def generate_document_abstract(document_tf_idf, document, top=3):sentences = re.split("?|!|。", document)if len(sentences) < 5:return Noneres = []for index, sentence in enumerate(sentences):sentence_score = 0words = jieba.lcut(sentence)for word in words:sentence_score += document_tf_idf.get(word, 0)# 记录下每句话的分数和下标res.append([sentence_score, index])res = sorted(res, reverse=True, key=lambda x: x[0])# 权重最高的可能依次是第10,第6,第3句,将他们调整为出现顺序比较合理,即3,6,10important_sentence_indexs = sorted([x[1] for x in res[:top]])return "。".join([sentences[index] for index in important_sentence_indexs])# 生成摘要
def generate_abstract(tf_idf_dict, corpus):res = []for index, document_tf_idf in tf_idf_dict.items():title, content = corpus[index].split("\n")abstract = generate_document_abstract(document_tf_idf, content)if abstract is None:continuecorpus[index] = "\n" + abstractres.append({"标题": title, "正文": content, "摘要": abstract})return resif __name__ == "__main__":path = "C:\\Users\\Administrator\\Desktop\\LearnPython\\week4\\news.json"tf_idf_dict, corpus = load_data(path)res = generate_abstract(tf_idf_dict, corpus)writer = open("abstract.json", "w", encoding="utf8")writer.write(json.dumps(res, ensure_ascii=False, indent=2))writer.close()

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

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

相关文章

【状态机dp 状态压缩 分组】1994. 好子集的数目

本文涉及知识点 动态规划汇总 动态规划 状态机dp 状态压缩 分组 LeetCode1994. 好子集的数目 给你一个整数数组 nums 。如果 nums 的一个子集中&#xff0c;所有元素的乘积可以表示为一个或多个 互不相同的质数 的乘积&#xff0c;那么我们称它为 好子集 。 比方说&#xff…

离散数学之命题逻辑思维导图+大纲笔记(预习、期末复习,考研,)

大纲笔记&#xff1a; 命题逻辑的基本概念 命题与联结词 命题 命题是推理的基本单位 真命题&#xff0c;假命题 特征 陈述句 唯一的真值 是非真即假的陈述句 非命题 疑问句 祈使句 可真可假 悖论 模糊性 三个基本概念 复合命题 真值取决于原子命题的值和逻辑联结词 原子命题 逻…

基于SSM的考研助手系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的考研助手系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

【Java】图书管理系统 介绍与实现

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 1.介绍 图书馆作为知识的殿堂和学术的中心&#xff0c;其管理系统不仅是图书馆管理的必备工具&#xff0c;更是为用户提供优质、高效服务的重要保障&#xff0c;促进了知识的传播和学术的发展。随着…

k8s部署在虚拟机和物理机区别

在Kubernetes中&#xff0c;部署应用程序的主要区别在于你的基础设施类型。在虚拟机&#xff08;VM&#xff09;上部署Kubernetes集群与在物理机上部署Kubernetes集群的主要区别在于资源的隔离方式。 虚拟机&#xff1a; 优点&#xff1a;资源可以被隔离&#xff0c;所以如果你…

远程为ubuntu安装teamviwer(无UI界面) - 简书

远程为ubuntu安装teamviwer&#xff08;无UI界面&#xff09; - 简书 远程为ubuntu安装teamviwer&#xff08;无UI界面&#xff09; - 简书

基于FPGA的数字信号处理(6)--如何确定Verilog表达式的符号

前言 尽管signed语法的使用能带来很多便利&#xff0c;但同时也给表达式的符号确定带来了更多的不确定性。比如一个有符号数和一个无符号数的加法/乘法结果是有符号数还是无符号数&#xff1f;一个有符号数和一个无符号数的比较结果是有符号数还是无符号数&#xff1f;等等。接…

力扣刷题Day2

题目链接&#xff1a; 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 效果&#xff1a; 解题思路&#xff1a; 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 注意不可以只是单纯的改变节点内部的值&#xff0c;而…

《QT实用小工具·四十七》可交互的创意动态按钮

1、概述 源码放在文章末尾 该项目实现了可交互的创意动态按钮&#xff0c;包含如下功能&#xff1a; 所有颜色自定义 鼠标悬浮渐变 两种点击效果&#xff1a;鼠标点击渐变 / 水波纹动画&#xff08;可多层波纹叠加&#xff09; 额外鼠标移入/移出/按下/弹起的实时/延迟共8种事…

$nextTick源码解析

this.$nextTick 是 Vue.js 内部使用的一个方法,用于在下一个 DOM 更新循环结束之后执行回调函数。 原理: nextTick 方法被调用后,会将回调函数存储在一个队列中Vue.js 会利用浏览器的异步队列机制,在 DOM 更新循环结束后执行这个队列中的所有回调函数。源码: /*** Defer…

51单片机两个中断及中断嵌套

文章目录 前言一、中断嵌套是什么&#xff1f;二、两个同级别中断2.1 中断运行关系2.2 测试程序 三、两个不同级别中断实现中断嵌套3.1 中断运行关系3.2 测试程序 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#x…

德国著名自动化公司Festo设计了一款仿生蜜蜂,仅重34g,支持多只蜜蜂编队飞行!...

德国著名的气动元件研发及自动化解决方案供应商Festo公司近日展示了一款仿生蜜蜂&#xff08;BionicBee&#xff09;&#xff0c;重量只有34g&#xff0c;却完全可以实现自主飞行&#xff0c;还支持多只相同的蜜蜂机器人编队飞行。 BionicBee 重约 34 克&#xff0c;长 22 厘米…

Android配置环境

安装jdk&#xff1a; 1.在Android 中文社区下载sdk&#xff1a;android-sdk_r24.4.1-linux.tgz下载jdk&#xff0c;解压 sudo mv /home/用户名/Downloads/jdk1.8.0_271 /usr/java 配置环境变量&#xff1a; 执行命令&#xff1a;sudo gedit /etc/profile 此命令是打开profil…

面试题:spring和mybatis整合之后为什么一级缓存会失效?

答案 一级缓存使用者可以随时使用或者销毁缓存&#xff0c;从SqlSession对象打开时缓存就已经存在。当关闭SqlSession对象缓存就失效。 当与spring整合的时候&#xff0c;直接跳过SqlSession对象&#xff0c;无法直接操作到SqlSession对象&#xff0c;spring在操作SqlSession的…

python安装cx_Oracle 遇到的问题

重要&#xff1a; 搞了一天&#xff0c;最后发现是python的版本和cx_Oracle版本对不上。 一开始安装的python版本是3.12&#xff0c;而cx_Oracle的最新版本是8.3.0&#xff0c; 对应的python版本为3.10&#xff0c;因此将python版本降低为3.10&#xff0c; 执行 pip install cx…

docker打包容器为镜像

要使用Docker将容器打包成镜像&#xff0c;你需要执行以下步骤&#xff1a; 创建一个Dockerfile&#xff0c;定义如何构建你的镜像。 使用docker build命令来创建镜像。 以下是一个简单的示例&#xff1a; 首先&#xff0c;创建一个名为Dockerfile的文件&#xff0c;内容如…

Redis线程模型及性能优化概述

redis线程模型&#xff1a; 网络模块命令处理 redis的性能&#xff1a; 一个取决于物理内存&#xff0c;另一个是对于socket请求的处理速度。 4.0以前 单线程模式 请求流程&#xff1a;对于一个请求&#xff0c;线程会根据操作产生相应的事件&#xff08;读&#xff0c;写事…

基于Springboot的水产养殖系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的水产养殖系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

【MyBatis】进阶使用 (动态SQL)

动态SQL \<if>\<trim>\<where>\<set>\<foreach>\<include> 在填写表单时&#xff0c;有些数据是非必填字段&#xff08;例如性别&#xff0c;年龄等字段&#xff09;&#xff0c;那就需要在接收到参数时判断&#xff0c;根据参数具体的情况…

【知识学习/复习】损失函数篇,包含理解应用与分类:回归、分类、排序、生成等任务

损失函数总结 一、损失函数理解二、不同任务的损失函数的应用1.图像分类2.目标检测3.语义分割4.自然语言处理&#xff08;NLP&#xff09;5.图神经网络&#xff08;GNN&#xff09;6.生成式网络 三、损失函数1. 回归任务损失函数常见损失函数IoU系列损失函数1. IoU损失函数&…