2016-07-20 9 views
1

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

Я попытался с помощью простой тестовый скрипт ниже:

test <- list("housekeeping bath towel housekeeping room","housekeeping dirty","housekeeping very dirty","housekeeping super dirty") 
test <-Corpus(VectorSource(test)) 
test_dtm<-DocumentTermMatrix(test) 
test_dtms<-removeSparseTerms(test_dtm,0.99) 

findAssocs(test_dtms,"housekeeping",corlimit = 0.1) 

И возвращающегося результат R является:

$housekeeping 
bath room towel 
    1  1  1 

Замечено, что слово «грязный» происходит в 3 из ряда 4 документа, по сравнению с возвращенными ключевыми словами, которые появляются только один раз во всех документах.

Кто-нибудь знает, что пошло не так в моем скрипте или если есть лучший способ сделать это?

Результат, который я хочу достичь, должен отражать слова, которые часто встречаются со словом поиска по всем документам, а не внутри конкретного документа. Я попытался объединить 4 документа в 1, но он не работает, поскольку findAssocs не работает с одним документом.

Любые советы?

+0

Проверьте результат 'cor (c (2,1,1,1), c (0,1,1,1))'. Это ваш расчет корреляции для «домашнего хозяйства» с «грязным». Это -1, и 'findAssocs' требует корреляции между 0 и 1. – Jota

+0

@Jota Цените, что вы подчеркнули, что не могли бы вы посоветовать, есть ли альтернатива этому, если слово, которое я хочу выделить здесь, является« грязным »? –

+0

Да, вы можете вникнуть в код для 'findAssocs' и модифицировать в соответствии с вашими потребностями. Например, вот что я выкопал из кода и вообще не тестировал: 'j <- match (« домашнее хозяйство », термины (test_dtms), nomatch = 0L); slam :: crossapply_simple_triplet_matrix (test_dtms [, j], test_dtms [, -j], cor) 'или вы можете посмотреть другие пакеты. 'quanteda' имеет функцию« similiarity », которую вы можете проверить. Он поддерживает большое количество аналогичных и дистанционных мер, которые вы можете изучить. – Jota

ответ

1

Как насчет альтернативы, используя quanteda package? Он не налагает никаких тайных ограничений на возвращаемые корреляции и имеет много других опций (см. ?similarity).

require(quanteda) 

testDfm <- dfm(unlist(test), verbose = FALSE) 
## Document-feature matrix of: 4 documents, 7 features. 
## 4 x 7 sparse Matrix of class "dfmSparse" 
##  features 
## docs housekeeping bath towel room dirty very super 
## text1   2 1  1 1  0 0  0 
## text2   1 0  0 0  1 0  0 
## text3   1 0  0 0  1 1  0 
## text4   1 0  0 0  1 0  1 

similarity(testDfm, "housekeeping", margin = "features") 
## similarity Matrix: 
## $housekeeping 
## bath towel room very super dirty 
## 1.0000 1.0000 1.0000 -0.3333 -0.3333 -1.0000 
+0

Спасибо. Кажется гораздо более ясным по его соотношению -1, о котором говорил Йота. Тем не менее, не показано соотношение -1 к плохим доказательствам для бизнес-пользователей? Я пробовал использовать косинус-метод, и он, похоже, решает проблему из тестового примера. Но когда я попробовал это на своем более крупном наборе данных, слова, которые должны отображаться, снова становятся менее важными из-за того, что поисковые термины появляются больше раз в конкретном документе. –

+0

Мне интересно тогда, если можно разрезать искомый термин на 1 для каждого документа, чтобы все документы имели только один найденный термин, помеченный им, и все имеют равную возможность получить пятнистый? Но считается ли это «манипулирование данными»? –

 Смежные вопросы

  • Нет связанных вопросов^_^