Создание облака слов, но с комбинированными словами?

Я пытаюсь составить облако слов из ключевых слов публикаций. например: интеллектуальный анализ образовательных данных; совместное обучение; информатика ... и т. д.

Мой текущий код выглядит следующим образом:

KeywordsCorpus <- Corpus(VectorSource(subset(Words$Author.Keywords, Words$Year==2012)))
KeywordsCorpus <- tm_map(KeywordsCorpus, removePunctuation)
KeywordsCorpus <- tm_map(KeywordsCorpus, removeNumbers)

# added tolower
KeywordsCorpus <- tm_map(KeywordsCorpus, tolower)
KeywordsCorpus <- tm_map(KeywordsCorpus, removeWords, stopwords("english"))

# moved stripWhitespace
KeywordsCorpus <- tm_map(KeywordsCorpus, stripWhitespace)  

KeywordsCorpus <- tm_map(KeywordsCorpus, PlainTextDocument)

dtm4 <- TermDocumentMatrix(KeywordsCorpus)
m4 <- as.matrix(dtm4)
v4 <- sort(rowSums(m4),decreasing=TRUE)
d4 <- data.frame(word = names(v4),freq=v4)

Однако с помощью этого кода он разбивает каждое слово отдельно, но мне нужно иметь комбинированные слова / фразы. Например: «Образовательный интеллектуальный анализ данных» - это одна фраза, которую мне нужно показать вместо того, что происходит: «Образовательный» «Данные» «Майнинг». Есть ли способ соединить каждое словосочетание вместе? точка с запятой может помочь в качестве разделителя.

Спасибо.


person Lian Ahmad    schedule 07.04.2016    source источник


Ответы (3)


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

library(quanteda)
packageVersion("quanteda")
## [1] ‘0.9.5.14’

Во-первых, метод обнаружения верхних 1500 словосочетаний биграмм и замены этих словосочетаний в текстах их версиями с одним маркером (объединенными символом "_"). Здесь я использую встроенный в пакет тексты инаугурационной речи президента США.

### for just the top 1500 collocations
# detect the collocations
colls <- collocations(inaugCorpus, n = 1500, size = 2)

# remove collocations containing stopwords
colls <- removeFeatures(colls, stopwords("SMART"))
## Removed 1,224 (81.6%) of 1,500 collocations containing one of 570 stopwords.

# replace the phrases with single-token versions
inaugCorpusColl2 <- phrasetotoken(inaugCorpus, colls)

# create the document-feature matrix
inaugColl2dfm <- dfm(inaugCorpusColl2, ignoredFeatures = stopwords("SMART"))
## Creating a dfm from a corpus ...
## ... lowercasing
## ... tokenizing
## ... indexing documents: 57 documents
## ... indexing features: 9,741 feature types
## ... removed 430 features, from 570 supplied (glob) feature types
## ... complete. 
## ... created a 57 x 9311 sparse dfm
## Elapsed time: 0.163 seconds.

# plot the wordcloud
set.seed(1000)
png("~/Desktop/wcloud1.png", width = 800, height = 800)
plot(inaugColl2dfm["2013-Obama", ], min.freq = 2, random.order = FALSE, 
     colors = sample(colors()[2:128]))
dev.off()

Это приводит к следующему сюжету. Обратите внимание на сочетания, такие как «задача_поколения» и «товарищи_американцы».

wcloud1.png

Версия, сформированная со всеми биграммами, проще, но дает огромное количество низкочастотных функций биграмм. Для слова «облако» я выбрал больший набор текстов, а не только обращение Обамы в 2013 году.

### version with all bi-grams
inaugbigramsDfm <- dfm(inaugCorpusColl2, ngrams = 2, ignoredFeatures = stopwords("SMART"))
## Creating a dfm from a corpus ...
## ... lowercasing
## ... tokenizing
## ... indexing documents: 57 documents
## ... removed 54,200 features, from 570 supplied (glob) feature types
## ... indexing features: 64,108 feature types
## ... created a 57 x 9908 sparse dfm
## ... complete. 
## Elapsed time: 3.254 seconds.

# plot the bigram wordcloud - more texts because for a single speech, 
# almost none occur more than once
png("~/Desktop/wcloud2.png", width = 800, height = 800)
plot(inaugbigramsDfm[40:57, ], min.freq = 2, random.order = FALSE, 
     colors = sample(colors()[2:128]))
dev.off()

Это дает:

wcloud2.png

person Ken Benoit    schedule 11.04.2016
comment
Если кто-то наткнется на ошибку no applicable method for 'collocations' applied to an object of class "c('VCorpus', 'Corpus')", попробуйте unlist(corpus). - person Katrin Leinweber; 20.08.2016
comment
В какой момент можно добавить stemDocument() & stemCompletion(), чтобы объединить две связанные фразы в одну биграмму? Как свободное общество и свободное общество до free_society в облаке слов выше. - person Katrin Leinweber; 20.08.2016
comment
Не уверен, что я понимаю вопрос, но: Вы не можете использовать эти функции, примененные к объекту quanteda, поскольку они взяты из другого пакета. - person Ken Benoit; 21.08.2016
comment
Я не понимал, что корпус становится другим объектом. Спасибо что подметил это! Но может ли quanty-DFM быть легко преобразован в tm-DTM? - person Katrin Leinweber; 23.08.2016

Хорошо .. После долгих исследований я нашел идеальный ответ. Прежде всего, если вы хотите объединить в облако несколько слов, это называется биграммами. Для этого доступны пакеты R, такие как «tau» и «Rweka».

Эта ссылка поможет вам: Это

person Lian Ahmad    schedule 11.04.2016

Лучшее предложение для вас - посмотреть короткое пятиминутное видео (ссылка ниже):

https://youtu.be/HellsQ2JF2k

Если вам нужен непосредственно код R, вот он:

mycorpus <- Corpus(VectorSource(subset(Words$Author.Keywords,Words$Year==2012)))

Очистка текста Преобразование текста в нижний регистр

mycorpus <- tm_map(mycorpus, content_transformer(tolower))

Удалить числа

mycorpus <- tm_map(mycorpus, removeNumbers)

Удалить распространенные английские игнорируемые слова

mycorpus <- tm_map(mycorpus, removeWords, stopwords("english"))

Удалить знаки препинания

mycorpus <- tm_map(mycorpus, removePunctuation)

Устранение лишних пробелов

mycorpus <- tm_map(mycorpus, stripWhitespace)
as.character(mycorpus[[1]])

Биграммы

minfreq_bigram<-2
token_delim <- " \\t\\r\\n.!?,;\"()"
bitoken <- NGramTokenizer(mycorpus, Weka_control(min=2,max=2, delimiters = token_delim))
two_word <- data.frame(table(bitoken))
sort_two <- two_word[order(two_word$Freq,decreasing=TRUE),]
wordcloud(sort_two$bitoken,sort_two$Freq,random.order=FALSE,scale = c(2,0.35),min.freq = minfreq_bigram,colors = brewer.pal(8,"Dark2"),max.words=150)
person High 5 Learning    schedule 09.08.2017