建立術語頻率矩陣

解決問題的最簡單方法(迄今為止最常用的方法)是將句子分成標記。簡化,單詞對使用和接收它們的人有抽象和主觀意義,令牌有一個客觀的解釋:一個有序的字元序列(或位元組)。一旦句子被分割,令牌的順序就會被忽略。這種方法的問題在於稱為字袋模型。

一個術語頻率是一個字典,其中對每個令牌被分配一個權重。在第一個例子中,我們使用 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)。

在前面的行中,我們使用絕對頻率(即文件中出現的令牌的例項數)對每對令牌/文件進行加權。