当前位置:   article > 正文

主题建模入门指南(python)

主题建模

简介

所谓分析,通常都是指从数据中获取“信息”。近来,随着数据迅猛增长——其中绝大多数数据是非结构的,要想获得相关想要的信息变成越来越困难。庆幸地是,与此同时出现了一些强大的方法来帮助我们从这些数据中抽取出我们想要的信息。

文本挖掘领域中这样相关的一种技术是主题建模。正如其名,主题建模能够从一个文本对象中自动识别它的主题,并且发现隐藏的模式。这些能够帮助做出更好的决策。

主题建模和那些基于规则的文本挖掘方法不同(这些方法使用了正则表达式或者基于字典的关键词搜索技术),它是一种无监督方法,用来从大规模的文本集中发现词群(也就是“主题”)。

主题模型在文本聚类、大规模文本数据组织、基于非结构文本的信息检索以及特征选择方面非常有用。例如,纽约时报使用主题模型来强化他们的用户-文章推荐引擎。一些专家在招聘行业使用主题模型来抽取工作描述中的潜在特征并将他们和合适的应聘人匹配。主题建模还被用来组织大量的邮件、消费者评论以及用户社交媒体档案。
这里写图片描述
如果你不熟悉主题建模的整个流程,通过使用python实现,这篇指南能够给你介绍很多相关的概念。

目录

 LDA主题建模
–LDA的参数
 Python实现
– 文档准备
– 清洗及预处理
– 文本词矩阵准备
– LDA建模
– 结果
 提高主题建模结果的一些技巧
– 词频过滤(Frequency Filter)
– 词性标注过滤(Part of Speech Tag Filter)
– (Batch Wise LDA)
 基于主题建模的特征选择

LDA主题建模

有很多种从文本中获取主题的方法,比如TF-IDF、非负矩阵因式分解技术。本文要讨论的隐狄利克雷分布是最流行的主题建模技术。

LDA假设文档是从一个主题集合产生来的。这些主题会基于它们的概率分布产生词。在给定一个文本集的情况下,LDA首先会回溯并试图指出是哪些主题创建了这些文本。

LDA是一种矩阵因式分解技术。向量空间中,任何语料库(文本集)都能够用一个文本-词矩阵表示。下面的矩阵表示一个有N个文本(D1,D2,…,Dn)及词典大小为M(也就是总共M个词:W1,W2,…Wm)组成的语料库。(i,j)单元格中的值代表词Wj在文本Di中出现的频次。
W1 W2 W3 Wm
D1 0 2 1 3
D2 1 4 0 0
D3 0 2 3 1
Dn 1 1 3 0
LDA将该文本-词矩阵分解为两个低维度的矩阵-M1和M2。M1是一个维度为(N,k)的文本-主题矩阵,M2是维度为(k,M)主题-词矩阵。其中N是文本数,K是主题数,M是词典大小。

K1  K2  K3  K
  • 1

D1 1 0 0 1
D2 1 1 0 0
D3 1 0 0 1
Dn 1 0 1 0

W1  W2  W3  Wm
  • 1

K1 1 0 0 1
K2 1 1 0 0
K3 1 0 0 1
K 1 0 1 0
这两个矩阵已经提供了主题-词和文本-主题分布。但是,需要改良这些分布,这就是LDA的目的。为了改良这些矩阵,LDA使用了抽样技术。
它会迭代每篇文本“d”的每个词“w”并给当前的主题-词值分配一个新值。词“w”重新分配为“k”的概率为P,P是p1和p2的乘积(a product of two probabilities p1 and p2)。
对于每个主题,p1和p2是计算来的。P1:p(主题t|文本d)=文本中划分为主题t的词的占比。P2:p(词w|主题t)=所有划分为主题t的所有文本中,出现了词w的文本的占比。

当前的主题-词值会以概率p1Xp2更新成一个新主题。模型假定除了当前的词外,其他存在的主题-词分配都是正确的。本质上,这个概率是主题t产生词w的概率,因此,以一个新的概率更改当前词的主题是有意义的。

多次迭代后会达到一个稳态,这时候的文本-主题和主题-词分布就会变的较好。LDA在这点上收敛。

LDA的参数

alpha和Beta超参数——alpha代表文本-主题密度,Beta代表主题-词密度。alpha越高,代表文本的主题越多,反之亦然。另一方面,beta越高,主题的词集越大,反之亦然。

主题数量——从语料库中抽取的主题数。很多研究者使用KL散度分值来创建方法去获取最优的主题数量。因为牵涉到太多数学问题,所以不会在这里讨论。如果想要理解这块,可以参考这篇文献【http://link.springer.com/chapter/10.1007%2F978-3-642-13657-3_43】。
主题的词数——组成单个主题的词数。按需来定。如果是抽取主题或者概念,推荐选择高值,而如果是抽取特征或者词类目,推荐更低值。
迭代次数——LDA算法收敛允许的最大迭代次数。

在python中运行

文档准备

以下是组成语料库的抽样文本集:

doc1 = "Sugar is bad to consume. My sister likes to have sugar, but not my father."
doc2 = "My father spends a lot of time driving my sister around to dance practice."
doc3 = "Doctors suggest that driving may cause increased stress and blood pressure."
doc4 = "Sometimes I feel pressure to perform well at school, but my father never seems to drive my sister to do better."
doc5 = "Health experts say that Sugar is not good for your lifestyle."
# compile documents
doc_complete = [doc1, doc2, doc3, doc4, doc5]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

清洗及预处理

清洗是任何文本挖掘任务前非常重要的一步,通常在这步中会清除标点符号、停用词和标准化语料库。

from nltk.corpus import stopwords 
from nltk.stem.wordnet import WordNetLemmatizer
import string
stop = set(stopwords.words('english'))
exclude = set(string.punctuation) 
lemma = WordNetLemmatizer()
def clean(doc):
    stop_free = " ".join([i for i in doc.lower().split() if i not in stop])
    punc_free = ''.join(ch for ch in stop_free if ch not in exclude)
    normalized = " ".join(lemma.lemmatize(word) for word in punc_free.split())
    return normalized
doc_clean = [clean(doc).split() for doc in doc_complete]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

文本-词矩阵准备

为了在文本语料库上运行任何数学模型,比较好的方式是将语料库转换成矩阵表示。LDA模型会在整个文本-词矩阵上寻找重复的词模式。Python提供了很多强大的文本挖掘库,比如“gensim”——可扩展、健壮以及效率高。下面是如果将一个语料转换成文本-词矩阵的代码。

# Importing Gensim
import gensim
from gensim import corpora

# Creating the term dictionary of our courpus, where every unique term is assigned an index. dictionary = corpora.Dictionary(doc_clean)

# Converting list of documents (corpus) into Document Term Matrix using dictionary prepared above.
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

执行LDA模型
接下来创建一个LDA模型对象并在文本-词矩阵上训练。训练需要一些上面介绍过的参数。gensim模块即可以从一个训练语料库中训练出LDA模型,同时又可以预测新的未知文本的主题分布。

# Creating the object for LDA model using gensim library
Lda = gensim.models.ldamodel.LdaModel

# Running and Trainign LDA model on the document term matrix.
ldamodel = Lda(doc_term_matrix, num_topics=3, id2word = dictionary, passes=50)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

结果

print(ldamodel.print_topics(num_topics=3, num_words=3))
['0.168*health + 0.083*sugar + 0.072*bad,
'0.061*consume + 0.050*drive + 0.050*sister,
'0.049*pressur + 0.049*father + 0.049*sister]
  • 1
  • 2
  • 3
  • 4
  • 5

每一行是由主题词及权重构成的一个主题。第一个主题可以看做“坏健康”,第三个主题可称之为“家庭”

优化主题建模结果的一些小技巧

主题模型的结果完全依赖于语料库中的特征(词)。一个表示语料库的文本-词矩阵通常是非常稀疏的。对矩阵降维能够提高主题建模的结果。根据我的个人经验,有一些方法可以实现降维。
词频过滤——对词按词频排序。哪些频率高的词相对于频率低的词,更有可能出现在结果中。低频词本质上是语料库的弱特征,因此将这些弱特征移除不失为一种好办法。对词及词频进行探索性分析能够帮助决定过滤的词频的 阈值。
词性标签过滤——词性标签过滤关心的不是特征的频次,而是特征的上下文语境。主题建模尝试将频繁模式转换成主题。但是,在语境中,并不是每个词都是同等重要的。比如,词性标签“IN”包含诸如“within”,”upon”,”except”类的词;”CD”包含“one”,”two”,”hundred”等。这些词是语言的辅助词,可以移除。
基于主题建模的特征选择(略)

文章来源
https://www.analyticsvidhya.com/blog/2016/08/beginners-guide-to-topic-modeling-in-python/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/425497
推荐阅读
相关标签
  

闽ICP备14008679号