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

2024-08-24 01:48

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

系列目录:

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

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

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

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

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

 

本节主要介绍Gensim中从一个向量空间转换到另外一个向量空间的变换的概念,通过一个简单的语料加以说明,变换主要达到以下目的:

(1)揭示语料的隐含结构,发现单词之间的联系,并用它们来更具语义地描述文档

(2)使文档的描述更加紧凑,这种描述更加突出文档特征,同时更加高效。

 

1、创建语料

创建语料的方法和前两个部分的处理一样,即将原始文档进行分词,去除停止词、低频词和标点符号之后,得到每一个文档的单词列表。

from collections import defaultdict
from gensim import corporadocuments = ["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",
]# 去除停用词
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 documents
]# 去除只出现1次的词
frequency = defaultdict(int)
for text in texts:for token in text:frequency[token] += 1texts = [[token for token in text if frequency[token] > 1]for text in texts
]dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

 

2、创建一个变换

Gensim是一个标准的python对象,通过上述用于训练的语料进行初始化,代码如下:

from gensim import models
tfidf = models.TfidfModel(corpus)  # 初始话tf-idf变换模型

所谓的初始化,实际上就是用语料来训练模型。在tf-idf中,这种训练比较简单,只是扫描语料中的每一个单词并且统计词频。而在训练 Latent Semantic Analysis(LSA) 或者 Latent Dirichlet Allocation(LDA)等模型时,训练则要复杂得多,同时也比较耗时。

 

3、向量变换

在创建上述变换之后,tfidf 模型可以用于变换任何输入向量,将输入向量从一个向量空间转换到另外一个向量空间。

一个转换的示例如下:

doc_bow = [(0, 1), (1, 1)]
print(tfidf[doc_bow])  # 用tf-idf 转换模型#输出
"""
[(0, 0.7071067811865476), (1, 0.7071067811865476)]
"""

或者可以将转换应用到所有的语料中:

corpus_tfidf = tfidf[corpus]
for doc in corpus_tfidf:print(doc)#输出
"""
[(0, 0.5773502691896257), (1, 0.5773502691896257), (2, 0.5773502691896257)]
[(0, 0.44424552527467476), (3, 0.44424552527467476), (4, 0.44424552527467476), (5, 0.3244870206138555), (6, 0.44424552527467476), (7, 0.3244870206138555)]
[(2, 0.5710059809418182), (5, 0.4170757362022777), (7, 0.4170757362022777), (8, 0.5710059809418182)]
[(1, 0.49182558987264147), (5, 0.7184811607083769), (8, 0.49182558987264147)]
[(3, 0.6282580468670046), (6, 0.6282580468670046), (7, 0.45889394536615247)]
[(9, 1.0)]
[(9, 0.7071067811865475), (10, 0.7071067811865475)]
[(9, 0.5080429008916749), (10, 0.5080429008916749), (11, 0.695546419520037)]
[(4, 0.6282580468670046), (10, 0.45889394536615247), (11, 0.6282580468670046)]
"""

实际上,训练好的tf-idf模型可以应用于任何的输入文档,当然要保证输入文档的向量空间符合变换模型的格式。

另外,代码 corpus_tfidf = tfidf[corpus] 仅仅是产生了转换的迭代器,而计算则是延迟的,后续可以通过迭代实现计算。这样做的原因是为了减少内存的额占用。

向量空间可以进行连续变换,比如在变换得到 tf-idf 的向量空间之后,还可以进一步变换,形成一个变换链,一个示例代码如下所示:

lsi_model = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=2)  # 初始化一个LSI模型# 将训练的 lsi_model打印出来
lsi_model.print_topics(2)"""
[(0,'0.703*"trees" + 0.538*"graph" + 0.402*"minors" + 0.187*"survey" + 0.061*"system" + 0.060*"time" + 0.060*"response" + 0.058*"user" + 0.049*"computer" + 0.035*"interface"'),(1,'-0.460*"system" + -0.373*"user" + -0.332*"eps" + -0.328*"interface" + -0.320*"response" + -0.320*"time" + -0.293*"computer" + -0.280*"human" + -0.171*"survey" + 0.161*"trees"')]
"""

从打印结果可以看出,“trees”,“graph”,“minors” 都是相关的单词,并且对第1个主题贡献最大,第2个主题则几乎和所有的单词相关。

我们将训练后的lsi_model将原始语料进行转化,并打印:

# 在原始语料的基础上,创建两层包装器: bow->tfidf->fold-in-lsi
corpus_lsi = lsi_model[corpus_tfidf]# 原始语料的变换在之前其实没有执行,而是在这一步迭代执行
for doc, as_text in zip(corpus_lsi, documents):print(doc, as_text)# 输出
"""
[(0, 0.06600783396090627), (1, -0.520070330636184)] Human machine interface for lab abc computer applications
[(0, 0.1966759285914279), (1, -0.760956316770005)] A survey of user opinion of computer system response time
[(0, 0.08992639972446735), (1, -0.7241860626752503)] The EPS user interface management system
[(0, 0.07585847652178428), (1, -0.6320551586003422)] System and human system engineering testing of EPS
[(0, 0.10150299184980327), (1, -0.5737308483002963)] Relation of user perceived response time to error measurement
[(0, 0.7032108939378309), (1, 0.16115180214026148)] The generation of random binary unordered trees
[(0, 0.8774787673119828), (1, 0.16758906864659825)] The intersection graph of paths in trees
[(0, 0.9098624686818573), (1, 0.14086553628719417)] Graph minors IV Widths of trees and well quasi ordering
[(0, 0.6165825350569281), (1, -0.053929075663891594)] Graph minors A survey
"""

从输出的结果可以看出,前5个语料和第2个主题关联度比较大,而后4个语料和第1个主题关联度比较大。

同样的,我们可以保存和加载训练好的模型:

# 模型保存
lsi_model.save(tmp.name)  # 所有的模型都用该方法保存,比如 TF-IDF,LDA,LSI等#模型加载
loaded_lsi_model = models.LsiModel.load(tmp.name)

 

4、Gensim中实现的主题变换模型

在Gensim中,实现了常用的主题变换模型,先简单介绍如下:

(1)TF-IDF(Term Frequency * Inverse Document Frequency,文档频率*逆文档频率)

TF-IDF模型的训练输入为词袋向量(整数值)。在训练之后的变换中,TF-IDF模型输入一个词袋向量,并得到同样维度的变换向量。变换后的向量输出单词在训练语料中的稀有程度,越稀有,则值越大(该值为实数)。这个值可以进行归一化设置,使它的取值范围在0~1之间:

model = models.TfidfModel(corpus, normalize=True)

(2)LSI(Latent Semantic Indexing,潜在语义索引)

LSI 模型的独特之处在于,它可以在任何时间点继续训练,只需要提供更多的训练文本(document),这主要是因为模型的增量式更新的。因此LSI模型可以一直训练,同时随时用于变换。代码样例如下所示:

lsi_model.add_documents(another_tfidf_corpus)  # lsi_model 是用tfidf_corpus训练好的模型,接着用another_tfidf_corpus 进行增量训练lsi_vec = lsi_model[tfidf_vec]  # 将一些 tfidf向量进行转换lsi_model.add_documents(more_documents)  # 进一步增量训练
lsi_vec = lsi_model[tfidf_vec] # 再次利用训练后的模型进行转换

关于gensim 中lsi模型的使用请参考:gensim.models.lsimodel 

(3)RP(Random Projections,随机投影)

RP方法用于向量降维,这是一个通过一些随机性来估计文档之间的 tf-idf 距离的非常高效的方法(内存和CPU)。推荐的维度一般为几百或者几千,视文档的数量而定。

model = models.RpModel(tfidf_corpus, num_topics=500)

(4)LDA(Latent Dirichlet Allocation,潜在狄利克雷分布)

LDA 是另外一个从词袋向量转换到低维主题空间的模型。LDA是LSA(或者叫多项式PCA)在概率上的拓展,因此LDA 主题模型可以将单词以概率的方式解释。这些概率分布是通过用于训练的语料训练所得,由此,文本可以解释为这些主题的概率混合。

model = models.LdaModel(corpus, id2word=dictionary, num_topics=100)

(5)HDA(Hierarchical Dirichlet Process,层次狄利克雷过程)

HDA是一个非参数的贝叶斯方法(注意不需要指定主题的数量)

model = models.HdpModel(corpus, id2word=dictionary)

值得注意的是,HDA在gensim中是新增模型,同时这个模型处于学术研究阶段。

最后,需要强调的是,所有的模型都不需要一次性提供所有的语料,而可以通过迭代的方式进行训练。

 

翻译和编辑自:Topics and Transformations

 

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



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

相关文章

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%免费

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言