Я провожу текстовый анализ комментариев клиентов банка, связанных с ипотекой, и нахожу несколько вещей, которые мне действительно понятны.
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")
В частности, как выглядят ваши данные? (Используйте dput(head(my_df))
для переноса данных из R в SO.) Где определены ваши функции, отличные от Base-R? (например, где мне найти replace_abbreviation
? Он в пакете?) И, наконец, вы должны обратить внимание на ту часть кода, которая вызывает у вас проблемы - 42 строки кода - это слишком много, чтобы мы могли копаться. Спасибо и удачи!
Спасибо @DanY !! Извините, я не часто комментирую, так что практики нет! Я добавил, как будет выглядеть образец. Что касается функций, то они в основном из пакета TM.
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, попробуйте этот код text <- c(" ", "text"); my_corp <- Corpus(VectorSource(text)); my_dtm <- DocumentTermMatrix(my_corp); inspect(my_dtm)
. Вы можете видеть, что создано 2 документа, но в dtm будет отображаться только «текст», вектор с «» был удален. (изменение wordLength не повлияет на результат). В результате получается больше документов, чем терминов. @ Q2, попробуйте поищите в своем тексте "промах".
Привет @priver, извини, а что бы "текст" был? Вся колонка со всеми комментариями? Q2 - Я искал только слово «пропущено», но не смог найти его как таковое, да, например, как «пропущено» ... Спасибо!
@Robbie, в примере в комментарии «текст» - это просто слово «текст». Больше ничего.
Добро пожаловать в SO! В этом сообществе есть несколько правила и нормы, и следование им поможет вам получить хороший ответ на свой вопрос. В частности, лучше всего предоставить MCVE (минимальный, полный и проверяемый пример). Хороший совет для RR-специфичных MVCE доступен здесь и здесь.