2016-08-13 143 views
1

我想分析一个大的(n = 500,000)文档语料库。我使用quanteda期望will be fastertm_map()tm。我想要一步一步地执行,而不是使用dfm()的自动方式。我有这样的理由:在一种情况下,我不想在移除停用词之前进行标记化,因为这会导致许多无用的bigrams,在另一种情况下,我必须使用特定于语言的过程预处理文本。创建dfm一步一步与quanteda

谨以此顺序实施:
1)删除标点和数字
2),即标记化之前除去停用词(以避免无用的令牌)
3)标记化使用unigram进行和双字母组
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中的稀疏令牌? (即在tmremoveSparseTerms()相当于


UPDATE 在@肯的回答的光,这里是按部就班与quanteda代码:

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

1)删除自定义标点符号和数字。例如。注意到,“\ n”,在ie2010语料库

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”必须去掉,不要产生误导性的bigrams。这可以在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) 
+0

为了总结答案,可以使用'texts()'函数在'quanteda'中逐步进行: – 000andy8484

回答

4

我们设计dfm()不是作为一个 “黑匣子”,但更像是瑞士军刀,它结合了许多典型用户在转换时需要应用的选项将他们的文本添加到文档和功能矩阵中。但是,如果希望施加更好的控制,所有这些选项都可以通过较低级别的处理命令获得。

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

在回答你的问题:

  1. 可以使用texts(myCorpus) <-功能,哪里还有什么被分配到文本将覆盖现有的文本但是覆盖我们鼓励的行为。因此,您可以使用正则表达式去除标点符号和数字 - 例如stringi命令,并使用Unicode类标点符号和数字来标识模式。

  2. 我会在删除停用词之前建议您使用tokenise。停止“单词”是令牌,因此在标记文本之前无法从文本中删除这些单词。即使使用正则表达式替代"",也需要在正则表达式中指定某种形式的词边界 - 这也是标记化。

  3. 要tokenise成unigram进行和双字母组:

    令牌(myCorpus,n元语法= 1:2)

  4. 要创建DFM,只需调用dfm(myTokens)。 (你也可以应用了第3步,为的n-gram,在这个阶段

奖金1:N = 2间的搭配产生相同的列表,二元语法,只是以不同的格式是否希望别的东西(?分开,以便也许质疑)

奖金2:见dfm_trim(x, sparsity =)removeSparseTerms()选择相当迷惑大多数人,但是这包括从TM移民见this post更全面的解释

BTW:。用texts()而不是ie2010Corpus$documents$texts - 我们将很快重写一个语料库的对象结构,所以当存在提取函数时,不应该以这种方式访问​​它的内部结构。 (另外,这一步是不必要的 - 在这里你只是简单地重新语料库。)

更新2018-01

为语料对象的新名字是data_corpus_irishbudget2010,并搭配打分函数是textstat_collocations()

+1

非常感谢@Ken。我错过了这个'texts()'函数。 – 000andy8484

+0

不客气!对于一些版本,“文本< - ”被禁用,但我意识到很多人会发现替换功能很有用。 (希望他们会负责任地使用这个!) –