创建术语频率矩阵

解决问题的最简单方法(迄今为止最常用的方法)是将句子分成标记。简化,单词对使用和接收它们的人有抽象和主观意义,令牌有一个客观的解释:一个有序的字符序列(或字节)。一旦句子被分割,令牌的顺序就会被忽略。这种方法的问题在于称为字袋模型。

一个术语频率是一个字典,其中对每个令牌被分配一个权重。在第一个例子中,我们使用 R 包 tm 从语料库语料库文档集合 ) 构造术语频率矩阵。

require(tm)
doc1 <- "drugs hospitals doctors"
doc2 <- "smog pollution environment"
doc3 <- "doctors hospitals healthcare"
doc4 <- "pollution environment water"
corpus <- c(doc1, doc2, doc3, doc4)
tm_corpus <- Corpus(VectorSource(corpus))

在这个例子中,我们创建了一个由 tm 包定义的类 Corpus 语料库,它包含两个函数 CorpusVectorSource,它们从一个字符向量返回一个 VectorSource 对象。对象 tm_corpus 是一个列表,我们的文档带有附加(和可选)元数据来描述每个文档。

str(tm_corpus)
List of 4
 $ 1:List of 2
  ..$ content: chr "drugs hospitals doctors"
  ..$ meta   :List of 7
  .. ..$ author       : chr(0) 
  .. ..$ datetimestamp: POSIXlt[1:1], format: "2017-06-03 00:31:34"
  .. ..$ description  : chr(0) 
  .. ..$ heading      : chr(0) 
  .. ..$ id           : chr "1"
  .. ..$ language     : chr "en"
  .. ..$ origin       : chr(0) 
  .. ..- attr(*, "class")= chr "TextDocumentMeta"
  ..- attr(*, "class")= chr [1:2] "PlainTextDocument" "TextDocument"
[truncated]

一旦我们有了 Corpus,我们就可以继续预处理 Corpus 中包含的标记,以提高最终输出的质量(术语频率矩阵)。为此,我们使用 tm 函数 tm_map,它类似于 apply 函数族,通过将函数应用于每个文档来转换语料库中的文档。

tm_corpus <- tm_map(tm_corpus, tolower)
tm_corpus <- tm_map(tm_corpus, removeWords, stopwords("english"))
tm_corpus <- tm_map(tm_corpus, removeNumbers)
tm_corpus <- tm_map(tm_corpus, PlainTextDocument)
tm_corpus <- tm_map(tm_corpus, stemDocument, language="english")
tm_corpus <- tm_map(tm_corpus, stripWhitespace)
tm_corpus <- tm_map(tm_corpus, PlainTextDocument)

在这些转换之后,我们最终创建了术语频率矩阵

tdm <- TermDocumentMatrix(tm_corpus)

这给了一个

<<TermDocumentMatrix (terms: 8, documents: 4)>>
Non-/sparse entries: 12/20
Sparsity           : 62%
Maximal term length: 9
Weighting          : term frequency (tf)

我们可以通过将其转换为矩阵来查看

as.matrix(tdm)

           Docs
Terms       character(0) character(0) character(0) character(0)
  doctor               1            0            1            0
  drug                 1            0            0            0
  environ              0            1            0            1
  healthcar            0            0            1            0
  hospit               1            0            1            0
  pollut               0            1            0            1
  smog                 0            1            0            0
  water                0            0            0            1

每行代表每个令牌的频率 - 正如你所注意到的那样(每个文档中有 4 个文档,4 列)已经被阻止(例如 environmentenviron)。

在前面的行中,我们使用绝对频率(即文档中出现的令牌的实例数)对每对令牌/文档进行加权。