我想分析一个大的(n = 500,000)文档语料库。我使用quanteda
期望will be faster而不是来自tm_map()
的{{1}}。我想逐步进行,而不是使用tm
的自动方式。我有理由这样做:在一种情况下,我不想在删除停用词之前进行标记化,因为这会导致许多无用的双字母组合,而在另一种情况下,我必须使用特定于语言的过程对文本进行预处理。
我希望这个序列能够实现:
1)删除标点符号和数字
2)删除停用词(即在令牌化之前以避免无用的令牌)
3)使用unigrams和bigrams进行令牌化
4)创建dfm
我的尝试:
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()
。
更新
根据@Ken的回答,以下是使用tm
逐步进行的代码:
quanteda
1)删除自定义标点符号和数字。例如。请注意ie2010语料库中的“\ n”
library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’
关于人们可能更喜欢预处理的原因的进一步说明。我目前的语料库是意大利语,这种语言的文章与撇号有关。因此,直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()
将为同一个单词生成两个分开的标记(“un'abile”和“l'abile”),因此需要在broken.tokens <- dfm(corpus(c("L'abile presidente Renzi. Un'abile mossa di Berlusconi"), removePunct=TRUE))
处添加一个额外的步骤。
2)在gsub()
中,无法在标记化之前直接删除文本中的停用词。在我之前的例子中,必须删除“l”和“un”,以免产生误导性的双字母。这可以使用quanteda
在tm
中处理。
3)标记化
tm_map(..., removeWords)
4)创建dfm:
token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2)
5)删除稀疏特征
dfm <- dfm(token)
答案 0 :(得分:6)
我们设计的dfm()
不是&#34;黑盒子&#34;但更像瑞士军刀,结合了典型用户在将文本转换为文档和特征矩阵时想要应用的许多选项。但是,如果您希望进行更精细的控制,所有这些选项也可通过较低级别的处理命令获得。
然而, quanteda 的设计原则之一是文本只会成为&#34;功能&#34;通过标记化的过程。如果您有一组要排除的标记化功能,则必须先将文本标记,或者不能排除它们。与R的其他文本包(例如 tm )不同,这些步骤适用于&#34;下游&#34;从语料库中,语料库仍然是未经处理的一组文本,操作将被应用(但本身不是一组经过改造的文本)。这样做的目的是保持一般性,同时提高文本分析的可重复性和透明度。
回答您的问题:
然而,您可以使用texts(myCorpus) <-
函数覆盖我们鼓励的行为,其中分配给文本的内容将覆盖现有文本。因此,您可以使用正则表达式来删除标点符号和数字 - 例如 stringi 命令,并使用Unicode类来标点符号和数字来识别模式。
我会建议您在删除停用词之前进行标记。停止&#34;单词&#34;是标记,因此在标记文本之前无法从文本中删除这些标记。即使应用正则表达式替换它们""
也需要在正则表达式中指定某种形式的单词边界 - 再次,这是标记化。
标记为unigrams和bigrams:
令牌(myCorpus,ngrams = 1:2)
要创建dfm,只需拨打dfm(myTokens)
即可。 (您也可以在此阶段对ngrams应用第3步。
奖励1:n = 2个搭配产生与bigrams相同的列表,但格式不同。你还想要别的吗? (或许可以分开问题?)
奖金2:见dfm_trim(x, sparsity = )
。 removeSparseTerms()
选项对大多数人来说都很混乱,但这包括来自 tm 的移民。有关完整说明,请参阅this post。
顺便说一句:使用texts()
代替ie2010Corpus$documents$texts
- 我们很快就会重写语料库的对象结构,因此当有提取函数时,你不应该以这种方式访问它的内部结构。 (此外,此步骤是不必要的 - 在这里您只需重新创建语料库。)
更新2018-01 :
语料库对象的新名称为data_corpus_irishbudget2010
,并置匹配评分函数为textstat_collocations()
。