从R中的文档语料库中删除“空”字符项?

时间:2012-05-07 20:02:54

标签: r text-mining text-analysis lda topic-modeling

我正在使用R中的tmlda个包来主题模拟新闻文章的语料库。但是,我遇到了一个代表""的“非角色”问题,这个问题搞砸了我的主题。这是我的工作流程:

text <- Corpus(VectorSource(d$text))
newtext <- lapply(text, tolower)
sw <- c(stopwords("english"), "ahram", "online", "egypt", "egypts", "egyptian")
newtext <- lapply(newtext, function(x) removePunctuation(x))
newtext <- lapply(newtext, function(x) removeWords(x, sw))
newtext <- lapply(newtext, function(x) removeNumbers(x))
newtext <- lapply(newtext, function(x) stripWhitespace(x))
d$processed <- unlist(newtext)
corpus <- lexicalize(d$processed)
k <- 40
result <-lda.collapsed.gibbs.sampler(corpus$documents, k, corpus$vocab, 500, .02, .05,
compute.log.likelihood = TRUE, trace = 2L)

不幸的是,当我训练lda模型时,一切看起来都很棒,除了最常出现的单词是“”。我尝试通过将其从下面给出的词汇中删除并如上所述重新估计模型来解决这个问题:

newtext <- lapply(newtext, function(x) removeWords(x, ""))

但是,它仍然存在,如下所示:

str_split(newtext[[1]], " ")

[[1]]
 [1] ""              "body"          "mohamed"       "hassan"       
 [5] "cook"          "found"         "turkish"       "search"       
 [9] "rescue"        "teams"         "rescued"       "hospital"     
[13] "rescue"        "teams"         "continued"     "search"       
[17] "missing"       "body"          "cook"          "crew"         
[21] "wereegyptians" "sudanese"      "syrians"       "hassan"       
[25] "cook"          "cargo"         "ship"          "sea"          
[29] "bright"        "crashed"       "thursday"      "port"         
[33] "antalya"       "southern"      "turkey"        "vessel"       
[37] "collided"      "rocks"         "port"          "thursday"     
[41] "night"         "result"        "heavy"         "winds"        
[45] "waves"         "crew"          ""             

有关如何删除此功能的任何建议?将""添加到我的停用词列表中也无济于事。

2 个答案:

答案 0 :(得分:5)

我处理的文字很多但不是tm所以这是摆脱你所拥有的“2”方法。可能额外的“”字符是由于句子之间的双倍空格键。您可以在将文本转换为单词之前或之后处理此情况。您可以在strsplit之前将所有“”x2替换为“”x1,或者之后可以将其取代(您必须在strsplit之后取消列出)。

x <- "I like to ride my bicycle.  Do you like to ride too?"

#TREAT BEFORE(OPTION):
a <- gsub(" +", " ", x)
strsplit(a,  " ")

#TREAT AFTER OPTION:
y <- unlist(strsplit(x, " "))
y[!y%in%""]

您也可以尝试:

newtext <- lapply(newtext, function(x) gsub(" +", " ", x))

我再次使用tm所以这可能没有用,但这篇文章没有看到任何动作,所以我认为我会分享可能性。

答案 1 :(得分:1)

如果您已经设置了语料库,请尝试使用文档长度作为过滤器,将其作为标记附加到 meta(),然后创建新的语料库。

dtm <- DocumentTermMatrix(corpus)

## terms per document
doc.length = rowSums(as.matrix(dtm))

## add length as description term
meta(corpus.clean.noTL,tag="Length") <- doc.length

## create new corpus
corpus.noEmptyDocs <- tm_filter(corpus, FUN = sFilter, "Length > 0")

## remove Length as meta tag
meta(corpus.clean.noTL,tag="Length") <- NULL

使用上述方法,您只需5行代码就可以计算有效地劫持 tm 中现有的矩阵操作支持。