Quanteda - 从具有多个文档的数据框创建语料库
Quanteda - creating a corpus from a dataframe with multiple documents
这里是第一个问题,因此对 faux-pas 表示歉意。我在 R 中有一个包含 4 个变量的 657 个观测值的数据框。每个观察都是澳大利亚总理的一次演讲或采访。所以变量是:
- 日期
- 标题
- URL
- txt(全文speech/interview)。
我正在尝试将其转换为 Quanteda 中的语料库
我第一次尝试 corp <- corpus(all_content)
但那给了我一条错误消息
Error in corpus.data.frame(all_content) :
text_field column not found or invalid
这虽然有效:corp <- corpus(paste(all_content))
然后 summary(corp)
给了我
Corpus consisting of 4 documents, showing 4 documents:
Text Types Tokens Sentences
text1 243 1316 1
text2 1095 6523 3
text3 661 2630 1
text4 25243 1867648 62572
我的理解是这样做是有效地将每一列变成一个文档,而不是每一行?
如果重要,txt
变量将保存为列表。用于创建每一行的代码是
```{r new_function}
scrape_speech <- function(url){
speech_page <- read_html(url)
date <- speech_page %>% html_nodes(".date-display-single") %>% html_text() %>% dmy()
title <- speech_page %>% html_nodes(".pagetitle") %>% html_text()
txt <- speech_page %>% html_nodes("#block-system-main p") %>% html_text() %>% list()
tibble (date = date, title = title, URL = url, txt=txt)}
然后我使用 map_dfr
函数遍历并抓取了 657 个单独的 URLs。
有人向我建议这是因为 txt
被保存为列表。我试过在函数中没有 list()
并且我得到了 21,904 个观察结果,因为全文文档中的每个段落都变成了一个单独的观察结果。我可以用 corp <- corpus(paste(all_content_not_list))
把它变成一个语料库(再一次,没有 paste
我得到和上面一样的错误)。这同样给了我语料库中的 4 个文档!
summary(corp)
给我
Corpus consisting of 4 documents, showing 4 documents:
Text Types Tokens Sentences
text1 243 43810 1
text2 1092 214970 25
text3 657 87618 1
text4 25243 1865687 62626
提前致谢
丹尼尔
很难准确解决这个问题,因为你的 data.frame object 没有可重现的例子,但如果结构包含你列出的变量,那么应该这样做:
corpus(all_content, text_field = "txt")
有关详细信息,请参阅 ?corpus.data.frame
。如果不行,请尝试将输出添加到您的
问题中
str(all_content)
以便我们可以更详细地查看您的 all_content
object.
中的内容
根据 OP 添加新数据进行编辑:
好的,所以 txt
在您的小标题中是一个字符元素列表。您需要将这些组合成一个字符,以便将其用作 corpus.data.frame()
的输入。方法如下:
library("quanteda")
## Package version: 3.0.0
## Unicode version: 10.0
## ICU version: 61.1
## Parallel computing: 12 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
dframe <- structure(list(
date = structure(18620, class = "Date"),
title = " Prime Minister's Christmas Message to the ADF",
URL = "https://www.pm.gov.au/media/prime-ministers-christmas-message-adf",
txt = list(c(
"G'day and Merry Christmas to everyone in our Australian Defence Force.",
"You know, throughout our history, successive Australian governments... And this year was no different.",
"God bless."
))
),
row.names = c(NA, -1L),
class = c("tbl_df", "tbl", "data.frame")
)
dframe$txt <- vapply(dframe$txt, paste, character(1), collapse = " ")
corp <- corpus(dframe, text_field = "txt")
print(corp, max_nchar = -1)
## Corpus consisting of 1 document and 3 docvars.
## text1 :
## "G'day and Merry Christmas to everyone in our Australian Defence Force. You know, throughout our history, successive Australian governments... And this year was no different. God bless."
由 reprex package (v1.0.0)
于 2021-04-08 创建
这里是第一个问题,因此对 faux-pas 表示歉意。我在 R 中有一个包含 4 个变量的 657 个观测值的数据框。每个观察都是澳大利亚总理的一次演讲或采访。所以变量是:
- 日期
- 标题
- URL
- txt(全文speech/interview)。
我正在尝试将其转换为 Quanteda 中的语料库
我第一次尝试 corp <- corpus(all_content)
但那给了我一条错误消息
Error in corpus.data.frame(all_content) :
text_field column not found or invalid
这虽然有效:corp <- corpus(paste(all_content))
然后 summary(corp)
给了我
Corpus consisting of 4 documents, showing 4 documents:
Text Types Tokens Sentences
text1 243 1316 1
text2 1095 6523 3
text3 661 2630 1
text4 25243 1867648 62572
我的理解是这样做是有效地将每一列变成一个文档,而不是每一行?
如果重要,txt
变量将保存为列表。用于创建每一行的代码是
```{r new_function}
scrape_speech <- function(url){
speech_page <- read_html(url)
date <- speech_page %>% html_nodes(".date-display-single") %>% html_text() %>% dmy()
title <- speech_page %>% html_nodes(".pagetitle") %>% html_text()
txt <- speech_page %>% html_nodes("#block-system-main p") %>% html_text() %>% list()
tibble (date = date, title = title, URL = url, txt=txt)}
然后我使用 map_dfr
函数遍历并抓取了 657 个单独的 URLs。
有人向我建议这是因为 txt
被保存为列表。我试过在函数中没有 list()
并且我得到了 21,904 个观察结果,因为全文文档中的每个段落都变成了一个单独的观察结果。我可以用 corp <- corpus(paste(all_content_not_list))
把它变成一个语料库(再一次,没有 paste
我得到和上面一样的错误)。这同样给了我语料库中的 4 个文档!
summary(corp)
给我
Corpus consisting of 4 documents, showing 4 documents:
Text Types Tokens Sentences
text1 243 43810 1
text2 1092 214970 25
text3 657 87618 1
text4 25243 1865687 62626
提前致谢 丹尼尔
很难准确解决这个问题,因为你的 data.frame object 没有可重现的例子,但如果结构包含你列出的变量,那么应该这样做:
corpus(all_content, text_field = "txt")
有关详细信息,请参阅 ?corpus.data.frame
。如果不行,请尝试将输出添加到您的
str(all_content)
以便我们可以更详细地查看您的 all_content
object.
根据 OP 添加新数据进行编辑:
好的,所以 txt
在您的小标题中是一个字符元素列表。您需要将这些组合成一个字符,以便将其用作 corpus.data.frame()
的输入。方法如下:
library("quanteda")
## Package version: 3.0.0
## Unicode version: 10.0
## ICU version: 61.1
## Parallel computing: 12 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
dframe <- structure(list(
date = structure(18620, class = "Date"),
title = " Prime Minister's Christmas Message to the ADF",
URL = "https://www.pm.gov.au/media/prime-ministers-christmas-message-adf",
txt = list(c(
"G'day and Merry Christmas to everyone in our Australian Defence Force.",
"You know, throughout our history, successive Australian governments... And this year was no different.",
"God bless."
))
),
row.names = c(NA, -1L),
class = c("tbl_df", "tbl", "data.frame")
)
dframe$txt <- vapply(dframe$txt, paste, character(1), collapse = " ")
corp <- corpus(dframe, text_field = "txt")
print(corp, max_nchar = -1)
## Corpus consisting of 1 document and 3 docvars.
## text1 :
## "G'day and Merry Christmas to everyone in our Australian Defence Force. You know, throughout our history, successive Australian governments... And this year was no different. God bless."
由 reprex package (v1.0.0)
于 2021-04-08 创建