数据科学与大数据分析之项目4-主题建模

项目介绍

使用python在Reuters-21578语料库上进行LDA主题建模。
The NLTK in Python comes with the Reuters-21578 corpus. Install the nltp python package:
pip3 install --user -U nltk
要导入这个文集,在Python提示符中输入以下命令:

import nltk
nltk.download(‘reuters’)
reuters.readme()
reuters.categories()
reuters.raw()

本项目包含:

  1. 路透社21578语料库介绍。

  2. 每个文档的实现。

  3. 将LDA应用于该语料库进行主题建模。

  4. LDA中参数的设置与含义。

  5. 代码的输出与主题的可视化

项目开始

  1. 路透社21578语料库介绍。

21578集合分布在22个文件中。前21个文件包含1000个文档,而最后一个文件包含578个文档。另外,所有文件均为SGML格式。
每个文件都以文档类型声明行开头:

这意味着dtd文件lewis.dtd包含在发行版中

下面几行是用SGML标记标记的路透社文章。
在这里插入图片描述
关于 reut2-000.sgm (上图), 这个文件的第二行是第一篇文章的“打开标签”。我们可以得到这篇文章在Reuters-21578中的ID为1,并在实验室中作为训练样本使用。

在这里插入图片描述

每篇文章的结尾都有一个“结束标记”,形式如下:

上图显示了reut2-000.sgm中第一篇文章的结束标签,以及“open tag”和“close tag”是他们行中唯一的词。结束标记之后的下一行是打开下一篇文章的标签,在图中我们可以看到下一篇文章的ID在Reuters-21578中是2。

对于这些类别,路透社21578中有五组不同的内容相关类别,分别是交流、组织、人员、地点和主题 (EXCHANGES, ORGS, PEOPLE, PLACES and TOPICS)。有五个txt文件描述每个分类系统中包含的类别(下图)。
在这里插入图片描述
让我们打开五个txt文件中的一个,例如all-topics-strings.ls.txt
在这里插入图片描述

从上图我们可以得到一些话题,比如大麦、咖啡和棉油,它们都是与经济相关的东西。

在这个任务中,我们使用了来自python-NLTK的Reuters-21578语料库,这个语料库是ApteMod版本,它是一个用于文本分类的公共版本语料库。

ApteMod是路透社财经通讯社10788份文档的集合,分为7769份文档的训练集和3019份文档的测试集,语料库中有90个类别,每个文档属于一个或多个类别。

  1. 每个文档的实现。

对于我们的实现,首先我们从所有文档中获取原始单词。
在这里插入图片描述
第二,实现数据清理。
包含 stemmer, stopwords, remove punctuation and lemmatized.
在这里插入图片描述
第三,将干净的数据转换成词袋字典,并将字典转换成特征向量。词包表示所有干净的数据词,忽略顺序、上下文、推理和语义,特征向量可以表示每个词在词典中的出现频率。
在这里插入图片描述
3. 将LDA应用于该语料库进行主题建模。

(1)准备文档
首先,我们导入必要的库和包。
在这里插入图片描述
这里我们需要使用来自NLTK包的路透语料库。
在这里插入图片描述
因此,我们首先读取原始文件以供进一步使用。

(2)数据预处理
数据处理是主题建模的重要组成部分。由于英语语言的多样化,一个词可能有多种表现形式,例如be动词可以写成is或are,过去式可以写成was和were。为了确保模型能够准确识别不同形状的单词,我们需要找到单词的原始形式,这个过程称为lemmatize. Lemmatization并不是唯一的问题,另一个问题是单词后面的后缀,比如play和played,playing,它们都是play,但是后缀不同,找到主单词的行为叫做词干化。这个porter’s algorithm是一种流行的词干分析方法。在完成这两个问题之后,我们已经完成了single word layer的处理。在英语中,有许多高频词没有特定的含义,通常在搜索引擎和文本处理过程中,这些词被称为“stopwords”,因此我们也需要排除所有这些“stopwords”和那些有用但毫无意义的标点符号。
在这里插入图片描述
上图为Stopwords。
下图为Punctuation
在这里插入图片描述
在这里插入图片描述
数据清理实现。

(3)文档Term matrix
要进行LDA主题建模,最重要的一点是根据给定的数据集构造一个bow (bag of words)和相应的向量。

在这里插入图片描述
根据给定的原始数据创建一个bow,并构造一个矩阵

(4)构建LDA模型
genism模块提供了一个LDA模型,它可以根据给定的文档生成可能的主题类别,这里我们使用了内置的LDA模型。

在这里插入图片描述
(5)结果
输出显示主题和相关的单词。
在这里插入图片描述
4. LDA中参数的设置与含义。

在这里插入图片描述
在LDA模型中,我们有三个参数。

第一个参数是语料库,这是一个文档向量流,用于进一步的映射和模型构建。如果将其留空,则此模型将是未经训练的模型。第二个参数是id2word,它将向量中的id转换为单词。第三个参数是num_topic,这是手动设置的主题号,这将是模型生成的最终主题号。这里我们使用了6,因为经过几次测试,我们发现6个topic是最好的结果。
Topic num = 10:
在这里插入图片描述
在这里插入图片描述
If set the topic num as 10, more ‘smaller’ topics, making these result less reliable.

Topic num = 8:
在这里插入图片描述

在这里插入图片描述
在这里我们可以看到,有些主题太小,无法识别和分析,因此,我们决定选择6作为主题号。

  1. 代码的输出与主题的可视化
    (1) Topic 1
    在这里插入图片描述
    左边的协调系统显示了不同话题的流行程度,圈子越大,话题越流行。圆心之间的距离显示了主题的相对性,越靠近圆心意味着两个主题的相对性越强。

在右边,我们可以看到每个主题和相关主题词的百分比,蓝色条表示所有文档中的总体频率,红色条表示给定主题中的频率(估计值)。

如果我们将相关性度量设置为0,则单词将按升力值降序排序,这意味着在预测文章主题时,最前面的单词是更可靠的特征。如果给定的文章/段落显示了最前面的单词,则该文档属于该主题的概率相对较高(最前面的单词更具代表性)。
在这里插入图片描述
如果我们将相关性度量设为1,那么图表会给出最流行的词,这确实显示出一种趋势,但是频率本身在预测主题时不是很可靠,例如,在许多主题中,“said”是最频繁的词,但是“said”是一个中性词,它没有携带太多有用的信息主题。因此,我们选择升力值较高的词作为话题词。

总结:
Percentage of topic 1: 4.5%
Topic words of topic 1: murakhovsky, receiving, person, bearish, 57

(2) Topic 2

在这里插入图片描述
在这里插入图片描述
总结:
Percentage of topic 2: 61.5%
Topic words of topic 2: csr, 4, pesch, 615, study…

(3) Topic 3
rm = 0
在这里插入图片描述
rm = 1在这里插入图片描述
总结::
Percentage of topic 3: 0.1%
Topic words of topic 3: unqualified, sterlingbased, 2385, 10586, ltjwp…

(4) Topic 4

rm = 0
在这里插入图片描述
rm = 1
在这里插入图片描述

总结:
Percentage of topic 4: 9.4%
Topic words of topic 4: 250000, 765, Kampuchea, kerosene, ziering…

(5) Topic 5
rm = 0
在这里插入图片描述
rm = 1
在这里插入图片描述
总结:
Percentage of topic 5: 3.7%
Topic words of topic 5: hole, discretionary, exchangeable, murahovsky, construed…

(6) Topic 6.
rm = 0
在这里插入图片描述
rm = 1
在这里插入图片描述
总结:
Percentage of topic 6: 20.8%
Topic words of topic 6: resident, esso, buyout, del, tachonics…

Reference

https://www.programcreek.com/python/example/126583/nltk.corpus.reuters.words
https://www.nltk.org/book/ch02.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值