在 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
全部,
我已经从 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