首页 > 编程知识 正文

概率主题模型,lda主题模型示例

时间:2023-05-03 16:17:28 阅读:165029 作者:291

这篇文章主要是给不太喜欢数学的朋友们的,其中几乎没有使用公式。

目录

直观理解主题模型LDA的一般定义LDA分类原理LDA的精髓主题模型的简单应用-hsdxl邮件门1 .直观理解主题模型

听名字就应该知道他在说什么。 有一个文章text,用其中的话来判断他是什么类型的文章。 当文章中出现很多体育系的词,如篮球、足球等,主题模式就将其归为体育系文章。

主题模型涉及比较多的数学推导,所以首先用小栗子来理解其所做的事情。 假设有这样的场面:

我收到了一份资深HR应聘算法工程师的简历。 你想如何仅凭简历判断这个人是时尚的豆芽,还是彩笔呢? 他一般的做法是拿到这份简历,看看这个人简历里写的内容包含了什么。

在那之前,他一定也接触了很多算法工程师的面试。 他根据这些招募者的判断,俏皮的豆芽有以下可能性。

http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /这个HR是关于这个面试者是否穿着条纹衬衫,是否在BAT工作过,什么如果满足所有条件,就判断这个人很俏皮

这个例子和主题模型的关系可以用这张图表示:

在LDA眼里,相当于一个词袋。 每个袋子里都有很多话。 使用的时候,只要检查一下这些词是否出现就可以了。

公式可以表示为:

p )俏皮的豆芽|特征,简历)=这一特征在俏皮的豆芽中出现的次数俏皮的豆芽所具有的所有特征x这份简历属于俏皮的豆芽的特征个数

2.LDA的一般定义

什么是LDA?

这是一个不受监控的贝叶斯模型。 是以概率分布的形式给出文档集中每个文档的主题模型。 是无监督学习,训练时不需要手动标记的训练集。 需要的是文档集和指定主题的数量。 典型的词袋模型认为文档由一组词组成,词与词之间没有顺序或优先关系。 其主要优点是,对于每个主题,都能找到解释它的语言。

3.LDA分类原理

我先详细地写了贝叶斯模型的原理和它所表示的思想,请详细地进行说明。 虽然是不可思议的贝叶斯思想,但在这里简单说明一下其原理。 这里使用的是:

p (俏皮的豆芽|简历) (p )俏皮的豆芽) ) p )俏皮的豆芽) ) p )简历|俏皮的豆芽)经过一连串的导出,p )单词|文档) ) p )单词|话题)心跳加速

同一主题下,某个单词出现的概率、同一文档下,某个主题出现的概率、两个概率的乘积可以得到某个文档中单词出现的概率。 我们在训练的时候,调整这两个分布就可以了。

这样可以定义LDA的生成过程。

针对各文档,从主题分布中提取一个主题; (相当于左图)从与提取的主题对应的单词分布中随机提取一个单词; (右图)上述过程可以经过上述三个步骤直到扫描整个文档中的每个单词,然后通过查看两个分布的乘积是否符合给定文章的分布来调整。

稍微具体地说是3360(w表示单词; d表示文档;t代表主题; 大写字母表示总集合,小写字母表示个体。 )

D中的每个文档d都被视为一个单词串。

w1,w2,wn script type='math/tex; mode=display ' id=' math jax-element-80 '/script,wi表示第I个单词。

与d相关的所有不同的单词构成一个词汇表的大集合v(vocabulary ),假定LDA以文件集合d为输入,形成想要训练的两个结果向量) k个topic,v共有m个词) : )

结果向量1:针对每个d中的文档d计算对应于不同主题的概率d : pt1,ptk script type='math/tex; mode=display ' id=' math jax-element-82 '/script这里,pti表示d对应于k个主题中第I个主题的概率,计算方法也简单。 pti=d中所有词都在第I个主题中的d的所有词的总数结果向量2:对作为各t的主题t的mode=display ' id=' math jax-element-87 '/sc

ript>其中 pwi 表示主题 t 生成V中第i个单词的概率。计算方法:pwi=主题t对应到V中第i个单词出现的次数主题t下的所有单词总数

4.LDA的精髓

说了那么多,其实LDA的核心,仍然是这个公式:

P(词 | 文档)=P(词 | 主题)P(主题 | 文档) 用表达式如下: P(w|d)=P(w|t)∗P(t|d) 其实就是以主题为中间层,通过前面的两个向量( θd , ϕt ),分别给出 P(w|t),P(t|d) ,它的学习过程可以表示为:

LDA算法开始时,先随机地给 θd , ϕt 赋值(对所有的d和t)针对特定的文档 ds 中的第i单词 wi ,如果令该单词对应的主题为 tj ,可以把 上述公式改写为: Pj(wi|ds)=P(wi|tj)∗P(tj|ds) 枚举T中的主题,得到所有的 pj(wi|ds) .然后可以根据这些概率值的结果为 ds 中的第i个单词 wi 选择一个主题,最简单的就是取令 Pj(wi|ds) 概率最大的主题  tj 。如果 ds 中的第i个单词 wi 在这里选择了一个与原先不同的主题,就会对 θd , ϕt 有影响,他们的影响反过来影响对上面提到的 p(w|d) 的计算。

对文档集D中的所有文档d中的所有w进行一次 p(w|d) 计算,并重新选择主题看成是一次迭代。迭代n次之后就可收敛到LDA所需要的分类结果了。

5.主题模型的简单应用-hsdxl邮件门

我们如果不想要具体了解具体的数学公式推导,理解到这里就差不多了,重点是学会怎么使用?

我们用hsdxl邮件门那个案例,看一下应该怎么使用gensim来进行邮件分类。

from gensim import corpora, models, similaritiesimport gensimimport numpy as npimport pandas as pdimport redf = pd.read_csv("../input/平淡的面包.csv")# 原邮件数据中有很多Nan的值,直接扔了。df = df[['Id','ExtractedBodyText']].dropna()df.head()

数据样式:

做一个简单的预处理:

def clean_email_text(text): text = text.replace('n'," ") text = re.sub('-'," ",text) text = re.sub(r"d+/d+/d+", "", text) #日期,对主体模型没什么意义 text = re.sub(r"[0-2]?[0-9]:[0-6][0-9]", "", text) #时间,没意义 text = re.sub(r"[w]+@[.w]+", "", text) #邮件地址,没意义 text = re.sub(r"/[a-zA-Z]*[://]*[A-Za-z0-9-_]+.+[A-Za-z0-9./%&=?-_]+/i", "", text) #网址,没意义 pure_text = '' for letter in text: if letter.isalpha() or letter ==' ': pure_text += letter text = ' '.join(word for word in pure_text.split() if len(word)>1) return textdocs = df['ExtractedBodyText']docs = docs.apply(lambda x :clean_email_text(x))

看一下处理成啥样的:

docs.head(2).values

处理成一个一个词了

即:

[[一条邮件字符串],[另一条邮件字符串],...]

手写的停用词,这还有各色的别人写好的停用词:stopwords

stoplist = ['very', 'ourselves', 'am', 'doesn', 'through', 'me', 'against', 'up', 'just', 'her', 'ours', 'couldn', 'because', 'is', 'isn', 'it', 'only', 'in', 'such', 'too', 'mustn', 'under', 'their', 'if', 'to', 'my', 'himself', 'after', 'why', 'while', 'can', 'each', 'itself', 'his', 'all', 'once', 'herself', 'more', 'our', 'they', 'hasn', 'on', 'ma', 'them', 'its', 'where', 'did', 'll', 'you', 'didn', 'nor', 'as', 'now', 'before', 'those', 'yours', 'from', 'who', 'was', 'm', 'been', 'will', 'into', 'same', 'how', 'some', 'of', 'out', 'with', 's', 'being', 't', 'mightn', 'she', 'again', 'be', 'by', 'shan', 'have', 'yourselves', 'needn', 'and', 'are', 'o', 'these', 'further', 'most', 'yourself', 'having', 'aren', 'here', 'he', 'were', 'but', 'this', 'myself', 'own', 'we', 'so', 'i', 'does', 'both', 'when', 'between', 'd', 'had', 'the', 'y', 'has', 'down', 'off', 'than', 'haven', 'whom', 'wouldn', 'should', 've', 'over', 'themselves', 'few', 'then', 'hadn', 'what', 'until', 'won', 'no', 'about', 'any', 'that', 'for', 'shouldn', 'don', 'do', 'there', 'doing', 'an', 'or', 'ain', 'hers', 'wasn', 'weren', 'above', 'a', 'at', 'your', 'theirs', 'below', 'other', 'not', 're', 'him', 'during', 'which']

分词:
texts = [[word for word in doc.lower().split() if word not in stoplist] for doc in doclist]
texts[0]
当然还可以用包,比如jieba,bltk.
得到的就是一篇文档一个词袋。

建立预料库:每个单词用数字索引代替,得到一个数组。

dictionary = corpora.Dictionary(texts)corpus = [dictionary.doc2bow(text) for text in texts]

得到:

这个列表告诉我们,第14(从0开始是第一)个邮件中,一共6个有意义的单词(经过我们的文本预处理,并去除了停止词后)

其中,36号单词出现1次,505号单词出现1次,以此类推。。。

接着,我们终于可以建立模型了:

lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)lda.print_topic(10, topn=5)

得到第10号分类中,最常见的单词是:

‘0.007*kurdistan + 0.006*email + 0.006*see + 0.005*us + 0.005*right’
把五个主题打出来看一下: lda.print_topics(num_topics=5,num_words =6)

有空可以练一下gesim:
gensim使用指南

详细的推导:数学公式版下一篇文章介绍

参考:七月在线

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。