R :: tm - Создать таблицу / матрицу частот ассоциаций терминов и добавить значения в дендрограмму

У меня есть корпус, который в основном представляет собой вектор коротких предложений (n> 50), например:

corpus <- c("looking for help in R","check whether my milk is sour or not",
"random sentence with dubious meaning")

Я могу распечатать дендрограмму

fit <- hclust(d, method="ward")   
plot(fit, hang=-1)
groups <- cutree(fit, k=nc)   # "k=" defines the number of clusters you are using   
rect.hclust(fit, k=nc, border="red") # draw dendrogram with red borders around the 5 clusters 

и корреляционная матрица

cor_1 <- cor(as.matrix(dtms))
corrplot(cor_1, method = "number")

Насколько я понял - пожалуйста, поправьте меня здесь, если я ошибаюсь - findAssocs() т.е. корреляция проверяет, встречаются ли два термина в одном документе?

Цель: теперь я не хочу видеть корреляцию, но частота появления двух терминов в одном документе, которые НЕ обязательно соседствуют друг с другом (BigramTokenizer не будет работать). Например: термин A и термин B появляются вместе в 5 разных документах в моем корпусе, независимо от расстояния.

В идеале я хочу создать матрицу частот, аналогичную приведенной выше, и, если возможно, добавить частоты в дендрограмму (аналогично тому, как pvclust() печатает их числа)

введите описание изображения здесь

Есть идеи, как этого добиться?


person GHerman    schedule 08.02.2016    source источник
comment
Любые идеи? Я пытаюсь определить частоты кластеров.   -  person GHerman    schedule 09.02.2016


Ответы (1)


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

(Я использовал здесь пакет quanteda вместо tm, но аналогичный подход будет работать с объектом DocumentTermMatrix из tm.)

# create some demonstration documents
(txts <- c(paste(letters[c(1, 1:3)], collapse = " "), 
           paste(letters[c(1, 3, 5)], collapse = " "), 
           paste(letters[c(5, 6, 7)], collapse = " ")))
## [1] "a a b c" "a c e" "e f g"

# convert to a document-term matrix
require(quanteda)
dtm <- dfm(txts, verbose = FALSE)
dtm
## Document-feature matrix of: 3 documents, 6 features.
## 3 x 6 sparse Matrix of class "dfmSparse"
##        features
## docs    a b c e f g
##   text1 2 1 1 0 0 0
##   text2 1 0 1 1 0 0
##   text3 0 0 0 1 1 1

# convert to a matrix of co-occcurences rather than counts
(dtm <- tf(dtm, "boolean"))
## Document-feature matrix of: 3 documents, 6 features.
## 3 x 6 sparse Matrix of class "dfmSparse"
##        features
## docs    a b c e f g
##   text1 1 1 1 0 0 0
##   text2 1 0 1 1 0 0
##   text3 0 0 0 1 1 1

# now get the "feature in document" co-occurrence matrix
t(dtm) %*% dtm
## 6 x 6 sparse Matrix of class "dgCMatrix"
##   a b c e f g
## a 2 1 2 1 . .
## b 1 1 1 . . .
## c 2 1 2 1 . .
## e 1 . 1 2 1 1
## f . . . 1 1 1
## g . . . 1 1 1

Примечание. При такой настройке термин считается «встречающимся» один раз в документе, где он появляется только сам с собой (например, b). Если вы хотите это изменить, просто замените диагональ диагональю минус один.

person Ken Benoit    schedule 10.02.2016