在 dfm 对象 R 中分隔字符

Seperating characters in dfm object R

全部,

我已经从 R 中的 quanteda 导入了 sotu 语料库。我对 dfm 对象有点陌生,我想分开 doc_id 列给我一个 name 和一个year 列。如果这是一个 tibble,则此代码有效:

library(quanteda)
library(quanteda.corpora)
library(tidyverse)
sotu <- as_tibble(data_corpus_sotu)
sotusubsetted <- sotu %>%
   separate(doc_id, c("name","year"),"-")

但是,由于我是 dfm 和 regex 的新手,我不确定如果我加载数据是否有等效的过程:

library(quanteda)
library(quanteda.corpora)
library(tidyverse)
sotu <- corpus(data_corpus_sotu)
sotudfm <- dfm(sotu)

对于 dfm 对象是否有一些等效的方法?

以下代码将完全按照您的要求执行,尽管它可能会破坏 quanteda 中的某些操作,这些操作将在 sotudfm@docvars 中查找 docid_,存储数据的数据框文档关系数据。例如,它会破坏 sotudfm@Dimnames$docs 的任何过滤,这是列出文档维度名称的地方。

sotudfm@docvars <- sotudfm@docvars %>% separate(col = docid_, c("name","year"),"-")

> sotudfm@docvars %>% as_tibble()
# A tibble: 241 x 10
    docname_         name       year  segid_ FirstName President  Date       delivery type  party      
   <chr>            <chr>      <chr>  <int> <chr>     <chr>      <date>     <fct>    <fct> <fct>      
     1 Washington-1790  Washington 1790       1 George    Washington 1790-01-08 spoken   SOTU  Independent
     2 Washington-1790b Washington 1790b      1 George    Washington 1790-12-08 spoken   SOTU  Independent
     3 Washington-1791  Washington 1791       1 George    Washington 1791-10-25 spoken   SOTU  Independent
     4 Washington-1792  Washington 1792       1 George    Washington 1792-11-06 spoken   SOTU  Independent
     5 Washington-1793  Washington 1793       1 George    Washington 1793-12-03 spoken   SOTU  Independent
     6 Washington-1794  Washington 1794       1 George    Washington 1794-11-19 spoken   SOTU  Independent
     7 Washington-1795  Washington 1795       1 George    Washington 1795-12-08 spoken   SOTU  Independent
     8 Washington-1796  Washington 1796       1 George    Washington 1796-12-07 spoken   SOTU  Independent
     9 Adams-1797       Adams      1797       1 John      Adams      1797-11-22 spoken   SOTU  Federalist 
    10 Adams-1798       Adams      1798       1 John      Adams      1798-12-08 spoken   SOTU  Federalist 

这是最终为我工作的代码:

sotudfm@docvars <- sotudfm@docvars %>% 
    separate(col = docname_, c("name","year"),"-")

当我 运行

时,这使 doc_id 完好无损
head(sotudfm, 10)

看来 docid_docname_ 是一样的。

最安全的方法也是适用于任何核心 quanteda 对象的方法,同样适用于语料库、标记或 dfm 对象。这些涉及使用访问器函数,而不是直接处理语料库或 dfm 对象的内部,强烈建议不要这样做。您可以这样做,但是如果更改这些对象结构,您的代码将来可能会中断。另外,我们的accessor函数一般也是效率最高的方法。

对于此任务,您想使用 docnames() 函数或访问文档 ID,这对语料库和 dfm 都有效。

library("quanteda")
## Package version: 2.1.2

data("data_corpus_sotu", package = "quanteda.corpora")

data.frame(doc_id = docnames(data_corpus_sotu[1:5])) %>%
  tidyr::separate(doc_id, c("name", "year"), "-")
##         name  year
## 1 Washington  1790
## 2 Washington 1790b
## 3 Washington  1791
## 4 Washington  1792
## 5 Washington  1793

data.frame(doc_id = docnames(dfm(data_corpus_sotu[1:5]))) %>%
  tidyr::separate(doc_id, c("name", "year"), "-")
##         name  year
## 1 Washington  1790
## 2 Washington 1790b
## 3 Washington  1791
## 4 Washington  1792
## 5 Washington  1793

您也可以从“总统”docvar 字段和“日期”中获取:

data.frame(
  name = data_corpus_sotu$President,
  year = lubridate::year(data_corpus_sotu$Date)
) %>%
  head()
##         name year
## 1 Washington 1790
## 2 Washington 1790
## 3 Washington 1791
## 4 Washington 1792
## 5 Washington 1793
## 6 Washington 1794

reprex package (v1.0.0)

创建于 2021-02-13