2

DocumentTermMatrix があり、このドキュメントの特定の用語を置き換えて度数分布表を作成したいと考えています。

出発点は、次のような元のドキュメントです。

library(tm)
library(qdap)

    df1 <- data.frame(word =c("test", "test", "teste", "hey", "heyyy", "hi"))
    tdm <- as.DocumentTermMatrix(as.character(df1$word))

元のドキュメントの頻度表を作成すると、正しい結果が得られます。

freq0 <- as.matrix(sort(colSums(as.matrix(tdm)), decreasing=TRUE))
freq0 

ここまでは順調ですね。ただし、ドキュメント内のいくつかの用語を置き換えると、新しい度数分布表は間違った結果になります。

    tdm$dimnames$Terms <- mgsub(c("teste", "heyyy"), c("test", "hey"), as.character(tdm$dimnames$Terms), fixed=T, trim=T)
    freq1 <- as.matrix(sort(colSums(as.matrix(tdm)), decreasing=TRUE))
    freq1

用語のカウント中に同じ用語であっても同一とは見なされないため、明らかに、またはおそらくドキュメント内のインデックス付けが間違っています。

この結果は理想的なケースです。

df2 <- data.frame(word =c("test", "test", "test", "hey", "hey", "hi"))
tdm2 <- as.DocumentTermMatrix(as.character(df2$word))
tdm2$dimnames$Terms <- mgsub(c("teste", "heyyy"), c("test", "hey"), as.character(tdm2$dimnames$Terms), fixed=T, trim=T)
freq2 <- as.matrix(sort(colSums(as.matrix(tdm2)), decreasing=TRUE))
freq2

誰でも問題を解決するのを手伝ってもらえますか?

事前にThx

4

1 に答える 1

2

の構造を見ることができます。as.matrix(tdm)

str(as.matrix(tdm))
#num [1, 1:5] 1 1 1 2 1
# - attr(*, "dimnames")=List of 2
#  ..$ Docs : chr "all"
# ..$ Terms: chr [1:5] "hey" "heyyy" "hi" "test" ...

これは 1 行 5 列の行列なので、colSums基本的には何もしていません。

xtabs(as.vector(tdm)~tdm$dimnames$Terms)
#tdm$dimnames$Terms
#  hey heyyy    hi  test teste 
#   1     1     1     2     1 

を使用して置き換えた後mgsub

xtabs(as.vector(tdm)~tdm$dimnames$Terms)
#tdm$dimnames$Terms
# hey   hi test 
#  2    1    3 

xtabsは のをsum行いvectorます。これは次の方法でも実行できますtapply

 tapply(as.vector(tdm), tdm$dimnames$Terms, FUN = sum)

行数が 1 より大きい場合は、colSums

 tapply(colSums(as.matrix(tdm)),  tdm$dimnames$Terms, FUN = sum)
 # hey   hi test 
 #  4    2    6 

注:上記の出力は、変更を加えた後のものですmgsub

于 2016-06-24T12:06:34.973 に答える