【问题标题】:What is the right way to make corpus with readtext and quanteda?使用 readtext 和 quanteda 制作语料库的正确方法是什么?
【发布时间】:2021-04-02 23:57:27
【问题描述】:

我需要一些帮助。我正在尝试使用 quanteda 包制作一些语料库样本,但它没有按预期工作。

library(quanteda)
library(readtext)

news <- corpus(readtext('./final/en_US/en_US.news.txt', dvsep = ' '))
#Yeah, it's from Coursera

然后我尝试从整个语料库中抽取样本:

set.seed(362)
newsSample <- corpus_sample(news, size = 5000)

R-studio 告诉我,它无法采集大于总体的样本,但我确信总体远大于大小,文件大约有 77k 行。还有一件事,在 readtext 之后,我得到了 1 obs 的矩阵。 2个变量。第二个变量是文件中的整个文本。

我做错了什么?

【问题讨论】:

  • 似乎我找到了一种可能的解决方案 - 根本不使用 readtext 包。但在我今天发现的大多数手册中,它显然是 quanteda 的合作伙伴。改为使用 readLines 和语料库正是我所期望的。如果有人有 readtext 的解决方案会很高兴。

标签: r corpus quanteda


【解决方案1】:

使用readtext 读取单个文档时,语料库中只有一个文档。文档中可能有 77k 行,但它仅来自 1 个文档,而不是 77k 文档。如果您检查readtext 的结果,您将在 doc_id 列中仅看到 1 个值,并且所有文本都将位于文本列的单个单元格中。请参阅下面示例中的差异。

library(readtext)
library(quanteda)
DATA_DIR <- system.file("extdata/", package = "readtext")

rt2 <- readtext(paste0(DATA_DIR, "/txt/EU_manifestos/EU_euro_2004_de_PSE.txt"),
                docvarsfrom = "filenames", 
                docvarnames = c("unit", "context", "year", "language", "party"),
                encoding = "LATIN1")
rt2
readtext object consisting of 1 document and 5 docvars.
# Description: df[,7] [1 x 7]
  doc_id                  text                unit  context  year language party
  <chr>                   <chr>               <chr> <chr>   <int> <chr>    <chr>
1 EU_euro_2004_de_PSE.txt "\"PES · PSE \"..." EU    euro     2004 de       PSE  

my_corp <- corpus(rt2)
Corpus consisting of 1 document and 5 docvars.
EU_euro_2004_de_PSE.txt :
"PES · PSE · SPE European Parliament rue Wiertz B 1047 Brusse..."

rl1 <- readLines(paste0(DATA_DIR, "/txt/EU_manifestos/EU_euro_2004_de_PSE.txt"))
           
my_corp_rl1 <- corpus(rl1)
my_corp_rl1
Corpus consisting of 100 documents.
text1 :
"PES · PSE · SPE European Parliament rue Wiertz B 1047 Brusse..."

text2 :
""

text3 :
"GEMEINSAM WERDEN WIR STÄRKER Fünf Verpflichtungen für die nä..."

text4 :
"Manifest der Sozialdemokratischen Partei Europas für die Wah..."

text5 :
"PARTY OF EUROPEAN SOCIALISTS · Tel +32 2 284 29 76 · Fax +32..."

text6 :
""

[ reached max_ndoc ... 94 more documents ]

使用readLines,然后使用语料库,将创建一个包含 100 个文档的语料库,但这些只是刚刚读入的行,这不是语料库的正确定义。

corpus_sample 对语料库中的文档进行采样。因此,如果您有 100 个文档,corpus_sample(my_corpus, 50) 将采样 50 个不同的文档。

你需要检查你需要做什么样的采样,文件或功能。如果功能,您需要使用dfm_samplemargin = "features"。有关更多信息,请参阅 quanteda 中的帮助。如果您需要在文本清理、删除停用词等之后进行采样。

【讨论】:

  • 谢谢,我已经完成了所有这些 - readLines,然后是 corpus,然后是 corpus_sample。它确实有效。你有使用 readtext 包解决同样问题的方法吗?
  • 在不知道 en_US.news.txt 中的内容的情况下,我会说您只有 1 个文档并且您所做的事情不正确。除非 en_US.news.txt 每行有一个文本文档,否则您不应该使用readLines,而应该像 csv / tsv 之类的那样阅读它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多