我想分析一个大型(n=500,000)文档集。我使用quanteda的期望是will be faster而不是来自tm的tm_map()。我希望一步一步地前进,而不是使用dfm()的自动化方式。我有理由这样做:在一种情况下,我不想在删除停止词之前进行标记,因为这会导致许多无用的bigram,而在另一种情况下,我必须用特定语言的过程预处理文本。
我希望这一顺序得到落实:
1)去掉标点符号和数字
2)删除停止词(即在标记化之前,以避免无用标记)
3)利用单图和双图进行标记。
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()在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”和“l‘’abile”)生成两个分隔的标记,因此需要在这里使用gsub()进行额外的步骤。
2)在quanteda中,不可能在标记化之前直接删除文本中的停止词。在我前面的例子中,必须删除"l“和"un”,以避免产生误导性的大写。这可以在tm中用tm_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)发布于 2016-08-14 11:06:21
我们设计的dfm()不是一个“黑匣子”,而是一把瑞士军刀,它结合了许多典型用户在将文本转换成文档和功能矩阵时想要应用的选项。然而,所有这些选项也可以通过较低级别的处理命令获得,如果您希望提供更好的控制级别的话。
然而,quanteda的设计原则之一是文本只能通过标记化过程成为“功能”。如果您有一组您希望排除的标记功能,您必须首先对您的文本进行令牌化,否则不能排除它们。与R的其他文本包不同(例如,tm),这些步骤是从一个语料库“下游”应用的,因此该语料库仍然是一组未处理的文本集,将对其进行操作(但本身并不是一组经过转换的文本)。这样做的目的是保持一般性,但也是为了提高文本分析的可重复性和透明度。
回答您的问题:
texts(myCorpus) <-函数覆盖我们鼓励的行为,其中分配给文本的内容将覆盖现有文本。因此,您可以使用正则表达式来删除标点符号和数字--例如,stringi命令,以及使用Unicode类来标点和数字来识别模式。"",也需要在正则表达式中指定某种形式的单词边界--这也是标记化。dfm(myTokens)。(您也可以在此阶段应用步骤3,用于ngram。额外好处1: n=2搭配产生的列表与bigram相同,但格式不同。你还有别的打算吗?(也许是分开提问?)
奖金2:见dfm_trim(x, sparsity = )。对于大多数人来说,removeSparseTerms()选项是相当令人困惑的,但这也包括来自tm的移民。有关详细解释,请参见this post。
顺便说一句:使用texts()而不是ie2010Corpus$documents$texts --我们将很快重写一个语料库的对象结构,所以当存在提取器函数时,您不应该以这种方式访问它的内部结构。(此外,这个步骤是不必要的--这里您只是重新创建了这个语料库。)
更新2018-01
语料库对象的新名称是data_corpus_irishbudget2010,搭配评分函数是textstat_collocations()。
https://stackoverflow.com/questions/38931507
复制相似问题