R - Анализ текста - вводящие в заблуждение результаты
Я делаю некоторый текстовый анализ комментариев от клиентов банка, связанных с ипотекой, и я нахожу пару вещей, которые я понимаю.
1) После очистки данных без применения слов Stemming Words и проверки размера TDM количество терминов (2173) меньше, чем количество документов (2373)(это перед удалением стоп-слов, поскольку TDM является 1-граммом).
2) Кроме того, я хотел проверить частоту в 2 слова (rowSums(Matrix)) би-граммовой маркировки TDM. Проблема в том, что, например, я получил в качестве самого повторного результата 2 слова "Проблема пропущена". Поскольку эта группировка уже была странной, я пошел к набору данных "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")
1 ответ
Q1: Есть ситуации, когда вы можете получить меньше условий, чем документы.
Сначала вы используете vectorsource; количество документов - это число векторов в вашем тексте. Это не совсем соответствует количеству документов. Вектор с пробелом будет считаться документом. Во-вторых, вы удаляете стоп-слова. Если в вашем тексте их много, многие слова исчезнут. в заключение 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 также должны быть в нижнем регистре. "банк" вместо "банк".