主题模型Gensim入门系列之一:核心概念

2024-08-24 01:48

本文主要是介绍主题模型Gensim入门系列之一:核心概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本系列主要介绍 Gensim的基本概念,以及通过Gensim实现词向量训练、主题模型训练、文本相似度计算等常见任务。本系列不定时更新。

系列目录:

(1)主题模型Gensim入门系列之一:核心概念

(2)主题模型Gensim入门系列之二:语料和向量空间

(3)主题模型Gensim入门系列之三:主题和变换

(4)主题模型Gensim入门系列之四:文本相似度查询

————————————————————————————

0、 简介

Gensim是一个开源的python工具包,主要实现自然语言的词向量模型和主题模型,可以实现词向量转换、文本相似性计算和文本分类等应用,其官网的简介为:topic modelling for humans。

在该工具包中,实现了word2vec,fastext词向量模型,LSA和LDA主题模型等,用户可以调用简单的接口训练自己的embedding 向量和主题模型。

 

Gensim的官网为:https://radimrehurek.com/gensim/index.html

Gensim的github地址为:https://github.com/RaRe-Technologies/gensim

Gensim文档地址:https://radimrehurek.com/gensim/auto_examples/index.html

 

Gensim的安装方法为:pip install gensim

                                     conda install gensim

 

Gensim 有4个核心概念,分别为 Document、Corpus、Vector、Model,因为是核心概念,这里沿用英文的解释,并尝试翻译:

1、Document:some text.       文档:一些文本。

2、Corpus:a collections of documents    语料:文档的集合

3、Vector:a mathematically convenient representation of a document.  向量:文档的数值表达

4、Model:an algorithm for transforming vectors from one representation to another.  模型:将向量从一种表达转换为另一种表达的算法

以下对这四个概念分别介绍。

 

1、文档

简单的说,文档就是一段文本。比如一条短信、一条微博、一个自然段、一篇文章,甚至是一本书。可以看到,文档的范围是非常广泛的,这取决于你的研究对象,比如,你是研究一条短信的分类和一本书的分类,显然文档的对象大不相同。

 举例而言:

document = "Human machine interface for lab abc computer applications"

 

2、语料

语料是文档的集合,即多个文档。在Gensim中,语料主要作为两个角色出现:

    首先,在模型的训练阶段,模型通过输入的语料学习到隐含的主题,得到有效的模型参数。

    其次,在预测阶段,语料需要通过训练好的模型进行预测和组织,比如通过相似性分析将未知的文档归类。

值得注意的一点是,gensim主要提供无监督学习模型,也就是说,输入的语料不需要打标等任何人工的干预。

举例而言:

text_corpus = ["Human machine interface for lab abc computer applications","A survey of user opinion of computer system response time","The EPS user interface management system","System and human system engineering testing of EPS","Relation of user perceived response time to error measurement","The generation of random binary unordered trees","The intersection graph of paths in trees","Graph minors IV Widths of trees and well quasi ordering","Graph minors A survey",
]

以上仅为一个非常小型的语料示例,实际中的语料可能是规模非常大,通常会存储到文件中。

在得到一个语料之后,通常要进行一些预处理操作,最基本的操作为分词去除停用词。对于英文,gensim提供了gensim.utils.simple_preprocess()接口实现这个功能,而中文则要借助 jieba、Hanlp等分词工具实现这些功能。作为示例,我们把上面的语料作如下处理:

import pprint # 为了保证打印的格式比较好看# 创建停止词列表
stoplist = set('for a of the and to in'.split(' '))# 将所有文档进行大小写转换和根据空格分词
texts = [[word for word in document.lower().split() if word not in stoplist]for document in text_corpus]# 统计词频
from collections import defaultdict
frequency = defaultdict(int)
for text in texts:for token in text:frequency[token] += 1# 文档只保存词频大于1的词
processed_corpus = [[token for token in text if frequency[token] > 1] for text in texts]
pprint.pprint(processed_corpus)# 输出如下"""
[['human', 'interface', 'computer'],['survey', 'user', 'computer', 'system', 'response', 'time'],['eps', 'user', 'interface', 'system'],['system', 'human', 'system', 'eps'],['user', 'response', 'time'],['trees'],['graph', 'trees'],['graph', 'minors', 'trees'],['graph', 'minors', 'survey']]
"""

获得预处理的语料之后(processed_corpus),我们根据语料建立一个字典,字典对语料中的每一个单词赋予1个整数索引。建立字典采用gensim.corpora.Dictionary 类:

from gensim import corporadictionary = corpora.Dictionary(processed_corpus)
print(dictionary)#输出如下
"""
Dictionary(12 unique tokens: ['computer', 'human', 'interface', 'response', 'survey']...)
"""

根据上述处理后的语料,获得了一个包含12个单词的字典,可以通过以下方法获取所有词的索引:

pprint.pprint(dictionary.token2id)"""
{'computer': 0,'eps': 8,'graph': 10,'human': 1,'interface': 2,'minors': 11,'response': 3,'survey': 4,'system': 5,'time': 6,'trees': 9,'user': 7}
"""

 

3、向量

为了将文档输入模型进行训练,需要将文档转换为数值向量。

一种转换的方法是,统计每个词出现的次数,比如对于第一个文档: ['human', 'interface', 'computer'],三个单词在文档中各出现1次,假设三个单词在上述的字典中的编号分别为 1,2,0。则可以将该文档转换如下:[(1,1),(2,1),(0,1)],这种向量表达称为词袋表达

实现转换的方法如下:

bow_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(bow_corpus)#输出
"""
[[(0, 1), (1, 1), (2, 1)],[(0, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)],[(2, 1), (5, 1), (7, 1), (8, 1)],[(1, 1), (5, 2), (8, 1)],[(3, 1), (6, 1), (7, 1)],[(9, 1)],[(9, 1), (10, 1)],[(9, 1), (10, 1), (11, 1)],[(4, 1), (10, 1), (11, 1)]]"""

值得注意的一点是,以上示例由于规模较小,所以是直接加载到内存上统一处理的,在面对大规模语料的时候,gensim提供了迭代器的入口,可以实现迭代处理,从而减少内存的占用。

 

4、模型

上面将原始的语料转换成了向量表达,接下来就可以通过模型将初始的向量表达转换为另外一种表达。首先模型需要通过原始语料的向量进行训练。

以 tf-idf 模型为例,tf-idf 可以将原来的词袋表达转换为另外一种向量表达,代码如下:

from gensim import models# 利用语料训练tf-idf模型
tfidf = models.TfidfModel(bow_corpus)# 测试”system“和”minors“的转换
words = ["system","minors"]
print(tfidf[dictionary.doc2bow(words)])#输出
"""
[(5, 0.5898341626740045), (11, 0.8075244024440723)]
"""

其中,元组中的第二个元素表示输入语料(["system","minors"])中单词与在原始语料中的稀有性(区分性),即原始语料中出现的次数越少,则这个数值越大。从输出的结果可以看出,minors的权重比较大,说明minors在原始语料中出现的次数较少,它可以作为输入语料区分于原始语料的一个特征。这在找文本关键词或者主题词的时候是非常有用的。

训练后的模型还可以保存成模型文件,以便后续的使用。关于保存方法将在后面的部分加以介绍。

在训练完模型之后,你还可以在该模型的基础上做很多事情。比如查询文本之间的相似度,其中的一个方法如下:

from gensim import similarities# 针对语料建立相似度查询模型
index = similarities.SparseMatrixSimilarity(tfidf[bow_corpus], num_features=12)query_document = [system,engineering]
query_bow = dictionary.doc2bow(query_document)
sims = index[tfidf[query_bow]]
print(list(enumerate(sims)))#输出-得到查询文档[system,engineering]和语料所有文档的相似度
[(0, 0.0), (1, 0.32448703), (2, 0.41707572), (3, 0.7184812), (4, 0.0), (5, 0.0), (6, 0.0), (7, 0.0), (8, 0.0)]
# 通过排序就可以找出语料中,和输入文档最相似的文档

 

 

翻译和编辑自文档:Gensim-Core Concepts

这篇关于主题模型Gensim入门系列之一:核心概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101101

相关文章

Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)

《Python基于火山引擎豆包大模型搭建QQ机器人详细教程(2024年最新)》:本文主要介绍Python基于火山引擎豆包大模型搭建QQ机器人详细的相关资料,包括开通模型、配置APIKEY鉴权和SD... 目录豆包大模型概述开通模型付费安装 SDK 环境配置 API KEY 鉴权Ark 模型接口Prompt

基于Qt实现系统主题感知功能

《基于Qt实现系统主题感知功能》在现代桌面应用程序开发中,系统主题感知是一项重要的功能,它使得应用程序能够根据用户的系统主题设置(如深色模式或浅色模式)自动调整其外观,Qt作为一个跨平台的C++图形用... 目录【正文开始】一、使用效果二、系统主题感知助手类(SystemThemeHelper)三、实现细节

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费