5

我正在使用 R 中的tmandlda包来对新闻文章语料库进行主题建模。但是,我遇到了一个“非字符”问题,因为""这会弄乱我的主题。这是我的工作流程:

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"          ""             

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

4

2 回答 2

4

我经常处理文本,但不是 tm,所以这是摆脱“”的两种方法。可能额外的“”字符是因为句子之间有双空格键。您可以在将文本变成一袋单词之前或之后治疗这种情况。您可以在 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 所以这可能没有帮助,但这篇文章没有看到任何行动,所以我想我会分享可能性。

于 2012-05-07T21:39:39.543 回答
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中现有的矩阵操作支持。

于 2012-10-05T18:19:58.750 回答