Как провести лингвистический анализ текста: различия между версиями

Материал из Поле цифровой дидактики
Строка 115: Строка 115:
== TF-IDF ==
== TF-IDF ==


{{#ask: [[TF-IDF]] | ?Desctiption }}
{{#ask: [[TF-IDF]] | ?Description }}
[[TF-IDF]] показывает, насколько слово важно для конкретного текста/категории по сравнению со всем корпусом.
[[TF-IDF]] показывает, насколько слово важно для конкретного текста/категории по сравнению со всем корпусом.



Версия от 17:26, 10 декабря 2025

Описание Нам нужно провести сравнительный анализ текстов по лингвистическим характеристика:
  1. Лексическое разнообразие (Type-Token Ratio). Отношение количества уникальных слов (типов) к общему числу слов (токенов). Высокий TTR указывает на разнообразие лексики, низкий — на повторяемость.
  2. Частотность слов и облака слов
  3. TF-IDF: выявление ключевых терминов. TF-IDF показывает, насколько слово важно для конкретного текста/категории по сравнению со всем корпусом
Область знаний Лингвистика, Литература, Статистика
Область использования (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-IDFTF-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()



Voyant Tools
  • Используйте инструмент Cirrus для просмотра облака слов
  • Отрегулируйте список стоп-слов для выявления наиболее информативных терминов