3

我想分析一个大(n = 500,000)个文档语料库。我正在使用quanteda预期 tm_map()from更快tm。我想逐步进行,而不是使用dfm(). 我有这样做的理由:在一种情况下,我不想在删除停用词之前进行标记,因为这会导致许多无用的二元组,在另一种情况下,我必须使用特定于语言的程序对文本进行预处理。

我希望实现这个序列:
1)删除标点符号和数字
2)删除停用词(即在标记化之前以避免无用的标记)
3)使用 unigrams 和 bigrams 进行标记
4)创建 dfm

我的尝试:

> library(quanteda)
> packageVersion("quanteda")
[1] ‘0.9.8’
> text <- ie2010Corpus$documents$texts
> text.corpus <- quanteda:::corpus(text, docnames=rownames(ie2010Corpus$documents))

> class(text.corpus)
[1] "corpus" "list"

> stopw <- c("a","the", "all", "some")
> TextNoStop <- removeFeatures(text.corpus, features = stopw)
# Error in UseMethod("selectFeatures") : 
# no applicable method for 'selectFeatures' applied to an object of class "c('corpus', 'list')"

# This is how I would theoretically continue: 
> token <- tokenize(TextNoStop, removePunct=TRUE, removeNumbers=TRUE)
> token2 <- ngrams(token,c(1,2))

奖金问题 如何删除稀疏令牌quanteda?(即相当于removeSparseTerms()in tm


更新 根据@Ken的回答,这里是逐步进行的代码quanteda

library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’

1)删除自定义标点和数字。例如,请注意 ie2010 语料库中的“\n”

text.corpus <- ie2010Corpus
texts(text.corpus)[1]      # Use texts() to extrapolate text
# 2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery.\nIt is

texts(text.corpus)[1] <- gsub("\\s"," ",text.corpus[1])    # remove all spaces (incl \n, \t, \r...)
texts(text.corpus)[1]
2010_BUDGET_01_Brian_Lenihan_FF
# "When I presented the supplementary budget to this House last April, I said we
# could work our way through this period of severe economic distress. Today, I
# can report that notwithstanding the difficulties of the past eight months, we
# are now on the road to economic recovery. It is of e

关于人们可能更喜欢预处理的原因的进一步说明。我目前的语料库是意大利语,这种语言的文章与带有撇号的单词相关联。因此,顺子dfm()可能导致不精确的标记化。例如:

broken.tokens <- dfm(corpus(c("L'abile presidente Renzi. Un'abile mossa di Berlusconi"), removePunct=TRUE))

将为同一个单词(“un'abile”和“l'abile”)生成两个单独的标记,因此这里需要一个额外的步骤gsub()

2) 在quanteda标记化之前,无法直接在文本中删除停用词。在我之前的示例中,必须删除“l”和“un”,以免产生误导性的二元组。这可以tmtm_map(..., removeWords).

3) 代币化

token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2)

4)创建dfm:

dfm <- dfm(token)

5)去除稀疏特征

dfm <- trim(dfm, minCount = 5)
4

1 回答 1

7

我们设计dfm()的不是“黑匣子”,而是更像是一把瑞士军刀,它结合了典型用户在将文本转换为文档和功能矩阵时想要应用的许多选项。但是,如果您希望进行更精细的控制,所有这些选项也可以通过较低级别的处理命令获得。

然而, quanteda的设计原则之一是文本仅通过标记化过程成为“特征”。如果您有一组要排除的标记化功能,则必须首先标记您的文本,否则您不能排除它们。与 R 的其他文本包(例如tm)不同,这些步骤是从语料库“下游”应用的,因此语料库仍然是一组未处理的文本,将对其应用操作(但本身不会是转换后的文本集) . 这样做的目的是保持通用性,同时也提高文本分析的可重复性和透明度。

针对您的问题:

  1. 但是,您可以使用该功能覆盖我们鼓励的行为texts(myCorpus) <-,其中分配给文本的内容将覆盖现有文本。因此,您可以使用正则表达式来删除标点符号和数字——例如stringi命令并使用 Unicode 类的标点符号和数字来识别模式。

  2. 我建议您在删除停用词之前进行标记化。停止“单词”是标记,因此在标记文本之前无法从文本中删除它们。即使应用正则表达式来替代它们,""也需要在正则表达式中指定某种形式的单词边界——这又是标记化。

  3. 要标记为一元和二元:

    令牌(myCorpus,ngrams = 1:2)

  4. 要创建 dfm,只需调用dfm(myTokens). (您也可以在此阶段针对 ngram 应用第 3 步。

奖励 1:n=2 搭配产生与二元组相同的列表,但格式不同。你有别的打算吗?(也许是单独的SO问题?)

奖励 2:见dfm_trim(x, sparsity = )。对于大多数人来说,这些removeSparseTerms()选项非常令人困惑,但这包括来自tm的移民。有关完整说明,请参阅此帖子

顺便说一句:使用texts()而不是ie2010Corpus$documents$texts——我们将很快重写语料库的对象结构,因此当有提取器函数时,您不应该以这种方式访问​​其内部。(此外,这一步是不必要的 - 在这里您只是重新创建了语料库。)

2018-01 更新

语料库对象的新名称为data_corpus_irishbudget2010,搭配评分函数为textstat_collocations()

于 2016-08-14T11:06:21.760 回答