Хотел бы рассказать про некоторых технические детали решения. В ходе работы со школьными данными я заметил, что на сайтах школ публикуется много отзывов. У этих данных есть 4 особенности:
- Отзывов много. Около 40 000 штук на 700 школ за 2015, 2016 годы. Это больше, чем на специальных сайтах про школьные отзывы типа www.schoolotzyv.ru и schools.mel.fm.
- 90% отзывов — про детские сады. Почему-то про садики пишут чаще и больше. Даже на obr.msk.ru оставляют отзывы про сады, хотя явно указано, что нужны впечатления о школах.
- 99.9% отзывов положительные. Это печально, потому что читать только положительные отзывы неинтересно.
- В 95% отзывов родители персонально благодарят воспитателей. Например, «Инна Юрьевна находит подход к каждому, может унять любой утренний каприз ребенка и помочь родителям».
Поэтому появилась идея сделать вот что:
Тексты отзывов сами по себе не интересны, но интересны упоминания воспитателей. Можно попробовать узнать, каких сотрудников чаще всего благодарят и на основе этого делать свой выбор.
Чтобы выделить имена, я использовал яндексовый Томита-парсер. Три раза прочитал документацию, ничего не понял. К счастью, в их репозитории нашёлся пример, который делает ровно то, что нужно. Чуть-чуть модифицировал код, чтобы находились не только ФИО, но и мена без фамилия. Воспитателей часто упоминают по имени отчеству. Грамматика получается такая:
PersonName -> Word<kwtype="имя"> | Word<kwtype="имя_без_фамилии">;
Person -> PersonName interp (Person.Name);
Вы можете запалить код для запуска Томиты и парсинга результатов его работы. На сколько я понимаю, это, более или менее, единственное доступное решение для выделения имён из русскоязычных текстов. На отзывах точность получается около 95%.
Отдельный квест — это объединить имена в отзывах и анкеты воспитателей со школьных сайтов. Имя и отчество Томита нормализует автоматически, а фамилию оставляет как есть. Поэтому убираем окончания самостоятельно с помощью snowball-стеммера. На сайтах школ ФИО учителей заполнены почти всегда хорошо. Остаётся только привести к общему виду написания типа «Наталья» и «Наталия». В отзывах в половине случаев на воспитателя ссылаются по ФИО, а в половине — по имени отчеству. В 90% случаев в рамках школы сотрудники не дублируются по имена отчеству, поэтому адресата благодарности почти всегда можно определить однозначно. Самая большая проблема заключается в том, что списки сотрудников на сайтах школ неполные и устаревшие. Из-за этого удаётся провязать только 70% имён.
Ещё хотел бы упомянуть инструмент, который меня выручает уже не первый раз. Это детектор лиц из opencv. С его помощью лица воспитателей можно модно поместить в центр кружочков:
Вы можете запалить соответствующий кусочек кода в репозитории obr.msk.ru. Да, этот детектор плохо работает на людях в очках, да, наверняка есть более продвинутые решения. Но на фотках учителей в 90% случаев результат получается хороший.
Наверное, единственный более важный фактор, чем воспитатели — это расположение детского сада. На сайтах школ адреса садов можно найти в соответствующем меню:
Чтобы нанести в это дело на карту используется ещё один инструмент, который выручал меня бесчисленное количество раз — это яндексовый геокодер. Небольшой хак — когда не удаётся геокодировать адрес однозначно, можно добавить к адресу слово «Москва». Например, не «Улица Ленина, 15», а «Москва Улица Ленина, 15».
На всякий случай ссылка на код с вызовом геокодера и на на разбор результатов его работы.
Комментарии (13)
Teutonick
21.06.2016 10:17а можно увидеть какой нить топ 100 или что то, что получилось в итоге вообще?
justmara
21.06.2016 10:19Я «немного» принимал участие в попытках расшифровать зависимости садов/школ и их привязки к адресам, так что понимаю, насколько всё некорректно и запутанно на этих «официальных» сайтах школ. Так что не очень понимаю, зачем вообще оттуда брать данные и вот таким топорным способом обрабатывать.
Пример вот под носом. Школа 1411 с вашего сайта. На самом деле находится по адресу Северный бульвар д.1. А по адресу Алтуфьевское ш. д.40, который у вас указан, на самом деле находится детский сад, относящийся к школе №1327 (ранее 761). В обоих зданиях (с.1 и с.2 на карте). А самих школ 1327 (и старой 761) вообще нет в списке.
В чём ценность таких данных? 8)
mantyr
21.06.2016 11:46Стало больше ссылок на код и примеры — это плюс. А так да, статьи и результаты очень хорошие — побольше бы таких открытых данных в регионах и побольше бы таких точных проектов по ним.
ITMatika
21.06.2016 11:46Наиболее важный инструмент, имхо, — это фильтр по местоположению. А все остальные результаты и рейтинги в первую очередь должны учитывать этот фильтр.
biyk
21.06.2016 11:46На всю статью 2 строчки кода, 4 картинки и 10+ ссылок на то, где нужно посмотреть, чтобы понять о чем в статье идет речь.
>>Три раза прочитал документацию, ничего не понял.
sim3x
21.06.2016 11:47А вот тут
github.com/alexanderkuk/moscow-school2/blob/c578775cc3d0a03de6a0a3ebac5607b8084e9765/main.py#L4699
есть какая-то особая необходимость писать так
if boxes != ():
а не
if boxes:
В
github.com/alexanderkuk/moscow-school2/blob/c578775cc3d0a03de6a0a3ebac5607b8084e9765/main.py#L1301
если там не полезет str, то хватит
if value:
Сравнивать с not None чаще всего совсем не нужно
И есть ли в импортах что-то такое, что еще держит на втором питоне?
Кстати
Если сильно нужно
import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")
то проще шебанг написать в виде
#!/path/to/python2.7") и сделать файл исполняемым
Спасибо за статью!
Возвращаешь веру в хабр ;)
mpetrunin
Когда статистика 99.9% положительных против обычно 80 отрицательных на 20 положительных (цифры на вскидку, но отрицательных почти всегда больше) во всех других сферах, это выглядит крайне странно. Не может так оказаться, что вы распарсили накрученные отзывы?
dmitryredkin
По моим впечатлениям, ЛЮБОЕ упоминание конкретного имени работника в отзыве о предприятии — заказное.
Borz
не обязательно. Не один раз писал/говорил положительные именные отзывы на сотрудников — с меня не убудет, а людям приятно.
kraidiky
Да вы посмотрите хотя бы в самой статье пример — таким матёрым канцеляритом с употреблением педагогических спецтерминов ни один родитель не выражается. 99,8% накрутки, попросту говоря. И одну десятую процента на ваши положительные отзывы.
Думаю автор сделал бы полезное дело если бы показывал вообще только персонализованные отрицательные отзывы, а остальные отбросил.
matshch
Не совсем так. Дело в том, что все эти отзывы пишут родители на сайтах садов, куда ходят их же дети. Если написать что-то плохое, то это может как-то негативно отразиться на ребёнке в детском саду. Так что родители скорее промолчат и ничего не напишут, чем будут ругаться.
kraidiky
Особенно учитывая, что дети маленькие и даже если их будут травить всем садом они просто не смогут пожаловаться родителям. Тоесть фактически отрицательный отзыв могут написать только родители, которых на столько пристукнуло, что они сбежали из детсада возможно наплевав на очень серьёзные финансовые потери, и уж точно забив на сопутствующий гемор.