1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 拓端tecdat|R语言对NASA元数据进行文本挖掘的主题建模分析

拓端tecdat|R语言对NASA元数据进行文本挖掘的主题建模分析

时间:2019-08-18 07:27:55

相关推荐

拓端tecdat|R语言对NASA元数据进行文本挖掘的主题建模分析

原文链接:/?p=9424

原文出处:拓端数据部落公众号

目录

什么是主题建模?

获取和整理NASA元数据

制作DocumentTermMatrix

LDA主题建模

探索建模

每个文档都属于哪个主题?

将主题建模连接到关键字

NASA有32,000多个数据集,我们有兴趣了解这些数据集之间的联系,以及与NASA以外其他政府组织中其他重要数据集的联系。让我们使用主题建模对描述字段进行分类,然后将其连接到关键字。

相关视频:文本挖掘:主题模型(LDA)及R语言实现分析游记数据

文本挖掘:主题模型(LDA)及R语言实现分析游记数据

时长12:59

什么是主题建模?

主题建模是一种无监督的文档分类方法。此方法将每个文档建模为主题的混合,将每个主题建模为单词的混合。我将在这里用于主题建模的方法称为潜在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## <chr> <int>## 1 EARTH SCIENCE 14386## 2 OCEANS 10033## 3 PROJECT 7463## 4 OCEAN OPTICS 7324## 5ATMOSPHERE 7323## 6 OCEAN COLOR 7270## 7COMPLETED 6452## 8 ATMOSPHERIC WATER VAPOR 3142## 9 LAND SURFACE 2720## 10BIOSPHERE 2449## # ... with 1,606 more rows

创建DocumentTermMatrix

要进行主题建模,我们需要从tm包中创建一种特殊的矩阵(当然,“文档矩阵”只是一个通用概念)。行对应于文档(在本例中为描述文字),列对应于术语(即单词);它是一个稀疏矩阵。

让我们使用停用词来清理一下文本,以除去HTML或其他字符编码中残留的一些无用“词”。

## # A tibble: 1,909,215 x 3##idwordn## <chr> <chr> <int>## 1 55942a8ec63a7fe59b4986efsuit 82## 2 55942a8ec63a7fe59b4986ef space 69## 3 56cf5b00a759fdadc44e564adata 41## 4 56cf5b00a759fdadc44e564aleak 40## 5 56cf5b00a759fdadc44e564atree 39## 6 55942a8ec63a7fe59b4986ef pressure 34## 7 55942a8ec63a7fe59b4986ef system 34## 8 55942a89c63a7fe59b4982d9 em 32## 9 55942a8ec63a7fe59b4986ef al 32## 10 55942a8ec63a7fe59b4986ef human 31## # ... with 1,909,205 more rows

现在让我们来创建DocumentTermMatrix

## <<DocumentTermMatrix (documents: 3, terms: 35911)>>## 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## topic term beta## <int> <chr> <dbl>## 11 suit 2.591273e-40## 22 suit 9.085227e-61## 33 suit 1.65e-61## 44 suit 2.081683e-64## 55 suit 9.507092e-05## 66 suit 5.747629e-04## 77 suit 1.808279e-63## 88 suit 4.545037e-40## 91 space 2.332248e-05## 102 space 2.641815e-40## # ... with 287,278 more rows

β列告诉我们从该主题的文档中生成该单词的可能性。

每个主题的前5个词是什么?

top_terms

## # A tibble: 80 x 3## topic term beta## <int> <chr> <dbl>## 11 data 0.047596842## 21set 0.014857522## 31 soil 0.013231077## 41 land 0.007874196## 51 files 0.007835032## 61moisture 0.007799017## 71surface 0.006913904## 81 file 0.006495391## 91 collected 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 topic gamma## <chr> <int> <dbl>## 1 55942a8ec63a7fe59b4986ef1 7.315366e-02## 2 56cf5b00a759fdadc44e564a1 9.933126e-02## 3 55942a89c63a7fe59b4982d91 1.707524e-02## 4 56cf5b00a759fdadc44e55cd1 4.273013e-05## 5 55942a89c63a7fe59b4982c61 1.257880e-04## 6 55942a86c63a7fe59b4980771 1.078338e-04## 7 56cf5b00a759fdadc44e56f81 4.208647e-02## 8 55942a8bc63a7fe59b4984b51 8.198155e-05## 9 55942a6ec63a7fe59b496bf71 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 topic gamma keyword## <chr> <int> <dbl> <chr>## 1 55942a8ec63a7fe59b4986ef1 7.315366e-02 JOHNSON SPACE CENTER## 2 55942a8ec63a7fe59b4986ef1 7.315366e-02 PROJECT## 3 55942a8ec63a7fe59b4986ef1 7.315366e-02 COMPLETED## 4 56cf5b00a759fdadc44e564a1 9.933126e-02DASHLINK## 5 56cf5b00a759fdadc44e564a1 9.933126e-02 AMES## 6 56cf5b00a759fdadc44e564a1 9.933126e-02 NASA## 7 55942a89c63a7fe59b4982d91 1.707524e-02 GODDARD SPACE FLIGHT CENTER## 8 55942a89c63a7fe59b4982d91 1.707524e-02 PROJECT## 9 55942a89c63a7fe59b4982d91 1.707524e-02 COMPLETED## 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]## ## topic keywordn## <int> <chr> <int>## 12 OCEAN COLOR 4480## 22 OCEAN OPTICS 4480## 32 OCEANS 4480## 41 EARTH SCIENCE 3469## 55 PROJECT 3464## 65COMPLETED 3057## 78 EARTH SCIENCE 2229## 83 OCEAN COLOR 1968## 93 OCEAN OPTICS 1968## 103 OCEANS 1968## # ... with 1,230 more rows

我们也对它们进行可视化。

ggplot(top_keywords, aes(n, keyword, fill = as.factor(topic)))

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。