all,
我已经从 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 和正则表达式的新手,因此我不确定如果我将数据加载为:
library(quanteda)
library(quanteda.corpora)
library(tidyverse)
sotu <- corpus(data_corpus_sotu)
sotudfm <- dfm(sotu)
是否有一些等效的方法可以使用 dfm 对象执行此操作?
最安全的方法也适用于任何核心量化对象,这意味着同样适用于语料库、令牌或 dfm 对象。 这些涉及使用访问器函数,而不是直接寻址语料库或 dfm 对象的内部,强烈建议不要这样做。 您可以这样做,但如果更改这些对象结构,您的代码将来可能会中断。 此外,我们的访问器函数通常也是最有效的方法。
对于此任务,您希望使用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
创建于 2021-02-13 由 reprex 软件包 (v1.0.0)
以下代码将完全按照您的要求执行,尽管它可能会破坏 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_
是相同的。