Использование инструментов естественного языка для обнаружения разговорных данных.
Анализ текста или интеллектуальный анализ текста - это анализ «неструктурированных» данных, содержащихся в тексте на естественном языке, с использованием различных методов, инструментов и приемов.
Популярность интеллектуального анализа текста сегодня обусловлена статистикой и доступностью неструктурированных данных. С ростом популярности социальных сетей и с учетом того, что Интернет является центральным местом для всевозможных важных разговоров, интеллектуальный анализ текста предлагает недорогой метод оценки общественного мнения.
Это было моим вдохновением, чтобы узнать о текстовой аналитике, написать этот блог и поделиться своими знаниями с коллегами по анализу данных!
Моя основная ссылка в этом блоге - это красиво оформленный курс DataCamp Text Mining - Bag of Words.
Ниже приведены шесть основных шагов для проекта интеллектуального анализа текста. В этом блоге я сосредоточусь на шагах 3, 4, 5 и 6 и рассмотрю ключевые пакеты и функции в R, которые можно использовать для этих шагов.
1. Определение проблемы
Определение конкретных целей или задач для любого проекта является ключом к его успеху. Чтобы правильно сформулировать постановку проблемы, необходимо иметь понимание предметной области.
В этой статье я буду спрашивать, есть ли у Amazon или Google лучшее восприятие оплаты согласно онлайн-обзорам и у кого лучший баланс между работой и личной жизнью, согласно текущим отзывам сотрудников.
2. Определение источников текста
Существует несколько способов сбора отзывов сотрудников: от таких веб-сайтов, как Glassdoor и Indeed, до статей, опубликованных с обзорами на рабочем месте, или даже посредством интервью с сотрудниками в фокус-группах.
3. Организация текста
Это включает в себя несколько шагов для очистки и предварительной обработки вашего текста. В R есть два основных пакета, которые можно использовать для этого: qdap и tm.
Что следует помнить:
- пакет tm работает с объектом текстового корпуса
- пакет qdap применяется непосредственно к текстовому вектору
x - ›вектор с положительными отзывами на Amazon
# qdap cleaning function > qdap_clean <- function(x) { x <- replace_abbreviations(x) x <- replace_contractions(x) x <- replace_number(x) x <- replace_ordinal(x) x <- replace_symbol(x) x <- tolower(x) return(x) }
** Вы также можете добавить дополнительные функции очистки к вышеуказанному, в зависимости от конкретных требований.
корпус - ›VCorpus (VectorSource (x))
Затем используйте функцию tm_map (), предоставленную пакетом tm, чтобы применить функции очистки к корпусу. Сопоставление этих функций со всем корпусом упрощает масштабирование шагов очистки.
# tm cleaning function > clean_corpus <- function(corpus){ corpus <- tm_map(corpus, stripWhitespace) corpus <- tm_map(corpus, removePunctuation) corpus <- tm_map(corpus, content_transformer(tolower)) corpus <- tm_map(corpus, removeWords, c(stopwords("en"), "Google", "Amazon", "company)) return(corpus) }
Выделение корня слова и завершение корня в предложении с использованием пакета tm
Пакет tm предоставляет функцию stemDocument () для доступа к корню слова. Эта функция либо принимает вектор символов и возвращает вектор символов, либо принимает PlainTextDocument и возвращает PlainTextDocument.
# Remove punctuation > rm_punc <- removePunctuation(text_data) # Create character vector > n_char_vec <- unlist(strsplit(rm_punc, split = ' ')) # Perform word stemming: stem_doc > stem_doc <- stemDocument(n_char_vec) # Re-complete stemmed document: complete_doc > complete_doc <- stemCompletion(stem_doc, comp_dict)
Запомните:
Определите свой собственный comp_dict, который представляет собой настраиваемый словарь, содержащий слова, которые вы хотите использовать для повторного заполнения слов с корнем.
4. Извлечение признаков
Следующим шагом после завершения базовой очистки и предварительной обработки текста является извлечение ключевых функций, что может быть выполнено в форме оценки тональности или извлечения н-граммов. и их построение. Для этой цели очень удобны функции TermDocumentMatrix (TDM) или DocumentTerm Matrix (DTM).
# Generate TDM > coffee_tdm <- TermDocumentMatrix(clean_corp) # Generate DTM > coffee_dtm <- DocumentTermMatrix(clean_corp)
Что следует помнить:
Вы можете использовать TDM, когда у вас больше слов, чем документов для просмотра, поскольку легче читать большое количество строк, чем столбцов.
Затем вы можете преобразовать результаты в матрицы с помощью функции as.matrix (), а затем нарезать и нарезать кубиками и просмотреть части этих матриц.
Рассмотрим простой пример создания TDM для биграмм:
Чтобы создать TDM биграммы, мы используем TermDocumentMatrix () вместе с аргументом элемента управления, который получает список функций управления (дополнительные сведения см. В TermDocumentMatrix). Здесь используется встроенная функция tokenizer, которая помогает размечать слова как биграммы.
# Create bigram TDM > amzn_p_tdm <- TermDocumentMatrix( amzn_pros_corp, control = list(tokenize = tokenizer)) # Create amzn_p_tdm_m > amzn_p_tdm_m <- as.matrix(amzn_p_tdm) # Create amzn_p_freq > amzn_p_freq <- rowSums(amzn_p_tdm_m)
5. Анализ характеристик
Есть несколько способов проанализировать особенности текста. Некоторые из них обсуждаются ниже.
а. Barplot
# Sort term_frequency in descending order > amzn_p_freq <- sort(amzn_p_freq, decreasing = TRUE) > # Plot a barchart of the 10 most common words > barplot(amzn_p_freq[1:10], col = "tan", las = 2)
б. WordCloud
# Plot a wordcloud using amzn_p_freq values > wordcloud(names(amzn_p_freq), amzn_p_freq, max.words = 25, color = "red")
Чтобы узнать больше о различных способах построения wordcloud, пожалуйста, обратитесь к этой статье, которая мне показалась весьма полезной.
c. Кластерные дендограммы
Это простой метод кластеризации для создания иерархического кластера и создания дендрограммы, чтобы увидеть, насколько связаны разные фразы.
# Create amzn_p_tdm2 by removing sparse terms > amzn_p_tdm2 <- removeSparseTerms(amzn_p_tdm, sparse = .993) > # Create hc as a cluster of distance values > hc <- hclust(dist(amzn_p_tdm2, method = "euclidean"), method = "complete") > # Produce a plot of hc > plot(hc)
В дендрограмме можно увидеть похожие темы, такие как «большие преимущества», «хорошая оплата», «умные люди» и т. Д.
d. Словесная ассоциация
Это используется для изучения основных фраз, которые появляются в облаках слов, и поиска связанных терминов с помощью функции findAssocs () из пакета tm.
Приведенный ниже код используется для поиска слов, наиболее часто связанных с наиболее частыми терминами в положительных отзывах об Amazon.
# Find associations with Top 2 most frequent words > findAssocs(amzn_p_tdm, "great benefits", 0.2) $`great benefits` stock options options four four hundred vacation time 0.35 0.28 0.27 0.26 benefits stock competitive pay great management time vacation 0.22 0.22 0.22 0.22 > findAssocs(amzn_p_tdm, "good pay", 0.2) $`good pay` pay benefits pay good good people work nice 0.31 0.23 0.22 0.22
е. Облака сравнения
Это используется, когда вы хотите изучить два разных корпуса слов за один раз, а не анализировать их по отдельности (что может занять больше времени).
В приведенном ниже коде сравниваются положительные и отрицательные отзывы о Google.
# Create all_goog_corp > all_goog_corp <- tm_clean(all_goog_corpus) > # Create all_tdm > all_tdm <- TermDocumentMatrix(all_goog_corp) <> Non-/sparse entries: 2845/1713 Sparsity : 38% Maximal term length: 27 Weighting : term frequency (tf) > # Name the columns of all_tdm > colnames(all_tdm) <- c("Goog_Pros", "Goog_Cons") > # Create all_m > all_m <- as.matrix(all_tdm) > # Build a comparison cloud > comparison.cloud(all_m, colors = c("#F44336", "#2196f3"), max.words = 100)
е. Графики пирамид
Графики пирамиды используются для отображения графика пирамиды (в отличие от горизонтальной полосы) и помогают в простом сравнении на основе похожих фраз.
В приведенном ниже коде сравнивается частота положительных фраз для Amazon и Google.
# Create common_words > common_words <- subset(all_tdm_m, all_tdm_m[,1] > 0 & all_tdm_m[,2] > 0) > str(common_words) num [1:269, 1:2] 1 1 1 1 1 3 2 2 1 1 ... - attr(*, "dimnames")=List of 2 ..$ Terms: chr [1:269] "able work" "actual work" "area traffic" "atmosphere little" ... ..$ Docs : chr [1:2] "Amazon Pro" "Google Pro" # Create difference > difference <- abs(common_words[,1]- common_words[,2]) > # Add difference to common_words > common_words <- cbind(common_words, difference) > head(common_words) Amazon Pro Google Pro difference able work 1 1 0 actual work 1 1 0 area traffic 1 1 0 atmosphere little 1 1 0 back forth 1 1 0 bad work 3 1 2 # Order the data frame from most differences to least > common_words <- common_words[order(common_words[,"difference"],decreasing = TRUE),] # Create top15_df > top15_df <- data.frame(x = common_words[1:15,1], y = common_words[1:15,2], labels = rownames(common_words[1:15,])) # Create the pyramid plot > pyramid.plot(top15_df$x, top15_df$y, labels = top15_df$labels, gap = 12, top.labels = c("Amzn", "Pro Words", "Google"), main = "Words in Common", unit = NULL) [1] 5.1 4.1 4.1 2.1
6. Выводы по чертежам.
Судя по приведенному выше графику (график пирамиды «Слова в общем»), в целом Amazon выглядит лучше, чем Google. Кажется, что рабочее время на Amazon выше, но, возможно, они предоставляют другие преимущества для восстановления баланса между работой и личной жизнью. Нам нужно собрать больше отзывов, чтобы сделать лучший вывод.
Итак, наконец-то мы подошли к концу этого блога. Мы узнали, как организовать наш проект текстовой аналитики, различные этапы очистки и предварительной обработки и, наконец, как визуализировать функции и делать выводы. Я собираюсь завершить свой проект по текстовой аналитике, основанный на этом блоге и опыте DataCamp. Я скоро опубликую свой репозиторий GitHub для проекта, чтобы помочь вам в дальнейшем. Наша следующая цель - провести анализ настроений. А пока продолжайте КОДИРОВАТЬ !!
Надеюсь, вам понравился этот блог. Делитесь своими комментариями о том, что вам понравилось и что вы бы хотели улучшить в моем следующем блоге.
Продолжайте следить за этим пространством, чтобы узнать больше. Ваше здоровье!
(Впервые опубликовано на сайте www.datacritics.com)