R 文本挖掘:从数据框创建文档术语矩阵,转换为数据框,保留原始数据框的列

R text mining: Create document term matrix from dataframe, convert to dataframe, retain columns from original dataframe

感谢lawyeR推荐tidytext包。下面是一些基于该包的代码,它们似乎对我的示例数据运行良好。但当文本列的值为空时,它的效果就不太好。 (有时会发生这种情况,保留空白而不是过滤它是有意义的。)我已将 TVAR 的第一个观察设置为空白以进行说明。代码放弃了这个观察。我怎样才能让 R 保持观察并将每个单词的频率设置为零?我尝试了一些使用和不使用管道的 ifelse 语句。不过效果不是很好。问题似乎集中在 tidytext 包中的 unnest_tokens 函数。

sampletxt$TVAR[1] <- ""

chunk_words <- sampletxt %>%

group_by(PTNO, 日期, 类型) %>%

unnest_tokens(word, TVAR, to_lower = FALSE) %>%

计数(字)%>%

传播(单词,n,0)

我有一个 R 数据框。我想用它来创建文档术语矩阵。大概我想使用 tm 包来做到这一点,但可能还有其他方法。然后我想将该矩阵转换回数据框。我希望最终数据框包含来自原始数据框的标识变量。

问题是,我该怎么做?我找到了类似问题的一些答案,但那是针对带有文本和单个 ID 变量的数据框。我的数据可能有大约六个变量来标识给定的文本记录。到目前为止,针对单个 ID 变量扩大解决方案的尝试尚未证明是完全成功的。

下面是一些示例数据。我为我设法解决的另一项任务创建了这些。

如何获得此数据框的一个版本,该版本对文本条目中的每个单词都有一个额外的频率列,并保留 PTNO、DATE 和 TYPE 等变量?

sampletxt <-

结构(

list(

  PTNO = c(1, 2, 2, 3, 3),

  DATE = structure(c(16801, 16436, 16436, 16832, 16845), class = "Date"),

  TYPE = c(

    "Progress note",

    "Progress note",

    "CAT scan",

    "Progress note",

    "Progress note"

  ),

  TVAR = c(

    "This sentence contains the word metastatic and the word Breast plus the phrase denies any symptoms referable to.",

    "This sentence contains tnm code T-1, N-O, M-0. This sentence contains contains tnm code T-1, N-O, M-1. This sentence contains tnm code T1N0M0. This sentence contains contains tnm code T1NOM1. This sentence is a sentence!?!?",

    "This sentence contains Dr. Seuss and no target words. This sentence contains Ms. Mary J. blige and no target words.",

    "This sentence contains the term stageIV and the word Breast. This sentence contains no target words.",

    "This sentence contains the word breast and the term metastatic. This sentence contains the word breast and the term stage IV."

  )), .Names = c("PTNO", "DATE", "TYPE", "TVAR"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -5L))

quanteda 包比 tm 更快更直接,并且与 tidytext 配合得很好】 还有。操作方法如下:

这些操作从您的对象创建一个语料库,创建一个文档特征矩阵,然后 return 一个 data.frame 将变量与特征计数相结合。 (创建 dfm 时可以使用其他选项,请参阅 ?dfm)。

library("quanteda")
samplecorp <- corpus(sampletxt, text_field = "TVAR")
sampledfm <- dfm(samplecorp)
result <- cbind(docvars(sampledfm), as.data.frame(sampledfm))

然后您可以按变量分组以获得结果。 (这里我只显示前 6 列。)

dplyr::group_by(result[, 1:6], PTNO, DATE, TYPE)
# # A tibble: 5 x 6
# # Groups:   PTNO, DATE, TYPE [5]
# PTNO       DATE          TYPE  this sentence contains
# * <dbl>     <date>         <chr> <dbl>    <dbl>    <dbl>
#     1     1 2016-01-01 Progress note     1        1        1
#     2     2 2015-01-01 Progress note     5        6        6
#     3     2 2015-01-01      CAT scan     2        2        2
#     4     3 2016-02-01 Progress note     2        2        2
#     5     3 2016-02-14 Progress note     2        2        2

packageVersion("quanteda")
# [1] ‘0.99.6’

包“SentimentAnalysis”中的这个函数是执行此操作的最简单方法,尤其是当您尝试将数据框的列转换为 DTM 时(尽管它也适用于 txt 文件!):

library("SentimentAnalysis")
corpus <- VCorpus(VectorSource(df$column_or_txt))
tdm <- TermDocumentMatrix(corpus, 
                          control=list(wordLengths=c(1,Inf), 
                                       tokenize=function(x) ngram_tokenize(x, char=FALSE, 
                                                                           ngmin=1, ngmax=2)))

对于那些用中文进行文本挖掘的人来说,它很简单,每次都像魅力一样,有中文和英文。