nlp新词发现——浅析 TF·IDF

传统nlp任务处理文本及其依赖已有的词表,只有在词表里出现的词才能被识别并加以处理。但这也带来了一些问题:

假设没有词表,如何从文本中发现新词?
随着时间推移,新词会不断出现,固有词表会过时,怎么维护词表?

新词发现(如何判定一个词?)

词相当于一种固定搭配

词的内部应该是稳固的——内部凝固度

词的外部应该是多变的——左右熵
在这里插入图片描述

从词到理解

有了分词能力后,需要利用词来完成对文本的理解;
首先可以想到的,就是从文章里挑选重要词。

何为重要词

假设一个词在某类文本中(假设为A类)出现的次数很多,而在其他类别文本(非A类)出现很少,那么这个词是A类文本的重要词(高权重词)。恒星、黑洞——>天文。
反之,若一个词在很多领域都有出现,则其对于任意类别的重要性都很差。你好、谢谢——> ???

如何从数学角度刻画

一种NLP的经典统计值:TF·IDF
TF:词频,某个词在某类别中出现的次数/该类别的词总数
IDF:逆文档频率。逆文档频率高——>该词很少出现在其他文档。

TF·IDF计算

TF·IDF = TF * IDF
假设有四篇文档,文档中的词用字母替代
A: a b c d a b c d
B: b c b c b c
C: b d b d
D: d d d d d d d d

每个词对于每个类别都会得到一个TF·IDF值
TF·IDF高——>该词对于该领域重要程度高,低则相反

算法特点

1、tfidf的计算非常依赖分词结果,如果分词出错,统计值的意义会大打折扣。
2、每个词,对于每篇文档,有不同的tfidf值,所以不能脱离数据讨论tfidf。
3、如果只有一篇文本,不能计算tfidf。
4、类别数据均衡很重要。
5、容易受各种符号影响,最好做一些预处理。

TFIDF应用——搜索引擎

1、对于已有的所有网页(文本),计算每个网页中词的TFIDF值。
2、对于一个输入query进行分词。
3、对于文档D,计算query中的词在文档D中的TFIDF值总和,作为query和文档的相关性得分。

import jieba
import math
import os
import json
from collections import defaultdict
from calculate_tfidf import calculate_tfidf, tf_idf_topk
"""
基于tfidf实现简单搜索引擎
"""jieba.initialize()#加载文档数据(可以想象成网页数据),计算每个网页的tfidf字典
def load_data(file_path):corpus = []with open(file_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, tf_idf_dict, corpus, top=3):query_words = jieba.lcut(query)res = []for doc_id, tf_idf in tf_idf_dict.items():score = 0for word in query_words: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 = "news.json"tf_idf_dict, corpus = load_data(path)while True:query = input("请输入您要搜索的内容:")search_engine(query, tf_idf_dict, corpus)

TFIDF应用——文本摘要

1、通过计算TFIDF值得到每个文本的关键词
2、将包含关键词多的句子,认为是关键句。
3、挑选若干关键句,作为文本的摘要。

import jieba
import math
import os
import random
import re
import json
from collections import defaultdict
from calculate_tfidf import calculate_tfidf, tf_idf_topk
"""
基于tfidf实现简单文本摘要
"""jieba.initialize()#加载文档数据(可以想象成网页数据),计算每个网页的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 Noneresult = []for index, sentence in enumerate(sentences):sentence_score = 0words = jieba.lcut(sentence)for word in words:sentence_score += document_tf_idf.get(word, 0)sentence_score /= (len(words) + 1)result.append([sentence_score, index])result = sorted(result, key=lambda x:x[0], reverse=True)#权重最高的可能依次是第10,第6,第3句,将他们调整为出现顺序比较合理,即3,6,10important_sentence_indexs = sorted([x[1] for x in result[: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 = "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()

TFIDF应用——文本相似度计算

1、对所有文本计算TFIDF后,从每个文本选取tfidf较高的前n个词,得到一个词的集合S。
2、对于每篇文本D,计算S中的每个词的词频,将其作为文本的向量。
3、通过计算向量夹角余弦值,得到向量相似度,作为文本的相似度。
向量夹角余弦值计算:

#coding:utf8
import jieba
import math
import os
import json
from collections import defaultdict
from calculate_tfidf import calculate_tfidf, tf_idf_topk"""
基于tfidf实现文本相似度计算
"""jieba.initialize()#加载文档数据(可以想象成网页数据),计算每个网页的tfidf字典
#之后统计每篇文档重要在前10的词,统计出重要词词表
#重要词词表用于后续文本向量化
def load_data(file_path):corpus = []with open(file_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)topk_words = tf_idf_topk(tf_idf_dict, top=5, print_word=False)vocab = set()for words in topk_words.values():for word, score in words:vocab.add(word)print("词表大小:", len(vocab))return tf_idf_dict, list(vocab), corpus#passage是文本字符串
#vocab是词列表
#向量化的方式:计算每个重要词在文档中的出现频率
def doc_to_vec(passage, vocab):vector = [0] * len(vocab)passage_words = jieba.lcut(passage)for index, word in enumerate(vocab):vector[index] = passage_words.count(word) / len(passage_words)return vector#先计算所有文档的向量
def calculate_corpus_vectors(corpus, vocab):corpus_vectors = [doc_to_vec(c, vocab) for c in corpus]return corpus_vectors#计算向量余弦相似度
def cosine_similarity(vector1, vector2):x_dot_y = sum([x*y for x, y in zip(vector1, vector2)])sqrt_x = math.sqrt(sum([x ** 2 for x in vector1]))sqrt_y = math.sqrt(sum([x ** 2 for x in vector2]))if sqrt_y == 0 or sqrt_y == 0:return 0return x_dot_y / (sqrt_x * sqrt_y + 1e-7)#输入一篇文本,寻找最相似文本
def search_most_similar_document(passage, corpus_vectors, vocab):input_vec = doc_to_vec(passage, vocab)result = []for index, vector in enumerate(corpus_vectors):score = cosine_similarity(input_vec, vector)result.append([index, score])result = sorted(result, reverse=True, key=lambda x:x[1])return result[:4]if __name__ == "__main__":path = "news.json"tf_idf_dict, vocab, corpus = load_data(path)corpus_vectors = calculate_corpus_vectors(corpus, vocab)passage = "魔兽争霸"for corpus_index, score in search_most_similar_document(passage, corpus_vectors, vocab):print("相似文章:\n", corpus[corpus_index].strip())print("得分:", score)print("--------------")

TFIDF的优势

1、可解释性好:
可以清晰地看到关键词,即使预测出错,也很容易就找到原因。
2、计算速度快:
分词本身占耗时最多,其余为简单统计计算
3、对标注数据依赖小
可以使用无标注预料完成一部分工作
4、可以与很多算法组合使用
可以看做是词的权重

TFIDF的劣势

1、受分词效果影响大
2、词与词之间没有语义相似度
3、没有语序信息(词袋模型)
4、能力范围有限,无法完成复杂任务,如机器翻译和实体挖掘等
5、样本不均衡会对结果有很大影响
6、类内样本间分部不被考虑

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

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

相关文章

OpenAI 普及 ChatGPT,开通热线电话,近屿智能深耕AI培训

12月19日&#xff0c;在OpenAI直播活动的第10天&#xff0c;宣布允许用户通过电话或WhatsApp与ChatGPT进行交互。并在美国推出 ChatGPT 热线电话&#xff0c;用户拨打后可与 ChatGPT 进行语音对话。 这项服务的一个亮点在于它兼容各种类型的通信设备——不论是现代智能手机如iP…

vue中proxy代理配置(测试二)

接口地址&#xff1a;https://ss.dd.dd.d.cn:9006/thirdist/portalApi/biz-api/eemp/supervision/v1//getPeiCountData?batch2&cent0 1、配置一&#xff08;代理没起作用&#xff09; &#xff08;1&#xff09;设置baseURL为https://ss.dd.dd.d.cn:9006 &#xff08;2&am…

国自然面上项目分享|基于人工智能和病理组学的早癌筛查算法研究|基金申请·24-12-24

小罗碎碎念 今天分享的项目为【常规面上项目】&#xff0c;执行年限为2018年1月至2021年12月&#xff0c;直接费用为55万元。 今天分享的这个项目很有意思&#xff0c;因为这个项目的成果是团队2020年申报基金委优青的材料&#xff0c;并且还有临床验证和商业转化&#xff0c;值…

地址踩踏问题

malloc分配地址大小不足&#xff0c;如 pstruct只分配了一个字节的地址&#xff0c;handle访问时需要访问8个字节的数据&#xff0c;此时虽然可以正常打印&#xff0c;但如果其他程序使用了未分配的7个字节地址&#xff0c;就会导致该handle无法正确访问

快速部署一套Kubernetes集群

一、准备环境 服务器规划&#xff1a; 角色 IP地址 k8s-master 192.168.1.71 k8s-node1 192.168.1.72 k8s-node2 192.168.1.73 服务器要求&#xff1a; 建议最小硬件配置&#xff1a;2核CPU、2G内存、20G硬盘。服务器可以访问互联网&#xff0c;会联网下载镜像。 软…

Github Copilot:已免费,速回归!!!

引言 2024 年 12 月&#xff0c;GitHub 宣布推出GitHub Copilot Free&#xff0c;这一消息让不少开发者为之欢呼雀跃。毕竟&#xff0c;谁不喜欢 白嫖 呢&#xff1f; GitHub Copilot 不仅提供了 AI 辅助编程功能&#xff0c;还与自家 VS Code 无缝集成&#xff0c;简直是编程…

使用TC命令模拟弱网丢包

在网络测试和优化过程中&#xff0c;模拟弱网环境&#xff08;如高延迟、丢包、抖动等&#xff09;是非常重要的一环。tc&#xff08;Traffic Control&#xff09;是 Linux 内核中的一个强大工具&#xff0c;它可以用于流量整形、流量控制、队列管理等。通过 tc&#xff0c;我们…

概率论 期末 笔记

第一章 随机事件及其概率 利用“四大公式”求事件概率 全概率公式与贝叶斯公式 伯努利概型求概率 习题 推导 一维随机变量及其分布 离散型随机变量&#xff08;R.V&#xff09;求分布律 利用常见离散型分布求概率 连续型R.V相关计算 利用常见连续型分布的计算 均匀分布 正态…

【文档搜索引擎】搜索模块的完整实现

调用索引模块&#xff0c;来完成搜索的核心过程 主要步骤 简化版本的逻辑&#xff1a; 分词&#xff1a;针对用户输入的查询词进行分词&#xff08;用户输入的查询词&#xff0c;可能不是一个词&#xff0c;而是一句话&#xff09;触发&#xff1a;拿着每个分词结果&#xf…

如何在centos系统上挂载U盘

在CentOS上挂载NTFS格式的U盘,需要执行一系列步骤,包括识别U盘设备、安装必要的软件、创建挂载点,并最终挂载U盘。以下是在CentOS上挂载NTFS格式U盘的详细步骤: 一、准备工作 确认CentOS版本: 确保你的CentOS系统已经安装并正常运行。不同版本的CentOS在命令和工具方面可能…

pytest自动化测试数据驱动yaml/excel/csv/json

数据驱动 数据的改变从而驱动自动化测试用例的执行&#xff0c;最终引起测试结果的改变。简单说就是参数化的应用。 测试驱动在自动化测试中的应用场景&#xff1a; 测试步骤的数据驱动&#xff1b;测试数据的数据驱动&#xff1b;配置的数据驱动&#xff1b; 1、pytest结合数据…

ECharts散点图-气泡图,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

高强度螺栓等级划分

高强度螺栓的等级划分主要依据其性能等级&#xff0c;常见的等级有8.8级和10.9级。这些等级标号由两部分数字组成&#xff0c;分别表示螺栓材料的公称抗拉强度值和屈强比值。 8.8级高强度螺栓&#xff1a;表示螺栓杆的抗拉强度不小于800MPa&#xff0c;屈强比&#xff08;屈服强…

WEB UI 创建视图

1 视图名称 (点第1创建视图) 2 模型节点 可以空 3 上下文节点 4 新增节点下的属性 &#xff0c;参考结构(先建好的结构) 5 选择视图类型&#xff1a;&#xff08;表单&#xff0c; 列表&#xff09; 表单 &#xff1a;单条数据 列表 &#xff1a;多条数据&#xff08;表格…

linux-19 根文件系统(一)

之前提到过&#xff0c;linux的目录是一个倒置的树&#xff0c;它通过层次性的方式来组织&#xff0c;管理整个系统的文件&#xff0c;而这本身实际上是通过文件系统。文件系统&#xff0c;大家记得文件系统是内核的主要功能之一&#xff0c; 它的主要目的就是实现本机上的某一…

四种电子杂志制作软件

​大家好&#xff0c;今天给大家种草四种超级实用的电子杂志制作软件。无论你是专业出版人士&#xff0c;还是业余爱好者&#xff0c;这四款软件都能帮助你轻松制作出精美的电子杂志。让我们一起来看看吧&#xff01; 1.FLBOOK FLBOOK是一款在线仿真翻页制作H5电子画册&#x…

webserver log日志系统的实现

参考博客&#xff1a;https://blog.csdn.net/weixin_51322383/article/details/130474753 https://zhuanlan.zhihu.com/p/721880618 阻塞队列blockqueue 1、阻塞队列的设计流程是什么样的 它的底层是用deque进行管理的 阻塞队列主要是围绕着生产者消费者模式进行多线程的同步和…

kkfileview代理配置,Vue对接kkfileview实现图片word、excel、pdf预览

kkfileview部署 官网&#xff1a;https://kkfileview.keking.cn/zh-cn/docs/production.html 这个是官网部署网址&#xff0c;这里推荐大家使用docker镜像部署&#xff0c;因为我是直接找运维部署的&#xff0c;所以这里我就不多说明了&#xff0c;主要说下nginx代理配置&am…

《Vue3实战教程》5:响应式基础

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 响应式基础​ API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态…

EasyExcel停更,FastExcel接力

11月6日消息&#xff0c;阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布&#xff0c;将停止更新&#xff0c;未来将逐步进入维护模式&#xff0c;将继续修复Bug&#xff0c;但不再主动新增功能。 EasyExcel以其快速、简洁和解决大文件内存溢出的能力而著称&#xff0c;官方…