Как родить сына при помощи Python?
В комментариях под другой статьей про машинное обучение поступило довольно заманчивое предложение:
«Почему бы и нет?» подумали мы и решили принять данный челлендж. Для достижения такого «серьёзного» результата нам понадобится Python и чат знакомств.
Используя Python, мы выгрузим заранее просмотренные анкеты, и при помощи каких-нибудь хитрых алгоритмов будем ранжировать новые профиля наших испытуемых на основе уже классифицированных. Так как нам нужны данные для дальнейшей автоматической классификации анкет, в начале попробуем просмотреть около 1000 профилей вручную. «Почему около 1000 профилей?» - спросите вы. На самом деле, результат этого опыта будет зависеть от точности. Чем больше профилей мы возьмем, тем точнее будет наш результат. И мы предполагаем, что примерно 1000 анкет нас устроит.
Этап 1. Просмотр анкет потенциальных вторых половинок.
Нам нужно просмотреть профили для того, чтобы сформировать подготовленный набор данных для дальнейшего использования в программе. Классификация весьма тривиальная, если фотография и описание анкеты понравились, значит ставим «лайк», иначе – «дизлайк».
Этап 2. Выгрузка и предобработка данных для дальнейшего использования.
Изначально наш чат знакомств находился в ВК, и мы неразумно полагали, что сможем получить от поддержки разрешение на использование блока messages из vkAPI. Но, как и следовало ожидать, ВК не захотели выдавать такие права слишком наглым молодым людям. Поэтому, немного погрустив, мы решили перебраться в Телеграмм и вновь перейти к 1 этапу, то есть опять найти чат знакомств и прокликать анкеты.
В Телеграмме для выгрузки данных не пришлось изобретать велосипед и что-то писать: там просто есть кнопка «Экспорт истории чата». Её можно найти, выбрав необходимую беседу чата и нажать по трем точкам в правом верхнем углу. Теперь мы без проблем выгрузим требующиеся данные: выберем в «Настройках экспорта» пункты «Фотографии» и «Стикеры», в формате изменим на json и нажмём «Экспортировать».
Вот такие данные хранятся в json файле. Здесь есть место расположения фотографии человека, описание анкеты, а также наши ответы на них. Теперь достанем оттуда данные.
Подключим библиотеки и будем считывать данные из json файла:
Далее, находим среди всех сообщений бота: анкеты и наши ответы на них. Собираем это всё в один массив:
Отлично. Теперь у нас есть массив со всеми просмотренными анкетами и оценками на эти анкеты. Настало время определиться, как мы, собственно, будем их классифицировать. Изначально у нас были идеи пойти в сторону нейросетей и классифицировать через них. Но что-то не задалось, так как это оказалось слишком сложным и трудоёмким процессом. Поэтому мы решили реализовать «гениальный» алгоритм, который бы подбирал людей по схожести. То есть, наш алгоритм будет сравнивать новую фотографию с теми, которые мы уже отсмотрели и «лайкнули», чтобы выяснить, будет ли потенциальная вторая половинка по фотографии подходить нашему вкусу.
Для этого нам понадобятся библиотека face_recognition для распознавания лица и построения вектора значений и библиотека OpenCV для работы с изображениями:
face_recognition:
pip install dlib
pip install face_recognition
OpenCV:
pip3 install opencv-python
Итак, теперь обойдём все профили, которые мы предварительно записали в all_profiles, и для подходящих профилей построим вектор лица. Подходящие анкеты – это те анкеты, на которые мы поставили «лайк», и в которых указанный возраст больше или равен 18. Во многих чатах знакомств изначально ставятся фильтры по возрасту, тем не менее мы решили подстраховаться, так как у нас иногда встречались анкеты, где возраст был меньше 18.
Теперь с помощью numpy сохраняем набор векторов в отдельный файл:
И можем переходить непосредственно к классификации.
Этап 3. Классификация анкет.
На основе сохранённых ранее векторов, мы будем проверять, подходит ли нам анкета или нет.
Считываем фото и строим для него вектор лица:
Подгружаем сохранённый набор векторов и обходим его циклом, находя для каждого вектора из набора евклидово расстояние между ним и новым вектором с помощью pdist, который мы ранее импортировали:
И наконец, выводим ответ:
Здесь для получения ответа мы используем numpy.average – среднее значение евклидовых расстояний между векторами: если оно больше 0.72, то профиль нам не подходит. Вообще, разработчик face_recognition заявлял, что, если евклидово расстояние между векторами меньше 0.6, то скорее всего на 2 фотографиях один и тот же человек. Соответственно значение до 0.72, которое мы получили исключительно экспериментальным путём, показывает, что 2 человека весьма похожи.
Не баг, а фича.
А теперь о хорошем! Мало того, что наша программа с успехом распознаёт и классифицирует лица представительниц прекрасного пола из реального мира, так ещё она справляется с распознаванием лиц мультипликационных дам.
Например конкретно эта леди весьма успешно проходит классификацию и с показателем numpy.average равным 0.69 легко получает «лайк».
Заключение
Сегодня нами был сделан первый большой шаг в сторону рождения сына: дерево мы уже «вырастили», девушек для потенциального знакомства выбрали, осталось только начать заливать фундамент под будущий дом.
В заключении можно сказать, что, естественно, ни на какую серьёзность мы не претендуем, всё это было сделано исключительно в развлекательных целях. И хотя мы не сделали полную автоматизацию, в целом свою задачу выполнили. В будущем можно дописать программу так, чтобы она без участия человека «прокликивала» анкеты, и при взаимном «лайке» пересылала профиль в личные сообщения или сохраняла его где-то на диске. Вероятно, при добавлении новых функций и идей, мы найдем применение наших функций в реальных задачах.
Весь код можно найти на гитхабе.
Главное питон не должен быть вялым.
шутка просто 10000000 из 10
ты:просто написал ей привет
она: родила вам сына с помощью Python
Комментарий удален модератором