Каким может быть расписание ВУЗа

    Пользуясь медленными и неудобными информационными ресурсами в сети можно проклинать их создателей и терять время, а можно написать паука, который соберёт и классифицирует информацию нужным образом. Уже обработанная информация будет доступна в любой плоскости и с таким откликом, который требуется. Эта статья об одном из таких опытов. С практическим примером разбора и улучшения расписания НГУ (Новосибирского государственного университета).

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



    Идея заключалась в том, чтобы упростить доступ к расписанию. Оригинальное расписание, доступное на сайте НГУ, можно посмотреть здесь. Для того, чтобы найти собственное расписание мне приходилось начинать свой путь с главной страницы сайта, переходить на “старый сайт”, затем “информационные системы”, далее “расписание занятий”, выбрать корпус, факультет, группу, итого — 6 кликов. Большая часть этих переходов казалась вполне осмысленной, кроме выбора корпуса: казалось бы, зачем выбирать корпус, если факультеты всё равно разные, да и общее их число не так велико, чтобы разбивать на две страницы (всего около 10)? Но ситуация становилась немного сложней, если нужно было найти расписание преподавателя или друга. Для преподавателя нужно было в худшем случае проверить оба корпуса, а для друга нужно было найти сначала его в списках групп, узнать номер группы, а потом уже всё остальное. Шаги вполне выполнимые, но не всегда захочется их совершать, а ведь ничего не мешает собрать эту информацию и сделать возможность осуществлять такие выборки просто набрав в строке имя человека, расписание которого требуется узнать — как в поисковых системах, к которым все уже привыкли.

    Разбор списков


    Начнём со списка студентов: к счастью, он доступен в виде xml, и для каждой группы выглядит следующим образом:

    <group name="0502, геолого-геофизический факультет, геология (бакалавриат)">
    <student name="Шабалин Сергей Игоревич" status=""/>
    <student name="Шелепов Ярослав Юрьевич" status=""/>
    <student name="Шепель Яна Евгеньевна" status=""/>
    ...
    </group>
    


    Для того, чтобы экспортировать такие данные, используется следующий код:

    public function exportGroup($groupFile, $groupName, $department, $course) {
    	$grouplist=file_get_contents($groupFile);
    	$dom2 = new domDocument;
    	$dom2->loadXML($grouplist);
    	$s2 = simplexml_import_dom($dom2);
    	for ($k=0;$k<count($s2->student);$k++) {
    		$attrs=$s2->student[$k]->attributes();
    		$student=new Student();
    		$student->name=$attrs["name"];
    		$student->group=$groupName;
    		$student->department=$department;
    		$student->course=$course;
    		$student->save();
    	}
    }
    


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

    Исправление до валидного


    Само расписание занятий не доступно в xml, кроме того, html, сгенерированный системой расписаний НГУ, оказался невалидным, что поставило меня перед выбором: преобразовывать его к валидному или разбирать регулярными выражениями. Надо сказать, что как-то уж очень не хотелось прибегать к regexp-ам. Разглядывая html файлы я понял, что не так уж много нужно сделать, чтобы документы стали валидными, а именно, добавить один тег <tr> (отсутствовал) и указать кодировку. Получилось следующее:

    $text=file_get_contents($url);
    $text = iconv ( "CP1251" , "UTF-8" , $text );
    
    $doc = new DOMDocument();
    $doc->loadHTML(str_replace("</HEAD>", '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </HEAD>', str_replace("<TH Width=10%>", "<TR><TH Width=10%>", $text)));
    $s = simplexml_import_dom($doc);
    


    после этих манипуляций расписание замечательным образом разбиралось. Надо отметить, что можно было не перекодировать в utf, но так как все остальные данные проекта находились в utf, а кодировка в этих файлах не была указана — я предпочёл провести конвертацию на этом шаге.

    Поиск


    Таким образом у меня получились расписание групп и преподавателей, а также списки студентов.
    Расписание в получившейся структуре относится к группе или преподавателю, но не к студенту. Для поиска по студентам, преподавателям, группам и факультетам требовался сложный запрос или несколько запросов к серверу базы данных. Составить такой запрос не проблема, но я опасался за скорость его выполнения. Было решено сделать отдельную таблицу для поиска “searchable”, которая бы содержала в одном столбце псевдонимы, по которым осуществляется поиск, а в другой — адрес документа. В первую очередь — для оптимизации времени доступа. Также это дало возможность обрабатывать запросы вроде “математик василий 1 курс”, но в то же время позволило иметь неконсистентные состояния базы данных, поскольку адрес документа (url) содержится в нескольких различных таблицах. Последнее никак не плюс, но плюсы в данном случае мне виделись гораздо более значительными, чем этот минус.

    REST API


    Для того чтобы у других не было потребности выполнять всю эту рутину заново я опубликовал открытое REST API, которое уже вроде бы используется в двух сторонних проектах. Запрос к API содержит строку поиска и тип запрашиваемого расписания: на день, на неделю и ближайшая пара. Ответ содержит расписание в формате JSON или возможные названия и адреса соответствующих расписаний, когда заданной строке соответствует несколько расписаний.

    Расшифровка сокращений


    После публикации довольно много людей говорили, что в расписании используются непонятные сокращения, которые сложно интерпретировать (например, «О.об.химии» это «Основы общей и неорганической химии», а «ТФКП» — «Теория функций комплексного переменного»). Путей решения этой проблемы я видел два: 1. Предоставить студентам возможность самим указывать полные названия и 2. Попытаться каким-то образом их расшифровать. Первый вариант выглядел простым и весёлым, но спорным, поскольку требовалось вводить систему модерации и возможность смотреть без расшифровки, поскольку я сам не мог определить, насколько верное название было предоставлено, а найти экспертов с каждого факультета практически значит попросить нескольких людей расшифровать эти сокращения. Я попытался изыскать возможность автоматической расшифровки, обнаружил списки кафедр и преподавателей с предметами. Списки эти оказались не полными, но, надо сказать, что и списки студентов абсолютной точностью не отличались. Ко всему, имена преподавателей в списке по кафедрам указаны с расшифровкой имени и отчества, а в расписании с инициалами, но это не такая большая проблема. Первая идея была в том, чтобы найти таких преподавателей, которые ведут только один предмет и по ним определить все названия (в НГУ большинство — совмещают преподавание с другой работой и таких, кто ведёт одну дисциплину немало), но этот метод неожиданно провалился и дал неправильные результаты. Возможно, дело в том, что преподаватели с одним предметом не часто входили в те кафедральные списки, которые мне удалось получить. Дальше я пробовал сравнивать по количеству совпадающих букв, но получились тоже довольно странные результаты. Наилучшим оказался метод, который устанавливает соответствие между сокращённым названием и полным только если у этого преподавателя это единственный предмет, начинающийся на эту букву. Таким образом удалось расшифровать большинство предметов.

    По аудиториям


    Кроме того, у меня очень чесались руки провести статистическое исследование загруженности аудиторий/преподавателей, и мне пришла идея, что можно выводить информацию из расписания на текущий момент: кто и в каких аудиториях сейчас находится, сколько человек, сколько студентов мужского пола, а сколько — женского. Последняя характеристика конечно же была придумана просто для того чтобы сделать проект более весёлым, можно было бы просто вывести все имена, но проблема была в том, что номера групп в расписании не всегда хорошо соответствовали номерам в списках студентов. Например, в расписании могли быть группы 123.1, 123.2, 123.3, а в списках только 123. Таким образом, можно приблизительно сказать сколько человек в каждой группе, но нельзя точно сказать кто именно в какой. Для определения пола я использовал имена студентов. Надо сказать, что определение было настолько точным, насколько я точно могу сам отличить мужское имя от женского, это оказалось не всегда возможно, но в большинстве случаев отлично работает. Исходя из этой информации была построена карта аудиторий, которая обновляется автоматически каждые 10 минут и отображает количество студентов, студенток, количество мест (максимальное число, встречающееся в расписании) и номера групп, которые в данный момент находятся в этой аудитории. Может быть очень полезно если вы ищете пустую аудиторию или потеряли какую-то вещь и хотели бы опросить всех, кто мог её видеть.
    Из расписания были выбраны аудитории, разобраны постфиксы, обозначающие корпус, а дальше выведены на странице так, что получился список следующего вида:



    для каждой аудитории/корпуса отображается график загруженности на любой введённый день



    Это график для главного корпуса НГУ на пятницу; сервис позволяет смотреть такие для любой аудитории или корпуса на любой учебный день (на не учебные график пустой). Здесь по Y — количество человек, время — начало пар. Красный столбик — студентки, синий — студенты, серый — сумма. Бросается в глаза дробная шкала по Y, дело в том, что у меня не получилось настроить библиотеку рисования графиков для вывода только целых чисел, но мне кажется это не сильно принципиальным. Да, дробного количества людей не бывает, но столбики и не упираются в нецелые числа.

    Перед тем как написать статью я решил посмотреть как же всё устроено в МГУ и нашёл расписание, даже карту пустых аудиторий, но оказалось, что для получения информации нужно запастись терпением; и дело даже не в количестве кликов, которых тоже предостаточно, а в очень медленном отклике. Из появляющихся периодически ошибок SQL можно сделать выводы об использовании СУБД, но, видимо как-то не слишком оптимально всё устроено.

    Статистика


    Имеющиеся данные позволили также получить некоторые более глобальные цифры.

    Средняя загрузка аудиторий с учётом максимальной вместимости — 28% (сумма занимающихся студентов разделенная на суммарную вместимость аудиторий, усреднённая по дням и времени)

    Средняя загрузка аудитории в НГУ, если считать её загруженной полностью, когда хотя бы один студент занимается — 60%

    Самые женские аудитории — 500, 431 и 608 — около 89% девушек

    Самая мужская аудитория — 312, всего 10% девушек

    Наиболее женское время — 14:15, 53% девушек

    Наиболее мужское время — 19:20, 46.8% девушек

    Наиболее женский день — вторник, 52.3% девушек

    Наиболее мужской день — понедельник 49.2% девушек

    Из этого можно сделать вывод, что существуют аудитории, в которых занимаются практически одни девушки, но нет какого-то времени или дня, когда число девушек в университете бы преобладало серьёзным образом.

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

    Ссылки:


    оригинальное расписание
    www.nsu.ru/education/schedule
    разобранный прототип
    nsu-schedule.ru
    карта аудиторий on-line
    nsu-schedule.ru/now
    упоминаемое расписание МГУ
    cacs.law.msu.ru
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 34

      +7
      Сделал себе на коленке за два вечера онлайн-расписание. Из очевидных минусов у меня — расписания автоматически разбираются из Word-документа, и если учебная частьтм правит документ ручками, то и результат будет соответствующим. Думаю надо будет обновлять движок из-за увеличения масштабов данных(появилось больше групп)
        +6
        <offtop>Хабраэффект в наглядном виде</offtop>
          0
          Круто. А можете сделать выгрузку для проекта «Расписание вузов на мобильных телефонах»?
            0
            Сразу видно, что человек не заглянул дальше главной страницы. Фамилии преподавателей с названием предметов, дублирующиеся фамилии из-за отсутствующего пробела и прочее — там проблем не обобраться.
            Зато сам сайт — REST API, так что «выгрузку» делать это… смешно.
            Как исправлю критичные баги и сделаю автосинхронизацию с локальной сетью политеха — так сразу.

            Кстати, у нас расписание могут радикально менять несколько раз на неделю. Ваш сервис это учитывает?
              0
              вообще учитывает. Если делаем интеграцию, то да, раз в сутки проверяем и сравниваем. Если есть изменения, то уведомляем об этом.
          +1
          Привет, Ренат.
          Я немного проясню ситуацию с расписанием в НГУ. Текущее расписание создается программой составления расписания, написанной в 90-бородатом году и экспорт расписания на сайт был сделан как дополнение. С тех пор прошло уже почти 20 лет, а программой как пользовались так и пользуются, даже люди составляющие расписание не меняются.
          У нас в университете используется специализированная УИС («У» — университетская), разрабатываемая здесь же, и содержащая всю необходимую для составления расписания информацию. До лета этого года у руководства не было потребностей в Онлайн-расписании, и потому соответствующий модуль для ИС находился в зачаточном состоянии. Сейчас разработка модуля уже есть в планах.
          Кстати, упомянутый список студентов в xml выгружается из УИС.
          P.S. Ссылка на расписание лежит на главной странице в блоке «Образование»
            0
            Хорошее начинание! Ибо задача-то несложная должна быть.
              0
              Автоматизированное составление расписания NP-полная задача (доказано академиком Ершовым, ЕМНИП).
              Понятно, что полной автоматизации не добиться. Все также будет сидеть пара человек и составлять расписание, но уже при помощи нового ассистирующего инструмента.
                0
                вы так говорите об NP полноте, будто это эквивалентно неразрешимости)
                там другие факторы более существенны, например, то что оно не очень-то и меняется из года в год и вряд ли кто-то вообще будет его пересчитывать заново
                  0
                  Я и не говорю о том, что она неразрешима, а только ее сложности.
                  Насчет неизменности расписания Вы не отчасти не правы. Да, бОльшая часть остается неизменной, но меняются преподаватели и/или их пожелания, вроде «я могу только в среду после обеда и каждую вторую пятницу до обеда».
                    +1
                    с точки зрения реализации это задача хорошо известная и есть куча алгоритмов, адаптированных в частности к этому случаю (генетический, имитации отжига и т.д.), также есть куча статей. Кроме того в НГУ есть даже и суперкомпьютер
                      +1
                      И к тому же я не думаю, что будет реализован именно составитель расписания. Скорее это будет инструмент помогающий человеку, способный проверить отсутствие коллизий и выполнения формальных требований.
                0
                на сколько я слышал, уже не один студент защитился на проектах нового расписания, однако на сайте почему-то до сих пор старое. Это замечательно, что вы поставили ссылку и на самом деле я ожидал, что после того как я сделаю своё расписание, ваш ответ в виде обновлённого расписания НГУ появится довольно быстро, но вот уже полгода прошло (

                Ко всему, очень хорошо, что у вас используется специализированная УИС («У» — университетская), но какой смысл был это упоминать?
                  0
                  Проблема в том, что они защищаются, но ни один не пришел и не стал его писать у нас.

                  Про УИС, чтобы было понятно, что не все так плохо.
                +1
                Нам бы Ваши проблемы. В МАИ расписание составляется шариковой ручки на бланках образцов 90х годов. Все предложения со стороны студентов перейти на электронное расписание, даже с предоставлением рабочих Web и мобильных прототипов, сваливались в корзину. Обидно даже.
                  0
                  Не поддерживают со своей стороны — можно самостоятельно поддерживать.
                  0
                  Для того, чтобы найти собственное расписание мне приходилось начинать свой путь с главной страницы сайта, переходить на “старый сайт”, затем “информационные системы”, далее “расписание занятий”,
                  Справедливости ради, это можно сделать проще:
                  картинка
                    0
                    а есть информация о том насколько давно появилась эта возможность?
                    примерно полгода назад я обсуждал это со знакомыми и ни у кого не получалось увидеть такую ссылку на главной, только через старую версию сайта
                    +1
                    А в чем физический смысл разделять в расписании «студентов» и «студенток». Это же вроде не расписание клуба знакомств?
                      0
                      расписание не разделяется, это статистика, реализованная «just for fun»
                        +2
                        Вуз, на самом деле помимо занятий еще и отличный клуб знакомств.:) Так что такая статистика несет еще и глубокое прикладное значение!:)
                        +7
                        В УрФУ расписание выглядит так. Это лучшее расписание из тех, которое я когда-либо видел.
                          0
                          О, спасибо за идею для дизайна. Буду придумывать для своего нового что-то похожее
                            0
                            очень понравилось, что можно искать аудитории «с розетками» или «открытые», но по человеку поиск на нашёл
                              +1
                              Офигеть!
                                +1
                                очень удобное расписание.
                                Неплохо было бы запоминать группу.
                                Неплохо было бы сделать подписку на мыло на изменения.
                                  0
                                  Скрытый текст
                                  Примечательно, что возможность загружать файлы присутствует у всех посетителей.
                                  Просьба не бросаться проверять, поверьте на слово. Незачем там свинарник устраивать.
                                    +2
                                    Как человек из команды разработчиков StudyTime, хочу сказать, что мы были приятно удивлены резко подскочившей посещаемостью за вчера. Сервис в процессе активной разработки, если интересны подробности — можем написать пост, на Хабре есть наш главный разработчик c58, правда он в read-only :)
                                    +2
                                    1. Нельзя вычислять размер массива в цикле:
                                    // а-та-та
                                    for ($k=0;$k<count($s2->student);$k++)
                                    


                                    2. Сущность Student однозначно определяют параметры, устанавливаемые в свойства. Равно как и не может быть студента без имени и т.д. Т.е. это должны быть параметры конструктора.

                                    3.
                                    $grouplist=file_get_contents($groupFile);
                                    $dom2 = new domDocument;
                                    $dom2->loadXML($grouplist);
                                    

                                    Можно записать как
                                    $xml = new DOMDocument();
                                    $xml->load($fileName);
                                    


                                    4. Если файла нет — Exception
                                    file_exists($filename) || throw new \InvalidArgumentException('...')
                                    


                                      +1
                                      Согласен с замечаниями, спасибо. Могу исправить если это не считается здесь дурным тоном
                                      0
                                      Раз тут такая тема пошла, то когда-то давно писал для себя нотифаер, который сообщает на почту об изменении файла с расписанием. Для НГУ.
                                      Вот такой: likhter.ru/misc/checker.sh.txt
                                        0
                                        такая забавная деталь: я в августе заметил, что последнее изменение расписания было в марте и опубликовал скрин. После этого со страницы убрали дату модификации и надпись «расписание меняется ежедневно» изменили на «обновление происходит дважды в сутки», притом согласно «Last modified» сегодня это дважды ещё не наступало (17-Sep-2013 17:53)
                                          0
                                          Несмотря на то, что университет для меня уже закончился, скрипт всё ещё продолжает работу (хороший повод наконец его отключить, да :)).
                                          Запускается он у меня один раз в день в 11 часов по Новосибирску. Сейчас посмотрел по входящей почте — изменения указанного в скрипте файлика происходят нестабильно (4, 5, 6, 7, 11, 12, 14-го числа я получал письма). В прочем, припоминается, что в начале семестра всегда так, потом — где-то ближе к октябрю — устаканивается.
                                        0
                                        Полтора года назад сделал онлайн-расписание на дипломный проект. До этого все через эксель создавалось, и у студентов доступ был только к печатному варианту. Расписание ЧИ БГУЭП

                                        Only users with full accounts can post comments. Log in, please.