原文链接:http://tecdat.cn/?p=6917
我尝试使用Latent Dirichlet分配LDA来提取一些主题。 本教程以端到端的自然语言处理流程为特色,从原始数据开始,贯穿准备,建模,可视化论文。
我们将涉及以下几点
使用LDA进行主题建模
使用pyLDAvis可视化主题模型
使用t-SNE和散景可视化LDA结果
In [1]:
In [2]:
预处理和矢量化文档
In [3]:
In [4]:
计算双字母组/三元组:
正弦主题非常相似,可以区分它们是短语而不是单个/单个单词。
In [5]:
删除
In [6]:
修剪常见和罕见的单词,我们最终只有大约6%的单词。
矢量化数据:
第一步是获得每个文档的单词表示。
In [7]:
In [8]:
通过词袋语料库,我们可以继续从文档中学习我们的主题模型。
训练LDA模型
In [9]:
In [10]:
如何选择主题数量?
LDA是一种无监督的技术,这意味着我们在运行模型之前不知道在我们的语料库中有多少主题存在。 主题连贯性是用于确定主题数量的主要技术之一。
但是,我使用了LDA可视化工具pyLDAvis,尝试了几个主题并比较了结果。 四个似乎是最能分离主题的最佳主题数量。
In [11]:
In [12]:
Out[12]:
我们在这看到什么?
左侧面板,标记为Intertopic Distance Map,圆圈表示不同的主题以及它们之间的距离。类似的主题看起来更近,而不同的主题更远。图中主题圆的相对大小对应于语料库中主题的相对频率。
如何评估我们的模型?
将每个文档分成两部分,看看分配给它们的主题是否类似。 =>越相似越好
将随机选择的文档相互比较。 =>越不相似越好
In [13]:
Transform the data
In [14]:
In [15]:
让我们看一下每个主题中出现的术语。
In [17]:
In [18]:
从上面可以检查每个主题并为其分配一个人类可解释的标签。 在这里我将它们标记如下:
In [19]:
In [20]:
'''
# 1. Remove non-letters
paper_text = re.sub("[^a-zA-Z]"," ", paper)
# 2. Convert words to lower case and split them
words = paper_text.lower().split()
# 3. Remove stop words
words = [w for w in words if not w in stops]
# 4. Remove short words
words = [t for t in words if len(t) > 2]
# 5. lemmatizing
words = [nltk.stem.WordNetLemmatizer().lemmatize(t) for t in words]
In [21]:
In [22]:
In [23]:
In [24]:
In [25]:
In [26]:
In [27]:
BokehJS 0.12.5成功加载。
In [28]:
In [29]: