Как провести лингвистический анализ текста: различия между версиями
Материал из Поле цифровой дидактики
Patarakin (обсуждение | вклад) |
Patarakin (обсуждение | вклад) |
||
| Строка 115: | Строка 115: | ||
== TF-IDF == | == TF-IDF == | ||
{{#ask: [[TF-IDF]] | ? | {{#ask: [[TF-IDF]] | ?Description }} | ||
[[TF-IDF]] показывает, насколько слово важно для конкретного текста/категории по сравнению со всем корпусом. | [[TF-IDF]] показывает, насколько слово важно для конкретного текста/категории по сравнению со всем корпусом. | ||
Версия от 17:26, 10 декабря 2025
| Описание | Нам нужно провести сравнительный анализ текстов по лингвистическим характеристика:
|
|---|---|
| Область знаний | Лингвистика, Литература, Статистика |
| Область использования (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)
TF-IDF
| Description | |
|---|---|
| TF-IDF | TF-IDF (от англ. TF — term frequency, IDF — inverse document frequency) — статистическая мера, используемая для оценки важности слова в контексте документа, являющегося частью коллекции документов или корпуса. Вес некоторого слова пропорционален частоте употребления этого слова в документе и обратно пропорционален частоте употребления слова во всех документах коллекции. Мера TF-IDF часто используется в задачах анализа текстов и информационного поиска, например, как один из критериев релевантности документа поисковому запросу, при расчёте меры близости документов при кластеризации. |
TF-IDF показывает, насколько слово важно для конкретного текста/категории по сравнению со всем корпусом.
# Вычисляем TF-IDF для выявления характерных слов каждой категории
tfidf_by_category <- tokens_clean %>%
count(category, word) %>%
bind_tf_idf(word, category, n) %>%
arrange(desc(tf_idf))
# Топ-20 ключевых слов для каждой категории
key_terms <- tfidf_by_category %>%
group_by(category) %>%
slice_max(tf_idf, n = 20)
print(key_terms)
# Визуализация ключевых терминов
key_terms %>%
slice_max(tf_idf, n = 10) %>%
ggplot(aes(x = reorder(word, tf_idf), y = tf_idf, fill = category)) +
geom_col() +
facet_wrap(~category, scales = "free") +
coord_flip() +
labs(
title = "Ключевые термины по категориям (TF-IDF)",
x = "Слово",
y = "TF-IDF значение"
) +
theme_minimal()
- Используйте инструмент Cirrus для просмотра облака слов
- Отрегулируйте список стоп-слов для выявления наиболее информативных терминов
