Сравните условия документов в матрице терминов документов в R

Мне нужно построить матрицу подобия, сравнивая термины документов. Так, например, если Document1 и Document2 имеют 2 одинаковых термина, мне нужно написать 2 в моей матрице подобия в m[1, 2]. Моя матрица подобия выглядит сейчас так:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    0   NA   NA   NA   NA   NA   NA   NA   NA
[2,]    0    0   NA   NA   NA   NA   NA   NA   NA
[3,]    0    0    0   NA   NA   NA   NA   NA   NA
[4,]    0    0    0    0   NA   NA   NA   NA   NA
[5,]    0    0    0    0    0   NA   NA   NA   NA
[6,]    0    0    0    0    0    0   NA   NA   NA
[7,]    0    0    0    0    0    0    0   NA   NA
[8,]    0    0    0    0    0    0    0    0   NA

Документы и условия находятся внутри матрицы терминов документов. Теперь мне нужно заполнить матрицу сходства, сравнив все документы и их термины, где в матрице сходства указано NA. Для каждого совпадения терминов в паре документов я должен подсчитать +1 и ввести конечное значение в нужное место в матрице.

Моя проблема в том, что я не могу получить доступ к отдельным документам и их терминам внутри Матрицы терминов документов. Есть ли другой способ выполнить это или я что-то упустил? Вот код:

install.packages("tm")
install.packages("openNLP")
install.packages("openNLPmodels.en")

Sys.setenv(NOAWT=TRUE)

library(tm)
library(openNLP)
library(openNLPmodels.en)

sample = c(
  "count eagle alien", 
  "dis bound eagle",   
  "bound count eagle dis",
  "count eagle dis alien",
  "bound eagle",
  "count dis alien",
  "bound count alien",
  "bound count",
  "count eagle dis"
)
print(sample)
corpus <- Corpus(VectorSource(sample))
inspect(corpus)

corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, tolower)
corpus <- tm_map(corpus, removeWords, stopwords("english"))
corpus <- tm_map(corpus, stemDocument,language="english")
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, tmTagPOS)
inspect(corpus)

dtm <- DocumentTermMatrix(corpus)
inspect(dtm)

# need to create similarity matrix here
#dist(dtm, method = "manhattan", diag = FALSE, upper = TRUE)

rowCount <- nrow(dtm)
similMatrix = matrix(nrow = rowCount - 1, ncol = rowCount)
show(similMatrix)
similMatrix[ row(similMatrix) >= col(similMatrix) ] <- 0

for(i in 1:(rowCount - 1)){  # rows
  for (j in i+1:rowCount){      # cols

      # need to compare document i and j here and write
      # the value into similarity matrix 
  }
}
show(similMatrix)

person DI MI    schedule 14.01.2013    source источник
comment
Это много пакетов. Вам нужно, чтобы все они были установлены, чтобы воспроизвести это?   -  person David Robinson    schedule 14.01.2013
comment
Например, если вы только что установили какой-либо пакет, определяющий DocumentTermMatrix, а затем добавили dput к результату для создания представления, будет ли этого достаточно для воспроизведения?   -  person David Robinson    schedule 14.01.2013
comment
я думаю, что пакеты tm openNLP и openNLPmodels.en должны работать, но не уверен на 100% в этом. все эти пакеты были рекомендованы моим профессором для выполнения задачи.   -  person DI MI    schedule 14.01.2013
comment
Я не спрашивал, нужны ли вам все пакеты для выполнения задачи, я спрашивал, нужно ли всем, кто хочет помочь, установить все эти пакеты (многие пользователи могут захотеть ответить, но не захотят устанавливать 8 пакетов, просто сделать так). В целом это хороший вопрос, но не могли бы вы попробовать сделать пример более минималистичным?   -  person David Robinson    schedule 14.01.2013
comment
да вы правы, убрали все кроме 3 упомянутых выше   -  person DI MI    schedule 14.01.2013
comment
@DIMI, как вы определяете расстояние между двумя терминами?   -  person agstudy    schedule 14.01.2013


Ответы (1)


Я думаю, что вам не хватает еще одной строки в вашей матрице подобия. Потому что ты не закроешь свой последний документ. Мой выглядит так.

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [2,]    1   NA   NA   NA   NA   NA   NA   NA   NA
 [3,]    2    3   NA   NA   NA   NA   NA   NA   NA
 [4,]    3    2    3   NA   NA   NA   NA   NA   NA
 [5,]    1    2    2    1   NA   NA   NA   NA   NA
 [6,]    2    1    2    3    0   NA   NA   NA   NA
 [7,]    2    1    2    2    1    2   NA   NA   NA
 [8,]    1    1    2    1    1    1    2   NA   NA
 [9,]    2    2    3    3    1    2    1    1   NA

Чтобы получить этот результат, я сделал следующие шаги.

mat=as.data.frame(as.matrix(dtm)) # you get the dataframe from DocumentTerm Matrix 
rowCount <- nrow(dtm)
colCount <- ncol(dtm)
similMatrix = matrix(nrow = rowCount, ncol = rowCount)
similMatrix[ row(similMatrix) >= col(similMatrix) ] <- 0
for(i in 1:(rowCount)){ #set all columns NA you can change to zeros if you need later
    similMatrix[i,i]=NA
} # then we will do the actual job
for(i in 1:rowCount ){  # rows
  for (j in 1:rowCount ){      # cols
      if(is.na(similMatrix[i,j])==F){
        a=mat[i,]
        b=mat[j,]
        for(k in 1:colCount){   #n number of Cols in Document term matrix

          if(a[k]==1 && a[k]==b[k]){
              similMatrix[i,j]=similMatrix[i,j]+1
          }
        }
      }
  }
}
person user974514    schedule 14.01.2013
comment
это круто!!! это просто кажется, что вы перевернули матрицу, можно ли изменить левый нижний и правый верхний треугольники матрицы? что мне нужно изменить в коде? - person DI MI; 14.01.2013
comment
Вы можете попробовать транспонировать матрицу similMatrix=t(similMatrix). - person user974514; 14.01.2013