1
votes

I need to cluster the texts (text mining for russian texts). here the code:

mydat=read.csv("C:/Users/Admin/Downloads/kr_csv.csv", sep=";",dec=",")
View(mydat)
    

library("tm") 
library("SnowballC") 
library("textcat")

corpus=Corpus(VectorSource(mydat))

dtm=DocumentTermMatrix(corpus,
                       control=list(stemming=T, stopwords=F,
                        minWorldLenght=3,removeNumbers=T,
                        removePunctuation=T,
                        #stopwords=c(stopwords('SMART'))
                        weighting=function(x)
                          weightTf(x) ))

m<-as.matrix(dtm)

norm_eucl=function(m)
  m/apply(m,1,function(x)sum(x^2)^.5)
m_norm=norm_eucl(m)

res=kmeans(m_norm,3,100)

I chose 3-cluster decision and got this error

Error in sample.int(m, k) : cannot take a sample larger than the population when 'replace = FALSE' It is mean that I can't take more than one cluster, but this can not be. How can I extract multiple clusters? mydat

> dim(m_norm)
[1]    1 4298

head(m_norm, 20) there many docs (all on russian) I copied only part.
> Docs артикул madc артикул madc ту артикулldvoko       аскуэ   аскуэ зао аскуэ зао хакель         асу      асу тп асу тп аскуэ         атх
    Terms
Docs      атх ол  атх ол ооо      ач csb         аяд        аяд        аяд         базе базе протокола базе протокола hart бандажирования
    Terms
Docs бандажирования пучков бандажирования пучков проводов     батарея  батарея gp батарея gp в        без без протяжки без протяжки диам
    Terms
Docs без протяжки фмм без устройствадля без устройствадля ручного без электропривода без электропривода классгерметичности      белая
    Terms
Docs     бирка бирка кабельная бирка кабельная у бирка пластмассовая бирка пластмассовая квадратная         бкп    бкп дакж   бкп дакж 
    Terms
Docs        бкра       бкра       бкра   благовещенск благовещенский благовещенский арматурный благовещенский арматурный завод       блок
    Terms
Docs       блок      блок  м    блок atx  блок atx w блок клапанный блок клапанный метран блок концевых блок концевых переключателей
1
can you post dim(m_norm), and head(m_norm, 20) - missuse
@missuse, i edited - D.Joe
m_norm has 1 row and 4298 columns of strings. k means expects more rows than the specified number of clusters (hence the error) - missuse
how to get many clusters? - D.Joe

1 Answers

0
votes

I found the error was in preprocessing

here the working code

mydat=read.csv("C:/Users/Admin/Downloads/kr_csv.csv", sep=";",dec=",")

  tw.corpus <- Corpus(VectorSource(mydat$name))
  tw.corpus <- tm_map(tw.corpus, stripWhitespace)
  tw.corpus <- tm_map(tw.corpus, removePunctuation)
  tw.corpus <- tm_map(tw.corpus, removeNumbers)
  tw.corpus <- tm_map(tw.corpus, removeWords, stopwords("russian"))
  tw.corpus = tm_map(tw.corpus, content_transformer(tolower))
  tw.corpus = tm_map(tw.corpus, stemDocument)


 doc.m <- DocumentTermMatrix(tw.corpus)

  dtm_tfxidf<-weightTfIdf(doc.m)

m<-as.matrix(dtm_tfxidf)
rownames(m)<-1:nrow(m)

norm_eucl=function(m)
  m/apply(m,1,function(x)sum(x^2)^.5)
m_norm=norm_eucl(m)


> dim(m_norm)
[1] 399 860