Как провести лингвистический анализ текста
Материал из Поле цифровой дидактики
| Описание | Нам нужно провести сравнительный анализ текстов по лингвистическим характеристика:
|
|---|---|
| Область знаний | Лингвистика, Литература, Статистика |
| Область использования (ISTE) | |
| Возрастная категория |
|
| Поясняющее видео | |
| Близкие рецепту понятия | |
| Среды и средства для приготовления рецепта: | R |
Лексическое разнообразие Type-Token Ratio - TTR
- Отношение количества уникальных слов (типов) к общему числу слов (токенов). Высокий TTR указывает на разнообразие лексики, низкий — на повторяемость.
# Токенизация текстов и удаление стоп-слов
tokens <- corpus %>%
filter(!is.na(text), text != "") %>%
select(title, category, text) %>%
unnest_tokens(word, text) %>%
filter(!str_detect(word, "^[0-9]+$")) # убираем числа
# Загружаем русские стоп-слова
# (можно использовать готовый список или создать свой)
stop_words_ru <- tibble(
word = c("и", "в", "во", "не", "что", "он", "на", "я", "с", "со", "а",
"то", "все", "она", "так", "его", "но", "да", "ты", "к", "у",
"же", "вы", "за", "бы", "по", "только", "ее", "может", "они",
"из", "ему", "еще", "нет", "из", "ему", "еще", "нет", "тем",
"нему", "под", "жизнь", "будто", "ж", "без", "будто", "будто")
)
# Очищаем от стоп-слов
tokens_clean <- tokens %>%
anti_join(stop_words_ru, by = "word") %>%
filter(str_length(word) > 2) # удаляем короткие слова
# Вычисляем TTR по каждой статье
lex_diversity <- tokens_clean %>%
group_by(title, category) %>%
summarise(
tokens = n(),
types = n_distinct(word),
ttr = types / tokens,
log_ttr = types / log(tokens),
.groups = "drop"
)
# Сравнение TTR по категориям
lex_by_category <- lex_diversity %>%
group_by(category) %>%
summarise(
mean_ttr = mean(ttr),
sd_ttr = sd(ttr),
mean_log_ttr = mean(log_ttr),
.groups = "drop"
)
print(lex_by_category)
# Визуализация
ggplot(lex_diversity, aes(x = category, y = ttr, fill = category)) +
geom_boxplot(alpha = 0.6) +
geom_jitter(width = 0.2, alpha = 0.3) +
labs(
title = "Лексическое разнообразие (Type-Token Ratio)",
x = "Категория",
y = "TTR",
subtitle = "Выше = богаче лексика"
) +
theme_minimal() +
theme(legend.position = "none")
# Тест значимости
t_test_ttr <- t.test(
lex_diversity$ttr[lex_diversity$category == "Историки"],
lex_diversity$ttr[lex_diversity$category == "Филологи"]
)
print(t_test_ttr)
- Значительное различие указывает на разные стратегии письма
Частотность слов и облака слов
# Топ-30 слов в каждой категории
top_words <- tokens_clean %>%
group_by(category) %>%
count(word, sort = TRUE) %>%
slice_max(n, n = 30)
# Визуализация топ слов по категориям
top_words %>%
slice_max(n, n = 15) %>%
ggplot(aes(x = reorder(word, n), y = n, fill = category)) +
geom_col() +
facet_wrap(~category, scales = "free") +
coord_flip() +
labs(
title = "Топ-15 слов по категориям",
x = "Слово",
y = "Частота"
) +
theme_minimal()
library(wordcloud2)
# Облако для историков
historians_word_freq <- tokens_clean %>%
filter(category == "Историки") %>%
count(word, sort = TRUE) %>%
head(100)
wordcloud2(historians_word_freq, size = 1.5)
- Используйте инструмент Cirrus для просмотра облака слов
- Отрегулируйте список стоп-слов для выявления наиболее информативных терминов
