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

数据分析-深度学习 NLP Day2关键词提取案例

训练一个关键词提取算法需要以下几个步骤:

1)加载已有的文档数据集;

2)加载停用词表;

3)对数据集中的文档进行分词;

4)根据停用词表,过滤干扰词;

5)根据数据集训练算法;

根据训练好的关键词提取算法对新文档进行关键词提取要经过以下环节:

1)对新文档进行分词;

2)根据停用词表,过滤干扰词;

3)根据训练好的算法提取关键词;

1 加载模块

import math
import jieba
import jieba.posseg as psg
from gensim import corpora, models
from jieba import analyse
import functools

2 定义好停用词表的加载方法

def get_stopword_list():# 停用词表存储路径,每一行为一个词,按行读取进行加载# 进行编码转换确保匹配准确率stop_word_path = './stopword.txt'stopword_list = [sw.replace('/n', '') for sw in open(stop_word_path).readlines()]return stopword_list

3 定义一个分词方法

def seg_to_list(sentence, pos=False):''' 分词方法,调用结巴接口。pos为判断是否采用词性标注 '''if not pos:# 不进行词性标注的分词方法seg_list = jieba.cut(sentence)else:# 进行词性标注的分词方法seg_list = psg.cut(sentence)return seg_list

4 定义干扰词过滤方法

def word_filter(seg_list, pos=False):''' 1. 根据分词结果对干扰词进行过滤;2. 根据pos判断是否过滤除名词外的其他词性;3. 再判断是否在停用词表中,长度是否大于等于2等;'''stopword_list = get_stopword_list() # 获取停用词表filter_list = [] # 保存过滤后的结果#  下面代码: 根据pos参数选择是否词性过滤## 下面代码: 如果不进行词性过滤,则将词性都标记为n,表示全部保留for seg in seg_list:if not pos:word = segflag = 'n'else:word = seg.word # 单词flag = seg.flag # 词性if not flag.startswith('n'):continue# 过滤停用词表中的词,以及长度为<2的词if not word in stopword_list and len(word)>1:filter_list.append(word)return filter_list

5 加载数据集,并对数据集中的数据分词和过滤干扰词

def load_data(pos=False, corpus_path = './corpus.txt'):'''目的:调用上面方法对数据集进行处理,处理后的每条数据仅保留非干扰词参数:1. 数据加载2. pos: 是否词性标注的参数3. corpus_path: 数据集路径'''doc_list = [] # 结果for line in open(corpus_path, 'r'):content = line.strip() # 每行的数据seg_list = seg_to_list(content, pos) # 分词filter_list = word_filter(seg_list, pos) # 过滤停用词doc_list.append(filter_list) # 将处理后的结果保存到doc_listreturn doc_list

6 IDF 训练

# TF-IDF的训练主要是根据数据集生成对应的IDF值字典,后续计算每个词的TF-IDF时,直接从字典中读取。def train_idf(doc_list):idf_dic = {} # idf对应的字典tt_count = len(doc_list) # 总文档数# 每个词出现的文档数for doc in doc_list: for word in set(doc):idf_dic[word] = idf_dic.get(word, 0.0) + 1.0# 按公式转换为idf值,分母加1进行平滑处理for k, v in idf_dic.items():idf_dic[k] = math.log(tt_count/(1.0 + v))# 对于没有在字典中的词,默认其尽在一个文档出现,得到默认idf值default_idf = math.log(tt_count/(1.0))return idf_dic, default_idf

7 LSI 训练

# LSI的训练时根据现有的数据集生成文档-主题分布矩阵和主题-词分布矩阵,Gensim中有实现好的方法,可以直接调用。def train_lsi(self):lsi = models.LsiModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)return lsi

8 LDA训练

# LDA的训练时根据现有的数据集生成文档-主题分布矩阵和主题-词分布矩阵,Gensim中有实现好的方法,可以直接调用。def train_lda(self):lda = models.LdaModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)return lda

9 cmp函数

# 为了输出top关键词时,先按照关键词的计算分值排序,在得分相同时,根据关键词进行排序def cmp(e1, e2):''' 排序函数,用于topK关键词的按值排序 '''import numpy as npres = np.sign(e1[1] - e2[1])if res != 0:return reselse:a = e1[0] + e2[0]b = e2[0] + e1[0]if a > b:return 1elif a == b:return 0else:return -1

10 TF-IDF实现方法

根据具体要处理的文本,计算每个词的TF值,并获取前面训练好的IDF数据,直接获取每个词的IDF值,综合计算每个词的TF-IDF。

class TfIdf(object):# 四个参数分别是:训练好的idf字典,默认idf字典,处理后的待提取文本, 关键词数量def __init__(self, idf_dic, default_idf, word_list, keyword_num):self.idf_dic, self.default_idf = idf_dic, default_idfself.word_list = word_listself.tf_dic = self.get_tf_dic() # 统计tf值self.keyword_num = keyword_numdef get_tf_dic(self):# 统计tf值tf_dic = {}for word in self.word_list:tf_dic[word] = tf_dic.get(word, 0.0) + 1.0tt_count = len(self.word_list)for k, v in tf_dic.items():tf_dic[k] = float(v) / tt_count # 根据tf求值公式return tf_dicdef get_tfidf(self):# 计算tf-idf值tfidf_dic = {}for word in self.word_list:idf = self.idf_dic.get(word, self.default_idf)tf  = self.tf_dic.get(word, 0)tfidf = tf * idftfidf_dic[word] = tfidftfidf_dic.items()# 根据tf-idf排序,去排名前keyword_num的词作为关键词for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:print(k + '/', end='')print()

11 完整的主题模型实现方法

分别实现了LSI,LDA算法,根据传入参数model进行选择,几个参数如下:

doc_list 是前面数据集加载方法的返回结果

keyword_num同上,为关键词数量

model为本主题模型的具体算法,分别可以传入LSI,LDA,默认为LSI

num_topics为主题模型的主题数量

class TopicModel(object):# 三个传入参数:处理后的数据集,关键词数量,具体模型(LSI,LDA),主题数量def __init__(self, doc_list, keyword_num, model='LSI', num_topics=4):# 使用gensim接口,将文本转为向量化表示# 先构建词空间self.dictionary = corpora.Dictionary(doc_list)# 使用BOW模型向量化corpus = [self.dictionary.doc2bow(doc) for doc in doc_list]# 对每个词,根据tf-idf进行加权,得到加权后的向量表示self.tfidf_model = models.TfidfModel(corpus)self.corpus_tfidf = self.tfidf_model[corpus]self.keyword_num = keyword_numself.num_topics = num_topics# 选择加载的模型if model == "LSI":self.model = self.train_lsi()else:self.model = self.train_lda()# 得到数据集的主题-词分布word_dic = self.word_dictionary(doc_list) self.wordtopic_dic = self.get_wordtopic(word_dic)# LSI的训练时根据现有的数据集生成文档-主题分布矩阵和主题-词分布矩阵,Gensim中有实现好的方法,可以直接调用。def train_lsi(self):lsi = models.LsiModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)return lsi# LDA的训练时根据现有的数据集生成文档-主题分布矩阵和主题-词分布矩阵,Gensim中有实现好的方法,可以直接调用。def train_lda(self):lda = models.LdaModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)return ldadef get_wordtopic(self, word_dic):wordtopic_dic = {}for word in word_dic:single_list = [word]wordcorpus = self.tfidf_model[self.dictionary.doc2bow(single_list)]wordtopic = self.model[wordcorpus]wordtopic_dic[word] = wordtopicreturn wordtopic_dicdef get_simword(self, word_list):# 计算词的分布和文档的分布的相似度,去相似度最高的keyword_num个词作为关键词sentcorpus = self.tfidf_model[self.dictionary.doc2bow(word_list)]senttopic = self.model[sentcorpus]# 余弦相似度计算def calsim(l1, l2):a,b,c = 0.0, 0.0, 0.0for t1, t2 in zip(l1, l2):x1 = t1[1]x2 = t2[1]a += x1 * x1b += x1 * x1c += x2 * x2sim = a / math.sqrt(b * c) if not (b * c) == 0.0 else 0.0return sim# 计算输入文本和每个词的主题分布相似度sim_dic = {}for k, v in self.wordtopic_dic.items():if k not in word_list:continuesim = calsim(v, senttopic)sim_dic[k] = simfor k, v in sorted(sim_dic.items(), key=functools.cmp_to_key(cmp),reverse=True)[:self.keyword_num]:print(k + '/' , end='')print()def word_dictionary(self, doc_list):# 词空间构建方法和向量化方法,在没有gensim接口时的一般处理方法dictionary = []for doc in doc_list:dictionary.extend(doc)dictionary = list(set(dictionary))return dictionarydef doc2bowvec(self, word_list):vec_list = [1 if word in word_list else 0 for word in self.dictionary]return vec_list

12 对上面的各个方法进行封装,统一算法调用接口

def tfidf_extract(word_list, pos=False, keyword_num=10):doc_list = load_data(pos)idf_dic, default_idf = train_idf(doc_list)tfidf_model = TfIdf(idf_dic, default_idf, word_list, keyword_num)tfidf_model.get_tfidf()def textrank_extract(text, pos=False, keyword_num=10):textrank = analyse.textrankkeywords = textrank(text, keyword_num)# 输出抽取出的关键词for keyword in keywords:print(keyword + "/", end='')print()def topic_extract(word_list, model, pos=False, keyword_num=10):doc_list = load_data(pos)topic_model = TopicModel(doc_list, keyword_num, model=model)topic_model.get_simword(word_list)

13 主函数调用

if __name__ == "__main__":text = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \'中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \'办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \'重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \'领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \'市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \'、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \'这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \'的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \'事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \'常委会主任陈健倩介绍了大会的筹备情况。'pos = Falseseg_list = seg_to_list(text, pos)filter_list = word_filter(seg_list, pos)print("TF-IDF模型结果:")tfidf_extract(filter_list)print("TextRank模型结果:")textrank_extract(text)print("LSI模型结果:")topic_extract(filter_list, 'LSI', pos)print("LDA模型结果:")topic_extract(filter_list, 'LDA', pos)

14 输出结果:

相关文章:

数据分析-深度学习 NLP Day2关键词提取案例

训练一个关键词提取算法需要以下几个步骤&#xff1a;1&#xff09;加载已有的文档数据集&#xff1b;2&#xff09;加载停用词表&#xff1b;3&#xff09;对数据集中的文档进行分词&#xff1b;4&#xff09;根据停用词表&#xff0c;过滤干扰词&#xff1b;5&#xff09;根据…...

LeetCode题解:938. 二叉搜索树的范围和,BFS,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/range-sum-of-bst/ 解题思路&#xff1a; 对于二叉搜索树的任意节点&#xff0c;左子树的所有节点值都小于它的值&#xff0c;右子树的所有节点值都小于它的值。使用队列进行BFS搜索&#xff0c;如果当前节点的值小于low&…...

istio初步了解

istio 控制平面&#xff1a; Pilot&#xff1a;管理和配置部署在特定istio服务网格中的所有sidecar代理实例&#xff0c;管理sidecar代理之间的路由流量规则&#xff0c;并配置故障恢复功能&#xff0c;如超时、重试、熔断。 Citadel&#xff1a;istio中负责身份认证和证书管…...

【模板】用HTML编写邮件正文 | 各大邮箱几乎都会过滤css样式、js脚本等效果,如何用基础HTML编写?

用HTML编写邮件正文 文档 编码格式utf-8&#xff08;使用记事本或其他工具打开&#xff0c;在文件->另存为&#xff0c;编缉选择UTF-8格式&#xff09; 文档大小在15kb以内 样式 页面宽度&#xff1a;600px~800px 尽量用特殊元素以及元素属性代替样式 样式全部写为内联样式…...

华为云计算之双活容灾

双活&#xff08;HyperMetro&#xff09;本地双活&#xff1a;距离≤10km同城双活&#xff1a;距离&#xff1e;10km没有主备之分&#xff0c;只有本端数据中心和远端数据中心。当一个数据中心的设备故障或数据中心故障&#xff0c;业务会自动切换到另一个数据中心继续运行&…...

ASEMI高压MOS管ASE20N65SE体积,ASE20N65SE大小

编辑-Z ASEMI高压MOS管ASE20N65SE参数&#xff1a; 型号&#xff1a;ASE20N65SE 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;650V 栅源电压&#xff08;VGS&#xff09;&#xff1a;30V 漏极电流&#xff08;ID&#xff09;&#xff1a;20A 功耗&#xff08;P…...

resp连接redis服务器

修改redis的配置文件使得windows的图形界面客户端可以连接redis服务器 resp安装好以后&#xff0c;可以在linux端打开redis.conf中做以下操作&#xff0c;使得windows的图形界面客户端可以连接redis服务器 方法一&#xff1a; 1&#xff0c;在redis.conf文件中添加bind 在文件…...

七天实现一个分布式缓存

目录教程来源目的思路缓存淘汰(失效)算法&#xff1a;FIFO&#xff0c;LFU 和 LRUFIFO(First In First Out)LFU(Least Frequently Used)LRU(Least Recently Used)实现Lru查找功能删除新增/修改测试单机并发缓存主体结构 Group回调 GetterGroup 的定义Group 的 Get 方法HTTP 服务…...

电子招标采购系统源码功能清单

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

mysql数据库基础知识

一.mysql基本命令 1.基础常用命令 mysql -uroot -p密码;(也可以不带密码&#xff0c;之后输入) 本地登录 mysql -h 登录ip -p 端口(通常3306&#xff09; -uroot -p密码; 远程登录 desc 表名;查看表的各个字段的属性&#xff0c;以及自增键 mysqldump -u用户 -p 数据库名 >…...

CAN总线通信

CAN总线通信 CAN 是控制器局域网络&#xff08;Controller Area Network&#xff09; 的缩写&#xff0c;是 ISO 国际标准化的串行通信协议。 CAN是半双工通信 CAN总线特点 (1) 多主控制 在总线空闲时&#xff0c;所有的单元都可开始发送消息&#xff08;多主控制&#xf…...

MATLAB/Simulink 通信原理及仿真学习(二)

文章目录MATLAB/Simulink 通信原理及仿真学习&#xff08;二&#xff09;simulink仿真常用的Simulink库1. 信号源模块库2. 数序运算模块3. 信号输出模块库4.仿真搭建5.搭建自己的库6.S-函数编写MATLAB/Simulink 通信原理及仿真学习&#xff08;二&#xff09; simulink仿真 交…...

CentOS7 防火墙(firewall)的操作命令

CentOS7 防火墙&#xff08;firewall&#xff09;的操作命令 安装&#xff1a;yum install firewalld 1、firewalld的基本使用 启动&#xff1a; systemctl start firewalld 查看状态&#xff1a; systemctl status firewalld 禁用&#xff0c;禁止开机启动&#xff1a; s…...

文献工具汇总:论文查找、文献管理、文献翻译

科研人员论文哪里找&#xff1f;文献如何管理&#xff1f;本文给推荐一些提高论文阅读写作效率的一些资料&#xff0c;包括查找论文、文献管理、文献翻译等方面。 一、查找文献 PMC&#xff08;Pubmed Cenral) Pubmed官方系统中&#xff0c;将免费的全文集中在此&#xff0c…...

SQL零基础入门学习(三)

SQL零基础入门学习&#xff08;二&#xff09; SQL WHERE 子句 WHERE 子句用于提取那些满足指定条件的记录。 SQL WHERE 语法 SELECT column1, column2, ... FROM table_name WHERE condition;参数说明&#xff1a; column1, column2, …&#xff1a;要选择的字段名称&…...

苹果手机如何快速的直接从相册里面的图片提取文字?

//在线工具地址https://ocr.bytedance.zj.cn/image/ImageText在当今信息爆炸的时代&#xff0c;图文并茂已经成为了一个广告宣传的常用方式。然而&#xff0c;图片中的文字信息往往难以获取&#xff0c;尤其对于那些需要快速获取信息的人们来说&#xff0c;阅读图片中的文字会是…...

【go】函数调用

程序中编写的函数在编译阶段会被编译成一段段的指令存放在可执行文件中&#xff0c;在程序运行阶段这些内存会加载到虚拟地址空间的代码段。 当函数A调用了函数B的时候&#xff0c;对应的会生成一条call指令&#xff0c;程序在运行到call指令时就会跳转到对应的B函数的代码段的…...

Linux系统之Uboot、Kernel、Busybox思考之四

目录 三 内核的运行 9 设备树&#xff1a; 1) 设备树产生缘由 2) 设备树方案的流程 3) 有了上述概念&#xff0c;为了支撑整个设备树的工程实现&#xff0c;内核实现以下内容 4) 内核解析设备树 5) 入口分析 6) 解析处理。 10 udev devfs sysfs 11 系统中的USB设备 12 网…...

为什么要经常阅读和分析计算机SCI期刊论文? - 易智编译EaseEditing

训练阅读与分析期刊论文的能力&#xff0c;可以增加中长期的学术竞争力。 只要能够充分掌握阅读与分析期刊论文的技巧&#xff0c;就可以水到渠成地轻松进行「创新」的工作。 所以&#xff0c;只要深入掌握到阅读与分析期刊论文的技巧&#xff0c;就可以掌握到大学生不曾研习过…...

Shiro框架详解

1.Shiro简介 1.1.基本功能点 Shiro 可以非常容易的开发出足够好的应用&#xff0c;其不仅可以用在 JavaSE 环境&#xff0c;也可以用在 JavaEE 环境。Shiro 可以帮助我们完成&#xff1a;认证、授权、加密、会话管理、与 Web 集成、缓存等。 Authentication&#xff1a;身份…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...