Использование инструментов естественного языка для обнаружения разговорных данных.

Анализ текста или интеллектуальный анализ текста - это анализ «неструктурированных» данных, содержащихся в тексте на естественном языке, с использованием различных методов, инструментов и приемов.

Популярность интеллектуального анализа текста сегодня обусловлена ​​статистикой и доступностью неструктурированных данных. С ростом популярности социальных сетей и с учетом того, что Интернет является центральным местом для всевозможных важных разговоров, интеллектуальный анализ текста предлагает недорогой метод оценки общественного мнения.

Это было моим вдохновением, чтобы узнать о текстовой аналитике, написать этот блог и поделиться своими знаниями с коллегами по анализу данных!

Моя основная ссылка в этом блоге - это красиво оформленный курс 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)