R - Анализ текста - вводящие в заблуждение результаты

Я провожу текстовый анализ комментариев клиентов банка, связанных с ипотекой, и нахожу несколько вещей, которые мне действительно понятны.

1) После очистки данных без применения Stemming Words и проверки размера TDM количество терминов (2173) меньше, чем количество документов (2373) (это до удаления стоп-слов и TDM размером 1 грамм).

2) Кроме того, я хотел проверить частоту двух слов (rowSums (Matrix)) биграммного токенизирования TDM. Проблема в том, что, например, я получил как наиболее повторяющийся результат, состоящий из двух слов: «Proble miss». Поскольку эта группировка уже была странной, я перешел к набору данных «Control + F», чтобы попытаться найти, но не смог. Вопросы: кажется, что код каким-то образом сдерживает эти слова, как это возможно? (Из 25 лучших двух слов, это единственное, что кажется остановленным). Разве это не должно ТОЛЬКО создавать биграммы, которые всегда вместе?

{file_cleaning <-  replace_number(files$VERBATIM)
file_cleaning <-  replace_abbreviation(file_cleaning)
file_cleaning <-  replace_contraction(file_cleaning)
file_cleaning <- tolower(file_cleaning)
file_cleaning <- removePunctuation(file_cleaning)
file_cleaning[467]
file_cleaned <- stripWhitespace(file_cleaning)

custom_stops <- c("Bank")
file_cleaning_stops <- c(custom_stops, stopwords("en"))
file_cleaned_stopped<- removeWords(file_cleaning,file_cleaning_stops)

file_cleaned_corups<- VCorpus(VectorSource(file_cleaned))
file_cleaned_tdm <-TermDocumentMatrix(file_cleaned_corups)
dim(file_cleaned_tdm) # Number of terms <number of documents
file_cleaned_mx <- as.matrix(file_cleaned_tdm)

file_cleaned_corups<- VCorpus(VectorSource(file_cleaned_stopped))
file_cleaned_tdm <-TermDocumentMatrix(file_cleaned_corups)
file_cleaned_mx <- as.matrix(file_cleaned_tdm)

dim(file_cleaned_mx)
file_cleaned_mx[220:225, 475:478]

coffee_m <- as.matrix(coffee_tdm)

term_frequency <- rowSums(file_cleaned_mx)
term_frequency <- sort(term_frequency, decreasing = TRUE)
term_frequency[1:10]


BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
bigram_dtm <- TermDocumentMatrix(file_cleaned_corups, control = list(tokenize = BigramTokenizer))
dim(bigram_dtm)

bigram_bi_mx <- as.matrix(bigram_dtm)
term_frequency <- rowSums(bigram_bi_mx)
term_frequency <- sort(term_frequency, decreasing = TRUE)
term_frequency[1:15]

freq_bigrams <- findFreqTerms(bigram_dtm, 25)
freq_bigrams}

ОБРАЗЕЦ ДАННЫХ:

> dput(droplevels(head(files,4)))

structure(list(Score = c(10L, 10L, 10L, 7L), Comments = structure(c(4L,

3L, 1L, 2L), .Label = c("They are nice an quick. 3 years with them, and no issue.",

"Staff not very friendly.",

"I have to called them 3 times. They are very slow.",

"Quick and easy. High value."

), class = "factor")), row.names = c(NA, 4L), class = "data.frame")

Добро пожаловать в SO! В этом сообществе есть несколько правила и нормы, и следование им поможет вам получить хороший ответ на свой вопрос. В частности, лучше всего предоставить MCVE (минимальный, полный и проверяемый пример). Хороший совет для RR-специфичных MVCE доступен здесь и здесь.

DanY 10.09.2018 06:00

В частности, как выглядят ваши данные? (Используйте dput(head(my_df)) для переноса данных из R в SO.) Где определены ваши функции, отличные от Base-R? (например, где мне найти replace_abbreviation? Он в пакете?) И, наконец, вы должны обратить внимание на ту часть кода, которая вызывает у вас проблемы - 42 строки кода - это слишком много, чтобы мы могли копаться. Спасибо и удачи!

DanY 10.09.2018 06:05

Спасибо @DanY !! Извините, я не часто комментирую, так что практики нет! Я добавил, как будет выглядеть образец. Что касается функций, то они в основном из пакета TM.

Robbie 10.09.2018 22:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
169
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Q1: Бывают ситуации, когда вы можете получить меньше условий, чем документов.

Сначала вы используете vectorource; количество документов - это количество векторов в вашем txt. Это не совсем соответствует количеству документов. Вектор с пробелом будет считаться документом. Во-вторых, вы удаляете игнорируемые слова. Если в вашем тексте их много, многие слова исчезнут. Наконец, TermDocumentMatrix по умолчанию удаляет все слова меньше 3. Поэтому, если после удаления стоп-слов остались маленькие слова, они также будут удалены. Вы можете настроить это, настроив опцию wordLengths при создании TermDocumentMatrix / DocumentTermMatrix.

# wordlengths starting at length 1, default is 3
TermDocumentMatrix(corpus, control=list(wordLengths=c(1, Inf)))

Q2: без образца документа это предположение.

Вероятно сочетание функций replace_number, replace_contraction, replace_abbreviation, removePunctuation и stripWhitespace. Это может привести к тому, что слово вы не сможете найти очень быстро. Лучше всего искать каждое слово, начинающееся с проба. "Проблема", насколько я понимаю, неправильная основа. Кроме того, qdap и tm не производят стемминга без вашего указания.

У вас также есть ошибка в файле custom_stops. Все игнорируемые слова в нижнем регистре, и вы указали, что ваш текст должен быть в нижнем регистре. Таким образом, ваши custom_stops также должны быть в нижнем регистре. «банк» вместо «банк».

Спасибо @phiver! Q1: Мое ограниченное понимание заключалось в том, что 1 вертор = 1 документу. Что бы вы имели в виду под «вектором с пробелом, который будет считаться документом»? Q2: Чтобы прояснить, я не делал никакого стемминга. Если это поможет прояснить больше, я использовал Ctrl + F с помощью «проблема», и этого нет в наборе данных. Вот почему мне кажется странным, что возникла «проблема». Хороший отзыв о "Банке" :)

Robbie 10.09.2018 23:28

@Robbie, попробуйте этот код text <- c(" ", "text"); my_corp <- Corpus(VectorSource(text)); my_dtm <- DocumentTermMatrix(my_corp); inspect(my_dtm). Вы можете видеть, что создано 2 документа, но в dtm будет отображаться только «текст», вектор с «» был удален. (изменение wordLength не повлияет на результат). В результате получается больше документов, чем терминов. @ Q2, попробуйте поищите в своем тексте "промах".

phiver 11.09.2018 10:30

Привет @priver, извини, а что бы "текст" был? Вся колонка со всеми комментариями? Q2 - Я искал только слово «пропущено», но не смог найти его как таковое, да, например, как «пропущено» ... Спасибо!

Robbie 22.10.2018 00:43

@Robbie, в примере в комментарии «текст» - это просто слово «текст». Больше ничего.

phiver 22.10.2018 14:38

Другие вопросы по теме