Обработка на основе языка в R: выбор объектов в dfm с определенным значением точечной взаимной информации (PMI) - PullRequest
0 голосов
/ 16 декабря 2018

Я бы хотел, чтобы в моей dfm содержалось 2-3 словосочетания (т.е. функции), у которых значение PMI превышает 3-кратное количество слов в фразе *.

PMI определяется как: pmi(фраза) = log (p (фраза) / Продукт (p (слово))

с p (фраза): вероятность фразы на основе ее относительной частоты. Продукт (p (слово): произведениевероятности каждого слова в фразе.

До сих пор я использовал следующий код, однако значения PMI не кажутся правильными, но я не могу найти проблему:

#creating dummy data
id <- c(1:5)
text <- c("positiveemoticon my name is positiveemoticon positiveemoticon i love you", "hello dont", "i love you", "i love you", "happy birthday")
ids_text_clean_test <- data.frame(id, text)
ids_text_clean_test$id <- as.character(ids_text_clean_test$id)
ids_text_clean_test$text <- as.character(ids_text_clean_test$text)

test_corpus <- corpus(ids_text_clean_test[["text"]], docnames = ids_text_clean_test[["id"]])

tokens_all_test <- tokens(test_corpus, remove_punct = TRUE)

## Create a document-feature matrix(dfm)
doc_phrases_matrix_test <- dfm(tokens_all_test, ngrams = 2:3) #extracting two- and three word phrases
doc_phrases_matrix_test

# calculating the pointwise mututal information for each phrase to identify phrases that occur at rates much higher than chance
tcmrs = Matrix::rowSums(doc_phrases_matrix_test) #number of words per user
tcmcs = Matrix::colSums(doc_phrases_matrix_test) #counts of each phrase
N = sum(tcmrs) #number of total words used 
colp = tcmcs/N #proportion of the phrases by total phrases
rowp = tcmrs/N #proportion of each users' words used by total words used
pp = doc_phrases_matrix_test@p + 1
ip = doc_phrases_matrix_test@i + 1
tmpx = rep(0,length(doc_phrases_matrix_test@x)) # new values go here, just a numeric vector
# iterate through sparse matrix:
for (i in 1:(length(doc_phrases_matrix_test@p) - 1) ) {
  ind = pp[i]:(pp[i + 1] - 1)
  not0 = ip[ind]
  icol = doc_phrases_matrix_test@x[ind]
  tmp = log( (icol/N) / (rowp[not0] * colp[i] )) # PMI
  tmpx[ind] = tmp
}

doc_phrases_matrix_test@x = tmpx
doc_phrases_matrix_test

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

AnАльтернативный подход, который я попробовал, заключается в непосредственном применении PMI к функциям:

test_pmi <- textstat_keyness(doc_phrases_matrix_test,  measure =  "pmi",
                             sort = TRUE)
test_pmi

Однако, во-первых, здесь я получаю предупреждение, предупреждающее, что были созданы NaN, и, во-вторых, я не понимаю значения PMI (например, почему есть негатive values)?

Кто-нибудь лучше знает, как извлекать функции на основе их значений PMI, как определено выше?

Любая подсказка высоко ценится:)

* послеПарк и др. (2015)

1 Ответ

0 голосов
/ 18 декабря 2018

Вы можете использовать следующий код R, который использует пакет udpipe R, чтобы получить то, что вы просите.Пример токенизированного data.frame, который является частью udpipe

library(udpipe) 
data(brussels_reviews_anno, package = "udpipe") 
x <- subset(brussels_reviews_anno, language %in% "fr") 

## find keywords with PMI > 3 
keyw <- keywords_collocation(x, term = "lemma", 
                             group = c("doc_id", "sentence_id"), ngram_max = 3, n_min = 10) 
keyw <- subset(keyw, pmi > 3) 

## recodes to keywords 
x$term <- txt_recode_ngram(x$lemma, compound = keyw$keyword, ngram = keyw$ngram) 
## create DTM 
dtm <- document_term_frequencies(x = x$term, document = x$doc_id) 
dtm <- document_term_matrix(dtm) 

Если вы хотите получить набор данных в структуре, подобной x.Просто используйте udpipe (текст, «английский») или любой язык по вашему выбору.Если вы хотите использовать quanteda для токенизации, вы все равно можете поместить его в более обогащенный data.frame - пример этого приведен здесь и здесь .Обратитесь за помощью к пакету udpipe R, в котором есть много виньеток (? Udpipe).

Обратите внимание, что PMI полезен, гораздо полезнее использовать выходные данные разбора зависимостей пакета udpipe R.Если вы посмотрите на поле dep_rel, вы найдете там категории, которые идентифицируют выражения из нескольких слов (например, dep_rel fixed / flat / смесь являются выражениями из нескольких слов, как определено в http://universaldependencies.org/u/dep/index.html), вы также можете использовать их, чтобы поместить их в ваш документ/ термин / матрица

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...