拓端tecdat|拓端tecdat|R语言对NASA元数据进行文本挖掘的主题建模分析
原文链接:http://tecdat.cn/?p=9424
目录
什么是主题建模?
获取和整理NASA元数据
制作DocumentTermMatrix
LDA主题建模
探索建模
每个文档都属于哪个主题?
将主题建模连接到关键字
NASA有32,000多个数据集,我们有兴趣了解这些数据集之间的联系,以及与NASA以外其他政府组织中其他重要数据集的联系。让我们使用主题建模对描述字段进行分类,然后将其连接到关键字。
什么是主题建模?
主题建模是一种无监督的文档分类方法。此方法将每个文档建模为主题的混合,将每个主题建模为单词的混合。我将在这里用于主题建模的方法称为潜在Dirichlet分配(LDA),但还有其他适合主题模型的可能性。在本文中,每个数据集描述都是一个文档。我们将看看是否可以将这些描述文本作为主题进行建模。
获取和整理NASA元数据
让我们下载32,000多个NASA数据集的元数据 。
library(jsonlite)
library(dplyr)
library(tidyr)
names(metadata$dataset)
##\[1\] "_id""@type""accessLevel""accrualPeriodicity"
##\[5\] "bureauCode""contactPoint""description""distribution"
##\[9\] "identifier""issued""keyword""landingPage"
## \[13\] "language""modified""programCode""publisher"
## \[17\] "spatial""temporal""theme""title"
## \[21\] "license""isPartOf""references""rights"
## \[25\] "describedBy"
nasadesc <- data\_frame(id = metadata$dataset$`\_id`$`$oid`, desc = metadata$dataset$description)
nasakeyword <- data\_frame(id = metadata$dataset$`\_id`$`$oid`,
keyword = metadata$dataset$keyword) %>%
unnest(keyword)
nasakeyword <- nasakeyword %>% mutate(keyword = toupper(keyword))
检查一下,最常用的关键字是什么?
nasakeyword %>% group_by(keyword) %>% count(sort = TRUE)
## # A tibble: 1,616 x 2
##keywordn
##
## 1EARTH SCIENCE 14386
## 2OCEANS 10033
## 3PROJECT7463
## 4OCEAN OPTICS7324
## 5ATMOSPHERE7323
## 6OCEAN COLOR7270
## 7COMPLETED6452
## 8ATMOSPHERIC WATER VAPOR3142
## 9LAND SURFACE2720
## 10BIOSPHERE2449
## # ... with 1,606 more rows
创建DocumentTermMatrix 要进行主题建模,我们需要从tm包中创建一种特殊的矩阵(当然,“文档矩阵”只是一个通用概念)。行对应于文档(在本例中为描述文字),列对应于术语(即单词);它是一个稀疏矩阵。
让我们使用停用词来清理一下文本,以除去HTML或其他字符编码中残留的一些无用“词”。
## # A tibble: 1,909,215 x 3
##idwordn
##
## 155942a8ec63a7fe59b4986efsuit82
## 255942a8ec63a7fe59b4986efspace69
## 356cf5b00a759fdadc44e564adata41
## 456cf5b00a759fdadc44e564aleak40
## 556cf5b00a759fdadc44e564atree39
## 655942a8ec63a7fe59b4986ef pressure34
## 755942a8ec63a7fe59b4986efsystem34
## 855942a89c63a7fe59b4982d9em32
## 955942a8ec63a7fe59b4986efal32
## 10 55942a8ec63a7fe59b4986efhuman31
## # ... with 1,909,205 more rows
现在让我们来创建
DocumentTermMatrix
。## <>
## Non-/sparse entries: 1909215/1147350518
## Sparsity: 100%
## Maximal term length: 166
## Weighting: term frequency (tf)
LDA主题建模 现在,让我们使用topicmodels包创建一个LDA模型。我们将告诉算法进行多少个主题?这个问题很像k-means聚类中的问题;我们不提前知道。我们可以尝试一些不同的值,查看模型如何拟合文本。让我们从8个主题开始。
## A LDA_VEM topic model with 8 topics.
这是一种随机算法,根据算法的起始位置,其结果可能会有所不同。
探索建模 让我们整理模型,看看我们能找到什么。
## # A tibble: 287,288 x 3
##topictermbeta
##
## 11suit 2.591273e-40
## 22suit 9.085227e-61
## 33suit 1.620165e-61
## 44suit 2.081683e-64
## 55suit 9.507092e-05
## 66suit 5.747629e-04
## 77suit 1.808279e-63
## 88suit 4.545037e-40
## 91 space 2.332248e-05
## 102 space 2.641815e-40
## # ... with 287,278 more rows
β列告诉我们从该主题的文档中生成该单词的可能性。
【拓端tecdat|拓端tecdat|R语言对NASA元数据进行文本挖掘的主题建模分析】每个主题的前5个词是什么?
top_terms
## # A tibble: 80 x 3
##topictermbeta
##
## 11data 0.047596842
## 21set 0.014857522
## 31soil 0.013231077
## 41land 0.007874196
## 51files 0.007835032
## 61moisture 0.007799017
## 71surface 0.006913904
## 81file 0.006495391
## 91collected 0.006350559
## 101 measurements 0.005521037
## # ... with 70 more rows
让我们看一下。
ggplot(top_terms, aes(beta, term, fill = as.factor(topic))) +
geom_barh(stat = "identity", show.legend = FALSE, alpha = 0.8)
文章图片
我们可以看到在这些描述文本中占主导地位的词“数据”是什么。从关于土地和土地的词语到关于设计,系统和技术的词语,这些词语集合之间确实存在着有意义的差异。绝对需要进一步探索,以找到合适数量的主题并在这里做得更好。另外,标题和描述词是否可以结合用于主题建模?
每个文档都属于哪个主题? 让我们找出哪些主题与哪些描述字段(即文档)相关联。
lda_gamma
## # A tibble: 256,024 x 3
##document topicgamma
##
## 155942a8ec63a7fe59b4986ef1 7.315366e-02
## 256cf5b00a759fdadc44e564a1 9.933126e-02
## 355942a89c63a7fe59b4982d91 1.707524e-02
## 456cf5b00a759fdadc44e55cd1 4.273013e-05
## 555942a89c63a7fe59b4982c61 1.257880e-04
## 655942a86c63a7fe59b4980771 1.078338e-04
## 756cf5b00a759fdadc44e56f81 4.208647e-02
## 855942a8bc63a7fe59b4984b51 8.198155e-05
## 955942a6ec63a7fe59b496bf71 1.042996e-01
## 10 55942a8ec63a7fe59b4986f61 5.475847e-05
## # ... with 256,014 more rows
此处的γ列是每个文档属于每个主题的概率。请注意,有些非常低,有些更高。概率如何分布?
ggplot(lda_gamma, aes(gamma, fill = as.factor(topic))) +
geom_histogram(alpha = 0.8, show.legend = FALSE) +
facet_wrap(~topic, ncol = 4) +
scale\_y\_log10()
文章图片
y轴在此处以对数刻度绘制,因此我们可以看到一些东西。大多数文档都被归类为以下主题之一:许多文档被归类为主题2,而文档被归类为主题1和5则较不明确。一些主题的文档较少。对于任何单个文档,我们都可以找到它具有最高归属概率的主题。
将主题建模连接到关键字 让我们将这些主题模型与关键字联系起来,看看会发生什么。让我们 将此数据框添加到关键字,然后查看哪些关键字与哪个主题相关联。
lda_gamma
## # A tibble: 1,012,727 x 4
##document topicgammakeyword
##
## 155942a8ec63a7fe59b4986ef1 7.315366e-02JOHNSON SPACE CENTER
## 255942a8ec63a7fe59b4986ef1 7.315366e-02PROJECT
## 355942a8ec63a7fe59b4986ef1 7.315366e-02COMPLETED
## 456cf5b00a759fdadc44e564a1 9.933126e-02DASHLINK
## 556cf5b00a759fdadc44e564a1 9.933126e-02AMES
## 656cf5b00a759fdadc44e564a1 9.933126e-02NASA
## 755942a89c63a7fe59b4982d91 1.707524e-02 GODDARD SPACE FLIGHT CENTER
## 855942a89c63a7fe59b4982d91 1.707524e-02PROJECT
## 955942a89c63a7fe59b4982d91 1.707524e-02COMPLETED
## 10 56cf5b00a759fdadc44e55cd1 4.273013e-05DASHLINK
## # ... with 1,012,717 more rows
让我们保留属于某个主题的文档(概率\> 0.9),然后为每个主题找到最重要的关键字。
top_keywords
## Source: local data frame \[1,240 x 3\]
## Groups: topic \[8\]
##
##topickeywordn
##
## 12OCEAN COLOR4480
## 22OCEAN OPTICS4480
## 32OCEANS4480
## 41 EARTH SCIENCE3469
## 55PROJECT3464
## 65COMPLETED3057
## 78 EARTH SCIENCE2229
## 83OCEAN COLOR1968
## 93OCEAN OPTICS1968
## 103OCEANS1968
## # ... with 1,230 more rows
我们也对它们进行可视化。
ggplot(top_keywords, aes(n, keyword, fill = as.factor(topic)))
文章图片
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- C语言解方程的根和判断是否是闰年
- C语言的版本比较
- 【C】题目|【C语言】题集 of ⑥
- echart|echart 双轴图开发