Типичная ситуация в нынешнем образовательном процессе в школе. На часах 22:00, в электронном дневнике ребенка появляется новое задание. В лучшем случае на послезавтра, но обычно на завтра.


Вариантов реакции три:


  • не делать вовсе;
  • «не заметить» и отложить решение вопроса на потом;
  • попробовать сделать.

Вторая реакция по сути идентична первой, поскольку снежный ком таких заданий будет стремительно накапливаться без каких-либо шансов его разобрать.


Выбирая третий вариант, в отдельных случах даже задания по русскому языку можно попробовать решить с помощью R, принимая во внимание, что на все про все есть 15-20 минут максимум. 5 минут на «экстремальное программирование», 10-15 минут на чистовое оформление. Когда принципиально задача решена оформление можно уже и утром сделать


Является продолжением серии предыдущих публикаций.


Какие задачи пытаемся решить?


Естественно, сочинение писать или думать надо самостоятельно. Но есть определенный класс задач, который выглядит как задание для робота и алгоритмизируется хорошо.


Ниже просто обобщенные примеры, наверняка, многие найдут что добавить.


Задачка 1


Составление кроссвордов (русский/английский). Существуют псевдовариации — составление в заданной геометрической структуре или же в свободной форме. Опционально может быть задана тема.


Задачка 2


Подобрать N слов на заданную тему в которых встречаются (отсутствуют) буквы (подмножество на выбор).


Задачка 3


Подобрать N слов, которые могут быть написаны с 'не' как слитно, так и раздельно.


Варианты решения при помощи R


Подобный класс задач подразумевает наличие большого словарного запаса. Эта «долгая» стратегия и решается она только системным чтением художественной литературы.
N может быть реально большим (несколько десятков), а у нас есть 5 минут.


Шаг №1. Ищем и загружаем готовые корпуса русского языка. Можно использовать все, что удастся найти. Недавно хорошая подборка была здесь. Если ее там нет, то можно поглядеть в кладовке.


Загрузка словарей
library(tidyverse)
library(readr)
library(magrittr)
library(stringi)
library(udpipe)
library(tictoc)

# Cловари русского языка для скачивания
# http://www.speakrus.ru/dict/

# Словарь Про-Линг, 125723 слова
voc1_df <- here::here("data", "pldf-win.zip") %>%
  readr::read_delim(col_names = "word", delim = " ",
                    locale = locale("ru", encoding = "windows-1251"))

# Словарь русской литературы, 162232 слова
voc2_df <- here::here("data", "litf-win.zip") %>%
  readr::read_delim(col_names = c("word", "freq"), delim = " ",
                  locale = locale("ru", encoding = "windows-1251")) %>%
  select(-freq)

# Словарь А. А. Зализняка, 93392 слова
voc3_df <- here::here("data", "zdf-win.zip") %>%
  readr::read_delim(col_names = "word", delim = " ",
                    locale = locale("ru", encoding = "windows-1251"))

# Толковый словарь под ред. C. И. Ожегова, 1991 г., 61458 статей
voc4_df <- here::here("data", "ozhegovw.zip") %>%
  readr::read_delim(delim = "|", quote = "", locale = locale("ru", encoding = "windows-1251")) %>%
  select(word = VOCAB)

voc_df <- bind_rows(voc1_df, voc2_df, voc3_df, voc4_df) %>%
  distinct()

# --------------- udpipe
# ud_model <- udpipe_download_model(language = "russian")
ud_model <- udpipe_download_model(language = "russian-syntagrus")

Шаг №2. Решаем задачи


Решаем задачу 1. Например, нам нужны слова из 7 букв, 1-ая — 'Р', 3-я — 'Ч'


words_df <- voc_df %>%
  filter(stri_length(word) == 7) %>%
  filter(stri_sub(word, 3, 3) == "ч") %>%
  filter(stri_sub(word, 1, 1) == "р")

Решаем задачу 2. Например, нам нужно Подобрать слова в которых встречаются буквы "В е ж з к н о с х э ю"


voc_df %>%
  filter(stri_detect_regex(tolower(word), "^[вежзкносхэю]+$")) %>%
  mutate(l = stri_length(word)) %>%
  arrange(desc(l)) %>%
  print(n = 400)

Решаем задачу 3. Какие существительные могут быть написаны с 'не' как слитно, так и раздельно?


tic("Аннотируем")
print(lubridate::now())
ann_tbl <- voc_df %>%
  mutate(ne_word = stri_c("не", word)) %>%
  inner_join(voc_df, by = c("ne_word" = "word")) %>%
  # stri_trans_general(id ="Latin-ASCII")
  {udpipe_annotate(ud_model, x = .$word, trace = TRUE)} %>%
  as_tibble()
toc()

ne_tbl <- ann_tbl %>%
  filter(upos == "NOUN") %>%
  select(word = token) %>%
  # немного постправок
  filter(stri_length(word) > 3) %>%
  filter(!stri_detect_regex(word, "ий$")) %>%
  mutate(ne_word = stri_c("не", word)) %>%
  sample_n(200) %T>%
  print(n = 200)

И т.д. и т.п. Нет цели написать идеально работающий алгоритм, основная задача — отсеять максимально быстро 99% ненужного, а из оставшегося выбрать то, что интересует. Экономит много времени, сил и нервов.


P.S.


  1. Свои соображения и жалобы по поводу образовательного процесса пишите на kremlin.ru, писать их здесь в комментариях бессмысленно.
  2. Описан довольно штатный сценарий, который типичен для нынешней системы образования и один из возможных способов реакции. ОДИН ИЗ. Не стоит давать оценки кому бы то ни было, тем более что никакой конкретной информации кроме формулировки задач здесь и нет. На 100% ошибетесь.
  3. Будет хорошо, если каждый желающий дать совет в комментариях сначала напишет, сколько у него детей и какого возраста. Понятен будет корректирующий коэффициент к совету.
  4. Если надумаете писать совет или частное мнение «за жизнь» в комментариях, то публикация не предполагала никаких таких поучающих советов, их никто не спрашивал.

Предыдущая публикация — «IT Service Health Monitoring средствами R. Взгляд под иным углом».