Токенизация и удаление стоп-слов
Разбивайте текст на токены и отфильтровывайте неинформативные слова с помощью anti_join()
«Токенизация и удаление стоп-слов» — бесплатный урок R Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Что такое анализ текста?
Анализ текста (или текстовая аналитика) преобразует неструктурированный текст в структурированные данные, которые можно анализировать статистически. Пакет tidytext поддерживает аккуратный подход: каждая строка представляет собой один токен (слово, биграмму или предложение), благодаря чему данные совместимы с dplyr и ggplot2.
library(tidytext)
library(dplyr)
# A simple text corpus
text_df <- tibble::tibble(
doc_id = 1:3,
text = c(
'The quick brown fox jumps over the lazy dog.',
'Text mining with R is powerful and fun.',
'Natural language processing enables many applications.'
)
)
cat('Input: ', nrow(text_df), 'documents\n')
cat('Columns:', names(text_df), '\n')unnest_tokens: токенизация слов
unnest_tokens(output, input) разбивает текст, создавая отдельную строку для каждого токена. По умолчанию токенизация выполняется по словам: текст переводится в нижний регистр, а знаки препинания удаляются. Аргумент token поддерживает значения 'words', 'ngrams', 'sentences' и другие.
library(tidytext)
library(dplyr)
text_df <- tibble::tibble(
doc_id = 1:2,
text = c(
'R is a great language for data analysis.',
'Text mining reveals hidden patterns in documents.'
)
)
# Tokenise into words
tokens <- text_df |>
unnest_tokens(word, text)
cat('Tokens extracted:', nrow(tokens), '\n')
print(tokens)Набор данных stop_words
Пакет tidytext поставляется со встроенной тиббл-таблицей stop_words, содержащей 1 149 распространённых английских стоп-слов из трёх лексиконов: SMART, Snowball и onix. Эти слова ("the", "is", "and"…) несут мало смысловой информации и обычно удаляются перед анализом.
library(tidytext)
library(dplyr)
# Inspect the stop_words dataset
cat('Total stop words:', nrow(stop_words), '\n')
cat('Lexicons:', paste(unique(stop_words$lexicon), collapse = ', '), '\n')
# First few stop words from each lexicon
stop_words |>
group_by(lexicon) |>
slice_head(n = 3) |>
print()anti_join: удаление стоп-слов
anti_join(tokens, stop_words, by = 'word') удаляет все строки, в которых значение word совпадает с любой записью в stop_words. Это стандартный шаблон tidytext для удаления стоп-слов — простой, понятный и легко расширяемый.
library(tidytext)
library(dplyr)
text_df <- tibble::tibble(
doc_id = 1:3,
text = c(
'The quick brown fox jumps over the lazy dog',
'A stitch in time saves nine important words',
'To be or not to be that is the question'
)
)
tokens <- text_df |>
unnest_tokens(word, text)
cat('Before removing stop words:', nrow(tokens), '\n')
tokens_clean <- tokens |>
anti_join(stop_words, by = 'word')
cat('After removing stop words:', nrow(tokens_clean), '\n')
print(tokens_clean)count: частота терминов
После токенизации и удаления стоп-слов используйте count(word, sort = TRUE), чтобы вычислить частоту терминов. Это основа многих видов анализа текста: наиболее частотные содержательные слова характеризуют тематику документа.
library(tidytext)
library(dplyr)
# Use Jane Austen's novels from janeaustenr package
# For demo: simulate a small corpus
corpus <- tibble::tibble(
text = c(
'data science involves statistics programming analysis',
'machine learning algorithms data patterns training',
'statistics probability distributions random variables data',
'programming languages python r julia statistics',
'analysis patterns distributions algorithms science'
)
)
word_counts <- corpus |>
unnest_tokens(word, text) |>
anti_join(stop_words, by = 'word') |>
count(word, sort = TRUE)
cat('Top 8 words:\n')
print(head(word_counts, 8))Пользовательские стоп-слова
В корпусах определённой предметной области часто встречаются высокочастотные слова, не имеющие значения для анализа (например, "patient" и "doctor" в медицинских записях). Создайте собственную тиббл-таблицу стоп-слов и объедините её со встроенным лексиконом с помощью bind_rows().
library(tidytext)
library(dplyr)
# Domain-specific words to remove
custom_stops <- tibble::tibble(
word = c('data', 'analysis', 'r', 'using', 'also'),
lexicon = 'custom'
)
# Combine with built-in stop words
all_stops <- bind_rows(stop_words, custom_stops)
cat('Total stop words after custom:', nrow(all_stops), '\n')
corpus <- tibble::tibble(
text = c(
'Using R for data analysis and machine learning models',
'Statistical data analysis also involves data visualisation'
)
)
clean_tokens <- corpus |>
unnest_tokens(word, text) |>
anti_join(all_stops, by = 'word') |>
count(word, sort = TRUE)
print(clean_tokens)Токенизация биграмм
Установите token = 'ngrams', n = 2, чтобы разбить текст на последовательные пары слов (биграммы). Биграммы выявляют такие фразы, как "machine learning" или "data science", которые не распознаются при анализе отдельных слов, и дают более богатый контекст.
library(tidytext)
library(dplyr)
corpus <- tibble::tibble(
doc_id = 1:2,
text = c(
'machine learning and deep learning are powerful techniques',
'natural language processing uses machine learning methods'
)
)
bigrams <- corpus |>
unnest_tokens(bigram, text, token = 'ngrams', n = 2)
cat('Bigrams extracted:', nrow(bigrams), '\n')
print(bigrams)
# Count most common bigrams
bigram_counts <- bigrams |> count(bigram, sort = TRUE)
cat('\nTop bigrams:\n')
print(head(bigram_counts, 5))Фильтрация биграмм для повышения качества
Среди наиболее частотных биграмм часто встречаются пары со стоп-словами, например "of the". Разделите биграмму на два столбца с помощью tidyr::separate(), отфильтруйте строки, в которых хотя бы одно слово является стоп-словом, а затем снова объедините слова, чтобы получить содержательные пары.
library(tidytext)
library(dplyr)
library(tidyr)
corpus <- tibble::tibble(
text = c(
'the field of machine learning and deep learning is growing',
'natural language processing is a subfield of artificial intelligence'
)
)
bigrams_filtered <- corpus |>
unnest_tokens(bigram, text, token = 'ngrams', n = 2) |>
separate(bigram, into = c('word1', 'word2'), sep = ' ') |>
filter(
!word1 %in% stop_words$word,
!word2 %in% stop_words$word
) |>
unite(bigram, word1, word2, sep = ' ') |>
count(bigram, sort = TRUE)
print(bigrams_filtered)Визуализация частот слов
Постройте частоты слов в виде столбчатой диаграммы с помощью ggplot2. Отсортируйте столбцы с помощью reorder(word, n), а для горизонтальных подписей используйте coord_flip(). Это один из наиболее наглядных результатов анализа текста.
library(tidytext)
library(dplyr)
library(ggplot2)
corpus <- tibble::tibble(
text = c(
'statistics probability machine learning algorithms patterns',
'data science programming analysis visualisation models',
'machine learning deep learning neural networks patterns',
'probability statistics hypothesis testing distributions',
'algorithms optimisation gradient descent models training'
)
)
top_words <- corpus |>
unnest_tokens(word, text) |>
anti_join(stop_words, by = 'word') |>
count(word, sort = TRUE) |>
slice_head(n = 10)
ggplot(top_words, aes(reorder(word, n), n)) +
geom_col(fill = 'steelblue') +
coord_flip() +
labs(x = 'Word', y = 'Count', title = 'Top 10 Terms') +
theme_minimal()Подсчёт слов в каждом документе
Если Ваш корпус содержит несколько документов, добавьте столбец с идентификатором документа и сгруппируйте данные по doc_id, word, чтобы вычислить частоты терминов для каждого документа. Эти данные напрямую используются в анализе TF-IDF и тематическом моделировании.
library(tidytext)
library(dplyr)
docs <- tibble::tibble(
doc_id = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
text = c(
'machine learning models training',
'neural networks deep learning',
'algorithms gradient descent optimisation',
'statistical analysis probability distributions',
'hypothesis testing confidence intervals regression',
'bayesian inference prior posterior likelihood',
'data visualisation plots charts dashboards',
'ggplot2 ggvis plotly interactive graphics',
'colour scales aesthetics themes layers'
)
)
word_counts <- docs |>
unnest_tokens(word, text) |>
anti_join(stop_words, by = 'word') |>
count(doc_id, word, sort = TRUE)
cat('Word-doc pairs:', nrow(word_counts), '\n')
print(head(word_counts, 10))Токенизация предложений
Установите token = 'sentences', чтобы разделить текст по границам предложений. Токены уровня предложений полезны для анализа тональности (оценка каждого предложения), реферирования (выбор репрезентативных предложений) и задач «вопрос — ответ».
library(tidytext)
library(dplyr)
doc <- tibble::tibble(
id = 1L,
text = paste(
'R is a statistical programming language.',
'It is widely used in data science and machine learning.',
'The tidyverse makes data manipulation easy.',
'Text mining with tidytext is elegant and powerful.'
)
)
sentences <- doc |>
unnest_tokens(sentence, text, token = 'sentences')
cat('Sentences found:', nrow(sentences), '\n')
print(sentences$sentence)Быстрая проверка
Вы токенизировали корпус по словам с помощью unnest_tokens() и хотите удалить распространённые английские слова. Какая операция выполнит это с использованием встроенного набора данных stop_words?
Повторение: токенизация и стоп-слова
Основные выводы:
unnest_tokens(word, text)преобразует исходный текст в аккуратный формат: одна строка на каждое слово- По умолчанию текст переводится в нижний регистр, а знаки препинания удаляются; поддерживаются
'words','ngrams','sentences' stop_words— встроенная тиббл-таблица с 1 149 распространёнными английскими словами из 3 лексиконовanti_join(tokens, stop_words, by = 'word')удаляет стоп-слова- Используйте
bind_rows(), чтобы добавить пользовательские стоп-слова предметной области count(word, sort = TRUE)вычисляет частоту терминов по аккуратно организованным токенам- Биграммы:
unnest_tokens(bigram, text, token = 'ngrams', n = 2)
library(tidytext)
library(dplyr)
tibble::tibble(text = 'The quick brown fox jumps over the lazy dog') |>
unnest_tokens(word, text) |>
anti_join(stop_words, by = 'word') |>
count(word, sort = TRUE) |>
print()Часто задаваемые вопросы
Урок «Токенизация и удаление стоп-слов» бесплатный?
Да — полный текст урока «Токенизация и удаление стоп-слов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Токенизация и удаление стоп-слов»?
Разбивайте текст на токены и отфильтровывайте неинформативные слова с помощью anti_join() Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Токенизация и удаление стоп-слов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Токенизация и удаление стоп-слов
- TF-IDF и анализ частотности терминов
- Анализ тональности в R
- Тематическое моделирование с LDA