首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用quanteda逐步创建dfm

用quanteda逐步创建dfm
EN

Stack Overflow用户
提问于 2016-08-13 09:54:01
回答 1查看 7.6K关注 0票数 3

我想分析一个大型(n=500,000)文档集。我使用quanteda的期望是will be faster而不是来自tmtm_map()。我希望一步一步地前进,而不是使用dfm()的自动化方式。我有理由这样做:在一种情况下,我不想在删除停止词之前进行标记,因为这会导致许多无用的bigram,而在另一种情况下,我必须用特定语言的过程预处理文本。

我希望这一顺序得到落实:

1)去掉标点符号和数字

2)删除停止词(即在标记化之前,以避免无用标记)

3)利用单图和双图进行标记。

4)创建dfm

我的尝试:

代码语言:javascript
复制
> 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的代码

代码语言:javascript
复制
library(quanteda)
packageVersion("quanteda")
[1] ‘0.9.8’

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

代码语言:javascript
复制
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()会导致不精确的标记化。例如:

代码语言:javascript
复制
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)托克化

代码语言:javascript
复制
token <- tokenize(text.corpus[1], removePunct=TRUE, removeNumbers=TRUE, ngrams = 1:2)

4)创建dfm:

代码语言:javascript
复制
dfm <- dfm(token)

5)去除稀疏特征

代码语言:javascript
复制
dfm <- trim(dfm, minCount = 5)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-14 11:06:21

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

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

回答您的问题:

  1. 但是,您可以使用texts(myCorpus) <-函数覆盖我们鼓励的行为,其中分配给文本的内容将覆盖现有文本。因此,您可以使用正则表达式来删除标点符号和数字--例如,stringi命令,以及使用Unicode类来标点和数字来识别模式。
  2. 我建议你在删除断句之前先去东京。停止“word”是标记,因此在您删除文本之前,无法将它们从文本中删除。即使应用正则表达式来代替"",也需要在正则表达式中指定某种形式的单词边界--这也是标记化。
  3. 使之成为普通和大写: 令牌(myCorpus,ngram= 1:2)
  4. 要创建dfm,只需调用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()

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38931507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档