Docker, SSL и 100 баллов Google Speed: Превращаем «голый» контейнер в нормальный сайт GRAV CMS. Часть 3

В прошлых сериях мы с вами сделали страшное: подняли свой сайт на CMS Grav внутри Docker-контейнера. Это было дешево (99 рублей, Карл!), сердито и быстро.

*Выбираем только виртуализацию KVM, для использов…

Инновационная соцсеть❗

Почему UniLive- https://h.unilive.io/#/login?recomId=emwJ8g&language=ru_RU — шанс, который нельзя упустить! В 2009 многие смеялись над биткоином. Сегодня они жалеют, что не поверили первыми. С UniLive #https://t.me/UniLiveProsto — история повторяется, но у тебя ещё есть время! Почему стоит присоединиться прямо сейчас:🟢 Монетизация без подписчиков…

Перевод книги ГИПЕРМЕДИЙНЫЕ СИСТЕМЫ

Перевод книги ГИПЕРМЕДИЙНЫЕ СИСТЕМЫ

Авторы: Карсон Гросс, Адам Степински, Дениз Акшимшек

6 Лучших практик Python, которые отличают Сениоров от Джуниоров

6 Лучших практик Python, которые отличают Сениоров от Джуниоров

В январе 2023 года я опубликовал статью о 5 хитростях Python, которые отличают Сениоров от Джуниоров. В этой статье, вместо того чтобы рассматривать хитрости, мы рассмотрим 6 лучших практик в Python, которые могут отличить опытных разработчиков от новичков. На различных примерах мы рассмотрим различия между кодом, написанным старшим разработчиком,…

𐌡ᥲᥔκ ❤𐌑᧐н 10 𐌺ᥲⲙᥱнᴛ нᥲʙᥙᥴ 50 𐋏ᥲɸᥲρдᥲ ρ᧐ᥙ κн Я ᥙᥴᴛ᧐ρᥙя ⲙᥱκнⲙ. 𐌺ᥲᥴᥱ ᥲᥔ ᥊ᥲⲙᥲ κᥲⲙᥱнᴛᥙ δᥙᥴёρ ⲙᥱнᥲʙᥙᥴᥲ Я ʙᥙдᥱ᧐ ⲙᥱᥴ᧐ᤋⲙɯᥲ

Ⲙⲁⲕⲥυⲙⲩⲙ ⲁⲕⲧυⲃⲁ.

Сайты переходят на протокол http://

В последнее время, некоторые сайты стали открываться по протоколу http без сертификата и даже не пытаются переадресовать на https версию сайта. А в новостных статьях, ссылки на источники или сайты героев сюжета часто теперь указаны сразу на небезопасный протокол http.

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

71

Вместо трех дней — 10 минут: как автоматизировать проверку товарных остатков и остановку/запуск контекстной рекламы

Привет! Я Владимир Малюгин, CEO агентства performance-маркетинга Digital Geeks. Мы активно автоматизируем процессы: это удобно и выгодно. В статье я расскажу, как создать алгоритм, который проверяет наличие товаров в десятке маркетплейсов. А затем останавливает или запускает контекстную рекламу без участия человека.

Внутри — код и пошаговая…

17

Docker, SSL и 100 баллов Google Speed: Превращаем «голый» контейнер в нормальный сайт GRAV CMS. Часть 3

В прошлых сериях мы с вами сделали страшное: подняли свой сайт на CMS Grav внутри Docker-контейнера. Это было дешево (99 рублей, Карл!), сердито и быстро.

*Выбираем только виртуализацию KVM, для использов…

Инновационная соцсеть❗

Почему UniLive- https://h.unilive.io/#/login?recomId=emwJ8g&language=ru_RU — шанс, который нельзя упустить! В 2009 многие смеялись над биткоином. Сегодня они жалеют, что не поверили первыми. С UniLive #https://t.me/UniLiveProsto — история повторяется, но у тебя ещё есть время! Почему стоит присоединиться прямо сейчас:🟢 Монетизация без подписчиков…

Перевод книги ГИПЕРМЕДИЙНЫЕ СИСТЕМЫ

Перевод книги ГИПЕРМЕДИЙНЫЕ СИСТЕМЫ

Авторы: Карсон Гросс, Адам Степински, Дениз Акшимшек

6 Лучших практик Python, которые отличают Сениоров от Джуниоров

6 Лучших практик Python, которые отличают Сениоров от Джуниоров

В январе 2023 года я опубликовал статью о 5 хитростях Python, которые отличают Сениоров от Джуниоров. В этой статье, вместо того чтобы рассматривать хитрости, мы рассмотрим 6 лучших практик в Python, которые могут отличить опытных разработчиков от новичков. На различных примерах мы рассмотрим различия между кодом, написанным старшим разработчиком,…

𐌡ᥲᥔκ ❤𐌑᧐н 10 𐌺ᥲⲙᥱнᴛ нᥲʙᥙᥴ 50 𐋏ᥲɸᥲρдᥲ ρ᧐ᥙ κн Я ᥙᥴᴛ᧐ρᥙя ⲙᥱκнⲙ. 𐌺ᥲᥴᥱ ᥲᥔ ᥊ᥲⲙᥲ κᥲⲙᥱнᴛᥙ δᥙᥴёρ ⲙᥱнᥲʙᥙᥴᥲ Я ʙᥙдᥱ᧐ ⲙᥱᥴ᧐ᤋⲙɯᥲ

Ⲙⲁⲕⲥυⲙⲩⲙ ⲁⲕⲧυⲃⲁ.

Сайты переходят на протокол http://

В последнее время, некоторые сайты стали открываться по протоколу http без сертификата и даже не пытаются переадресовать на https версию сайта. А в новостных статьях, ссылки на источники или сайты героев сюжета часто теперь указаны сразу на небезопасный протокол http.

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

71

Вместо трех дней — 10 минут: как автоматизировать проверку товарных остатков и остановку/запуск контекстной рекламы

Привет! Я Владимир Малюгин, CEO агентства performance-маркетинга Digital Geeks. Мы активно автоматизируем процессы: это удобно и выгодно. В статье я расскажу, как создать алгоритм, который проверяет наличие товаров в десятке маркетплейсов. А затем останавливает или запускает контекстную рекламу без участия человека.

Внутри — код и пошаговая…

17
Что теперь?`[index] ==\"Нет в наличии\" )\n {\n ads_to_stop \u003C-rbind(ads_to_stop,my_camp$Id[i])\n }\n if (surveyresults

Docker, SSL и 100 баллов Google Speed: Превращаем «голый» контейнер в нормальный сайт GRAV CMS. Часть 3

В прошлых сериях мы с вами сделали страшное: подняли свой сайт на CMS Grav внутри Docker-контейнера. Это было дешево (99 рублей, Карл!), сердито и быстро.

*Выбираем только виртуализацию KVM, для использов…

Инновационная соцсеть❗

Почему UniLive- https://h.unilive.io/#/login?recomId=emwJ8g&language=ru_RU — шанс, который нельзя упустить! В 2009 многие смеялись над биткоином. Сегодня они жалеют, что не поверили первыми. С UniLive #https://t.me/UniLiveProsto — история повторяется, но у тебя ещё есть время! Почему стоит присоединиться прямо сейчас:🟢 Монетизация без подписчиков…

Перевод книги ГИПЕРМЕДИЙНЫЕ СИСТЕМЫ

Перевод книги ГИПЕРМЕДИЙНЫЕ СИСТЕМЫ

Авторы: Карсон Гросс, Адам Степински, Дениз Акшимшек

6 Лучших практик Python, которые отличают Сениоров от Джуниоров

6 Лучших практик Python, которые отличают Сениоров от Джуниоров

В январе 2023 года я опубликовал статью о 5 хитростях Python, которые отличают Сениоров от Джуниоров. В этой статье, вместо того чтобы рассматривать хитрости, мы рассмотрим 6 лучших практик в Python, которые могут отличить опытных разработчиков от новичков. На различных примерах мы рассмотрим различия между кодом, написанным старшим разработчиком,…

𐌡ᥲᥔκ ❤𐌑᧐н 10 𐌺ᥲⲙᥱнᴛ нᥲʙᥙᥴ 50 𐋏ᥲɸᥲρдᥲ ρ᧐ᥙ κн Я ᥙᥴᴛ᧐ρᥙя ⲙᥱκнⲙ. 𐌺ᥲᥴᥱ ᥲᥔ ᥊ᥲⲙᥲ κᥲⲙᥱнᴛᥙ δᥙᥴёρ ⲙᥱнᥲʙᥙᥴᥲ Я ʙᥙдᥱ᧐ ⲙᥱᥴ᧐ᤋⲙɯᥲ

Ⲙⲁⲕⲥυⲙⲩⲙ ⲁⲕⲧυⲃⲁ.

Сайты переходят на протокол http://

В последнее время, некоторые сайты стали открываться по протоколу http без сертификата и даже не пытаются переадресовать на https версию сайта. А в новостных статьях, ссылки на источники или сайты героев сюжета часто теперь указаны сразу на небезопасный протокол http.

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

71

Вместо трех дней — 10 минут: как автоматизировать проверку товарных остатков и остановку/запуск контекстной рекламы

Привет! Я Владимир Малюгин, CEO агентства performance-маркетинга Digital Geeks. Мы активно автоматизируем процессы: это удобно и выгодно. В статье я расскажу, как создать алгоритм, который проверяет наличие товаров в десятке маркетплейсов. А затем останавливает или запускает контекстную рекламу без участия человека.

Внутри — код и пошаговая…

17
Что теперь?`[index] ==\"Товар в наличии\" )\n {\n ads_to_start \u003C-rbind(ads_to_start,my_camp$Id[i])\n }\n }\n \n i \u003C- i+1\n \n}\n\n\nif (length(ads_to_start)\u003E0)\n{\n colnames(ads_to_start) \u003C- c(\"Campaign\")\n #Возобнолвям показы объявлений для Товар наличии\n err \u003C- yadirStartAds(Login = accounts[1],\n AgencyAccount = \"login@yandex.ru\",\n Ids = ads_to_start$Campaign) \n}\n\nif (length(ads_to_stop)\u003E0)\n{\n colnames(ads_to_stop) \u003C- c(\"Campaign\")\n # #Останавливаем показы объявлений для товаров НЕТ в наличии\n err \u003C- yadirStopAds(Login = accounts[1],\n AgencyAccount = \"login@yandex.ru\",\n Ids = ads_to_stop$Campaign) \n}","lang":""}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Как настроить отправку данных в мессенджер?"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЧтобы контекстолог не тратил время на проверку таблицы, мы настроили автоматическое оповещение в Telegram. Это можно сделать с помощью сервиса для автоматизации Make (прежнее название — Integromat). Это no-code платформа с интуитивно-понятным интерфейсом. Для работы с ней не нужно уметь программировать — достаточно понимать структуру и логику соединяемых систем, а также знать английский язык, чтобы читать названия полей сервиса. \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EПубликую пошаговый визуал по настройке рассылки в Make.\u003C/b\u003E\u003C/p\u003E"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"Первый шаг: создаем триггер — ссылку, по которой переходит парсер после завершения проверки остатков. Это позволяет сразу же запустить следующий этап работы алгоритма","image":{"type":"image","data":{"uuid":"552d27a0-b93a-562b-a5e4-fbf5cc847151","width":621,"height":383,"size":18205,"type":"png","color":"f4f3f3","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"Второй шаг: проверяем, есть ли изменения статусов товаров в Google Sheets","image":{"type":"image","data":{"uuid":"7d396c26-eb7d-5a75-8564-9ab03b775a59","width":1145,"height":849,"size":36441,"type":"png","color":"f7f7f7","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"Третий шаг: настраиваем отправку сообщений в чат о том, что парсер закончил работу и обнаружил изменения","image":{"type":"image","data":{"uuid":"e14acc71-7a1e-5bd4-8d79-7c4eaa062a06","width":778,"height":766,"size":27341,"type":"png","color":"f6f7f7","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"Четвертый шаг: формируем одну таблицу со всеми изменениями","image":{"type":"image","data":{"uuid":"0fec07c4-928c-53f1-b15f-8ac7d1ac65f5","width":826,"height":831,"size":31855,"type":"png","color":"f6f6f6","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"Пятый шаг: настраиваем автоматическую отправку данных на электронную почту","image":{"type":"image","data":{"uuid":"44dde904-89f5-5440-8f49-cff34f5b3fc9","width":605,"height":792,"size":20316,"type":"png","color":"f7f6f6","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EБлагодаря этому решению, когда оба скрипта завершают свою работу, в проектный чат приходит информация о числе товаров, статус которых изменился. Подробности можно узнать из письма, которое система автоматически отправляет на почту сотрудников Digital Geeks и Panasonic.\u003C/p\u003E"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"Сбор результатов парсинга, отправка данных в Telegram и на почту","image":{"type":"image","data":{"uuid":"b9ccb9cf-fbe6-50a2-9585-63f39d9c2d30","width":1106,"height":688,"size":25110,"type":"png","color":"faf9fa","hash":"","external_service":[]}}}]}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"Формат шаблона письма в среде Make","image":{"type":"image","data":{"uuid":"5f9fa95a-5ad2-55f3-9d1d-11620b24c5e4","width":378,"height":326,"size":5825,"type":"png","color":"f2f1f2","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТакая система уже работает как часы, но можно еще кое-что улучшить. К примеру, сделать так, чтобы алгоритм сохранял данные последовательно, пропуская URL с ошибками. Наш скрипт сначала собирает информацию, а затем размещает ее таблицу, поэтому при любой проблеме на одной из страниц начинает все заново. Чтобы система действовала еще быстрее, можно добавить многопоточность организовать параллельный сбор данных сразу с нескольких адресов. \u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Экономия 150 тыс. рублей в месяц и другие выгоды от автоматизации"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EБлагодаря внедрению этого решения мы сэкономили на оплате труда новых сотрудников, которых пришлось бы нанимать для проверки товарных остатков. \u003Cb\u003EПри этом скрипты работают несравнимо быстрее человека: вместо 2-3 дней они тратят около 10 минут. \u003C/b\u003EА специалисты агентства вместо перехода по ссылкам и изучения таблиц могут заняться задачами, которые требуют креативности и интеллекта.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНе менее очевидна выгода для заказчика. Благодаря автоматизации он может быть уверен, что бюджет не уходит на рекламу страниц товара, который нельзя заказать. \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003ECоздание индивидуальных алгоритмов вместо выбора готовых сервисов ежемесячно экономит компании порядка 150 тыс. рублей.А оперативное оповещение о том, какой товар на каком сайте закончился, помогает нашему партнеру вовремя пополнять запасы продукции во всех интернет-магазинах, не допуская простоя.\u003C/p\u003E"}},{"type":"delimiter","cover":false,"hidden":false,"anchor":"","data":{"type":"default"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EЕсли вы хотите знать больше о продвижении в интернете, загляните в наш\u003Ca href=\"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Ft.me%2Fdigitalgeeks&postId=483722\" rel=\"nofollow noreferrer noopener\" target=\"_blank\"\u003E телеграм-канал Digital Geeks\u003C/a\u003E. Его цель — облегчить жизнь директорам и менеджерам по Digital-маркетингу, а также предпринимателям, которые привлекают клиентов в Сети. В постах мы рассказываем, например, как построить эффективную систему управления SЕО, используя принципы регулярного менеджмента; как быстрее получить результаты; как автоматизировать различные процессы и сделать команду эффективнее. \u003C/p\u003E"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":3,"favorites":34,"reposts":0,"views":95,"hits":840,"reads":null,"online":0,"timespent":null,"shares":0,"reactions":17,"total":989},"dateFavorite":0,"hitsCount":0,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/marketing/483722-vmesto-treh-dnei-10-minut-kak-avtomatizirovat-proverku-tovarnyh-ostatkov-i-ostanovku-zapusk-kontekstnoi-reklamy","author":{"id":722317,"name":"Малюгин Geeks","nickname":"vova_geeks","description":"Руковожу Digital Geeks — агентством performance-маркетинга с уклоном в SEO и GEO-продвижение в нейросетях. Канал: https://t.me/digitalgeeks","uri":"/vova_geeks","avatar":{"type":"image","data":{"uuid":"ce4ff37e-c704-5ab3-9054-2d9cb6c6ab03","width":334,"height":340,"size":55711,"type":"png","color":"95a7a6","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAABQf/xAAmEAACAQIEBQUAAAAAAAAAAAABAgMEEQAFBhIHEyEiYSMxMlHR/8QAGAEAAwEBAAAAAAAAAAAAAAAAAwUGAgT/xAAiEQACAQMEAgMAAAAAAAAAAAABAgADBBEFEyFRMZGhscH/2gAMAwEAAhEDEQA/AHMz0lGeN4parMqxttBCaGCKtdIILt38yIHa5br8hcC3jHPeX1yL2kKbYU+f2Z07TrRtLrNVXLjOD9Slto6bcbBLX6emv5hxvL38yb2n6HoQHT0MMvEOKaSJHdsuWUsygkvtbuv9+cKnUF0OO5TU2IpuAeOJTkY7F6n2GCmBwJ//2Q=="}},"cover":null,"achievements":[{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 11 февраля 2026.","previewUuid":"a9140d54-73b8-5f40-afa8-449fbaafd42b","formats":{"glb":"https://static.vc.ru/achievements/whale.glb","usdz":"https://static.vc.ru/achievements/whale.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.533203125,"textY":0.658203125,"logoX":0.533203125,"logoY":0.77734375,"logoXNoText":0.4375,"logoYNoText":0.66015625},"id":6628662,"userId":722317,"count":0,"shareImage":"https://api.vc.ru/achievements/share/6628662"},{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":4710099,"userId":722317,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4710099"},{"title":"3 года на vc.ru","code":"registration_3_years","description":"Провёл 3 года вместе с vc.ru. Получена 23 июля 2025.","previewUuid":"d9d72ac5-bcb5-55e0-8c72-b99251e5cdd9","formats":{"glb":"https://static.vc.ru/achievements/shark.glb","usdz":"https://static.vc.ru/achievements/shark.usdz"},"viewData":{"contentColor":"#8E6F09","textMaxWidth":0.66796875,"textX":0.5205078125,"textY":0.341796875,"logoX":0.5205078125,"logoY":0.4609375,"logoXNoText":0.5,"logoYNoText":0.3662109375},"id":1086012,"userId":722317,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1086012"}],"lastModificationDate":1771950241,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":"1ee4281e-b189-6840-aca8-c2b27ffffb1a","isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":true,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":"plus","isOnline":false,"tgChannelShortname":"digitalgeeks","category":{"discoveryType":"blogs"},"counters":{"subscribers":46},"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":199113,"name":"Маркетинг","description":"Рекламные кейсы из России и других стран, советы по продвижению, маркетинг и digital.","uri":"/marketing","avatar":{"type":"image","data":{"uuid":"d66009fe-9bf0-52da-bdbf-4c758eba39e7","width":2400,"height":2400,"size":841299,"type":"jpg","color":"f97373","hash":"0c1cf06cf0d010","external_service":[]}},"cover":{"type":"image","data":{"uuid":"5488a646-f32d-57a6-a31f-d290afc4388a","width":960,"height":280,"size":177,"type":"png","color":"fc7c7c","hash":"","external_service":[]}},"lastModificationDate":1661337194,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"marketing","isUnsubscribable":true,"badge":null,"badgeId":null,"isDonationsEnabled":false,"isOnline":false,"isPlus":false,"isUnverifiedBlogForCompanyWithoutPro":false,"isVerified":false,"isRemovedByUserRequest":false,"isFrozen":false,"isPro":false,"type":2,"subtype":"community"},"reactions":{"counters":[{"id":1,"count":17}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}},{"type":"entry","data":{"id":839218,"customUri":null,"subsiteId":2263319,"title":"Что есть NER сервисы и как их применяют в бизнесе от А до Я (практика)","date":1695104348,"dateModified":1695104348,"blocks":[{"type":"media","cover":true,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"721cd08b-564e-5d48-a005-1d91c382c983","width":1100,"height":728,"size":291430,"type":"png","color":"4e353b","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABwYI/8QAKBAAAQQBAwIFBQAAAAAAAAAAAQIDBBEFAAYSBwgTFCEiMUFCUWGS/8QAFgEBAQEAAAAAAAAAAAAAAAAAAwQF/8QAIhEAAQMCBgMAAAAAAAAAAAAAAQADEQIEBRMhMZHhFCKh/9oADAMBAAIRAxEAPwBQ6W9yWdVn5nR7qfvSHDfivLagZOGl/mHEcjxUoE8kUE0QPUAXd3qe1YdNeZUIBG0yVp4m82Gx45kg6mAJH1N47gHGgGgjzQR7fHSxISHa+8JIsX81+9AcOcnRw8do6bokD0HPSm8JtrbmS7jFy8jt/Gyn1qfSp1+I2tagmuIJIsgfT8a1ZIpUh2WsxFjAUI7X8DQo1//Z"}}}]}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Введение"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКрайне важный кейс для бизнеса — автоматизация бизнес процессов, где раньше можно было только использовать, например, оператора или клиентского менеджера, а сейчас им на помощь и замену чат-боты, голосовые ассистенты и вот и настало время, когда без машинного обучения и NLP уже никуда. Предлагаю рассмотреть NER сервисы и если обратиться к \u003Ca href=\"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FNamed-entity_recognition&postId=839218\" rel=\"nofollow noreferrer noopener\" target=\"_blank\"\u003Ewikipedia\u003C/a\u003E:\u003C/p\u003E"}},{"type":"quote","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Ci\u003ENamed-entity recognition (NER) (also known as (named) entity identification, entity chunking, and entity extraction) is a subtask of information extraction that seeks to locate and classify named entities mentioned in unstructured text into pre-defined categories such as person names, organizations, locations, medical codes, time expressions, quantities, monetary values, percentages, etc.\u003C/i\u003E\u003C/p\u003E","subline1":"wiki"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Что есть Named Entity Recognition или NER: логика и принцип работы"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТ. е. Named Entity Recognition (NER) — это задача в области обработки естественного языка (NLP), направленная на выделение и классификацию именованных сущностей в тексте, таких как имена людей, названия организаций, даты, местоположения, суммы денег и другие типы специфических объектов. NER является важным компонентом многих NLP-приложений, таких как извлечение информации, анализ тональности, вопросно-ответные системы и многие другие, как раз наше направление чат-боты, голосовые ассистенты, смс, телефонные разговоры.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EОсновные подходы\u003C/b\u003E:\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E1. \u003Cb\u003EПодход на основе правил (Rule-Based Approach). \u003C/b\u003E В этом подходе создаются наборы правил, которые определяют, какие последовательности слов в тексте могут быть именованными сущностями. Эти правила могут основываться на регулярных выражениях, шаблонах или лингвистических признаках. Примеры библиотек: spaCy (с поддержкой настраиваемых правил), NLTK.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E2. \u003Cb\u003EПодход на основе машинного обучения (Machine Learning-Based Approach). \u003C/b\u003E В этом подходе используются алгоритмы машинного обучения, такие как CRF (Conditional Random Fields), LSTM (Long Short-Term Memory) и BERT (Bidirectional Encoder Representations from Transformers), чтобы обучить модель распознавать именованные сущности. Модель обучается на размеченных данных, где сущности помечены в тексте. Примеры библиотек: spaCy (с обучаемыми моделями), Stanford NER, Flair.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E3. \u003Cb\u003EСовмещенный подход (Hybrid Approach). \u003C/b\u003E Этот подход объединяет правила и машинное обучение для улучшения точности NER. Можно сначала применить правила для выделения сущностей, а затем пропустить текст через модель машинного обучения для уточнения результатов.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EА теперь немного о логике работы NER:\u003C/b\u003E\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E1. \u003Cb\u003EТокенизация текста\u003C/b\u003E, т. е. текст разбивается на отдельные слова или токены;\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E2. \u003Cb\u003EВыделение признаков\u003C/b\u003E — каждому токену назначаются признаки, которые описывают его окружение и контекст, такие как предыдущие и следующие слова, части речи и другие лингвистические характеристики;\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E3. \u003Cb\u003EПрименение модели\u003C/b\u003E — модель анализирует признаки каждого токена и определяет, является ли он именованной сущностью или нет;\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E4. \u003Cb\u003EОбъединение результатов\u003C/b\u003E — результаты анализа токенов объединяются, чтобы сформировать именованные сущности, и им назначаются соответствующие метки классов, такие как «PER« (для персон) или »ORG» (для организаций) ;\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E5. \u003Cb\u003EПостобработка\u003C/b\u003E — дополнительная обработка для уточнения результатов или исправления ошибок;\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EБиблиотеки для NER предоставляют готовые решения для выделения именованных сущностей и могут быть адаптированы под конкретные задачи и типы данных, как например кейсы, описанные в начале статьи. Выбор конкретной библиотеки зависит от требований проекта, языка и доступных данных для обучения, конечно если используется машинное обучение.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"О моей команде"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"336e7134-3ba6-5359-9663-4603add8ed5e","width":1179,"height":330,"size":195395,"type":"png","color":"4c515b","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAABAUGB//EACMQAAICAgEEAgMAAAAAAAAAAAECAwQFBhEACBIhFTETIlH/xAAVAQEBAAAAAAAAAAAAAAAAAAAFBv/EACYRAAICAQMCBgMAAAAAAAAAAAECAxEABDFBBQYSEyFRYXGxwdH/2gAMAwEAAhEDEQA/AIvA5DF4HEZnWM26X8HvLvNsMPxrI1SR4Er2Yq5DI/AhiiH36Yngr99GydvLHOgC15e1n1sEn85S6br+gl6ZN47817ojYgqoHxwTvzzmv0dM7a4aVeHHUM6tRIkWARYu+qCMAeIVVHAHHHAHro59AysQ863zdf3KaHv3q6RqsMRCACgFFAcAUKqtqwnuzhhTT9s8IkX8Oq7HHFwoHgvx7DxX+DgD0OlhK7y2xJJP7yHjgiTSyBVArw16bfWM8Vctri6aramAFeMABz6/UdCz6PTNKxMa3Z4Hvi0Gu1SxKqyMAAOT7fef/9k="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EМоя команда разрабатывает сложные решения и сервисы в BigData для бизнеса с профильным направлением графового анализа и геоанализа данных, также мы предлагаем и ML сервисы (Machine learning): один из которых для разметки аудио, текста и изображений (назовем его «Маркер»), а другие за NER-направление. Хотя совсем недавно я переключился на другой проект, но об этом в следующих статьях.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Примеры NER сервисов"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНаверное ты спросишь, а есть ли разница между обработкой сообщений чат-ботов, смс или телефонных разговоров? Да, но она крайне небольшая, если чат бот и смс — текстовая информация, то телефонный разговор — аудио, которое требуется перекодировать в текст, т. е. сделать расшифровку, а потом уже натравить на текст NER сервисы. Данный вид сервисов важен, так как позволяет автоматизировать часть процессов колл-центров и клиентских менеджеров, а также помочь с проверкой того что услышал, чтобы потом не возникало разногласий. Итого, NER сервисы это не просто применение готовых библиотек, а кастомизированый сервис, который содержит дополнительную логику под определеную бизнес задачу и помогают автоматически извлекать не только сущности, такие как имена клиентов, но и номера счетов, условия предложений, суммы перевода и т. п.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Практика"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПредлагаю продемонстрировать пример такого сервиса с применением библиотек, ставших классическими в мире NLP. Каждая библиотека обладает своими недостатками и преимуществами, но предлагаю не фокусироваться сейчас на этом, а рассмотреть пример из практики, но максимально облегченный.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВозьмём фразу и сделаем набор кода, который нам поможет проанализировать и получить нужные нам сущности и параметры: \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\"\u003Ci\u003EДобрый день, я, Сидоров Иван Иванович. Прошу перевести сто тысяч рублей Якову Петру Игнатьевичу\"\u003C/i\u003E\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКак обработать данную фразу? \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EСценарий:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Собираем массив ФИО, где ФИО совпадающее с ФИО счета — платильщик, а второй элемент ФИО — получателя.","Определяем тип запроса: перевести, оплатить, пополнить баланс и т. п","Находим сумма и её валюту, которую нужно перевести между счетами."],"type":"OL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EКод для извлечения ФИО\u003C/b\u003E\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"import spacy\n\ndef extract_names(text):\n nlp = spacy.load(\"ru_core_news_sm\")\n doc = nlp(text)\n names = []\n for ent in doc.ents:\n if ent.label_ == \"PER\":\n names.append(ent.text)\n\n return names\n\ndef lemmatize_text(text):\n nlp = spacy.load(\"ru_core_news_sm\")\n doc = nlp(text)\n lemmatized_text = \" \".join([token.lemma_ for token in doc])\n return lemmatized_text\n\ntext = \"Добрый день, я, Сидоров Иван Иванович. Прошу перевести сто тысяч рублей Якову Петру Игнатьевичу.\"\nfound_names = extract_names(text)\n\nfor i in range(0, len(found_names), 2):\n two_elements = found_names[i:i+2]\n result = ' '.join(two_elements)\n print(\"Найденное ФИО:\", lemmatize_text(result))","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EПопробуем немного описать логику кода приведенного выше:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Импортирует библиотеку spacy, которая используется для обработки текста и с помощью предварительно обученной модели spacy для русского языка (ru_core_news_sm).","Определяем функцию extract_names(text), которая принимает текст в качестве входного аргумента. Функция выполняет следующие действия: загружает модель ru_core_news_sm, обрабатывает текст с созданием объект Doc, после чего, создает пустой список names для хранения найденных ФИО, проходим по сущностям (ent) в тексте и, если сущность имеет метку «PER» (персона), добавляет её в список names и возвращаем список names, содержащий найденные ФИО.","Определяет функцию lemmatize_text(text), которая принимает текст в качестве входного аргумента. Функция выполняет следующие действия: загружает модель для русского языка (аналогично прошлой функции), обрабатывает текст с помощью этой модели, создавая объект Doc, лемматизирует токены и объединяет в строку, разделенную пробелами, далее возвращает лемматизированный текст.","Извлекаем ФИО из исходного текста с помощью функции extract_names(text) и сохраняет результат в переменную found_names.","Использует цикл for, чтобы пройти по списку found_names и выводить ФИО по два элемента на каждой итерации. Каждая пара ФИО сначала конкатенируется с помощью пробела, затем проходит через функцию lemmatize_text для лемматизации, и наконец выводится на экран."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТаким образом, этот код выполняет извлечение ФИО из текста, лемматизацию ФИО и вывод лемматизированных ФИО по два на каждой итерации.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EС ФИО тут просто, так как мы объявляем массив и потом сопоставляем, а вот с фразами типа: «перевести«, \"отправь\", »скинь» — немного сложнее, нужно в любом случае держать какой то объём допустимых слов-команд. В данном случае я не говорю по крайне ресурсоёмкие современные нейросети на подобии chat gpt, которые способны анализировать текст и ей подобные, будем пользоваться простыми и прозрачными библиотеками, которые не забанит ИБ (знающие поймут). \u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EКод для выявления типа запроса клиента\u003C/b\u003E\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"from pymystem3 import Mystem\n\ndef find_word_in_text(text, word):\n mystem = Mystem()\n lemmatized_text = mystem.lemmatize(text.lower())\n \n if word in lemmatized_text:\n return True\n else:\n return False\n\nphrase = \"Добрый день, я, Сидоров Иван Иванович. Прошу перевести 100 тысяч рублей Якову Петру Игнатьевичу\"\nword = \"перевести\"\n\nis_word_present = find_word_in_text(phrase, word)\nprint(is_word_present)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EВ этом примере мы используем библиотеку \u003Ci\u003Epymystem3\u003C/i\u003E для лемматизации слов. Функция \u003Ci\u003Efind_word_in_text\u003C/i\u003E принимает текст и слово, которое нужно найти, и возвращает \u003Ci\u003ETrue\u003C/i\u003E, если слово присутствует в тексте, и \u003Ci\u003EFalse\u003C/i\u003E, если нет. А теперь ещё раз, что мы сделали в блоке выше: приводим текст к нижнему регистру для удобства обработки, затем мы используем \u003Ci\u003EMystem\u003C/i\u003E для лемматизации текста. После этого мы проверяем, присутствует ли исходное слово в лемматизированном тексте. Если да, функция возвращает, то как и написано выше — True.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EНу что, в принципе мы прошлись целиком по фразе и выявили всё что нам потребовалось… А нет, забыли про главное — деньги! Сколько перевести то?\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EКод для преобразования чисел в в виде цифр\u003C/b\u003E\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#https://github.com/Oknolaz/Russian_w2n\n\nfrom ru_word2number import w2n\ntext_russian = \"Добрый день, я, Сидоров Иван Иванович. Прошу перевести сто тысяч рублей Якову Петру Игнатьевичу\"\nnumber_russian = w2n.word_to_num(text_russian)\nprint(f\"Русский текст: {text_russian} -\u003E Число: {number_russian}\")","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EКод выше, использует библиотеку ru_word2number, которая предоставляет функциональность для преобразования чисел, записанных словами на русском языке, в числовой формат. Давай разберем логику работы этого кода:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Импорт библиотеки ru_word2number:pythonCopy codefrom ru_word2number import w2n Этой строкой кода мы импортируем функцию word_to_num из библиотеки ru_word2number, которая позволяет преобразовать текст, содержащий числа, записанные словами на русском языке, в числовой формат.","Задаем переменную — codetext_russian — с уже знакомым текстом. Здесь задается текст, в котором содержатся числа, записанные словами на русском языке. Этот текст будет подвергнут обработке, и числа будут преобразованы в числовой формат.","Преобразование текста происходит с помощью функции word_to_num из библиотеки ru_word2number. Результат преобразования сохраняется в переменной number_russian."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТаким образом, мы обработали текст с числами, записанными словами на русском языке и преобразовали в числовой формат.\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Cb\u003EКод для поиска валюты платежа\u003C/b\u003E\u003C/p\u003E"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"import re\nimport pymorphy2\n\ntext = \"Добрый день, я, Сидоров Иван Иванович. Прошу перевести сто тысяч рублей Якову Петру Игнатьевичу\"\nmorph = pymorphy2.MorphAnalyzer()\ncurrency_pattern = r'\\b(?:доллар(?:ов|)|евро|рубл(?:ь|я|ей))\\b'\ncurrencies_found = re.findall(currency_pattern, text, flags=re.IGNORECASE)\nlemmatized_currencies = [morph.parse(word)[0].normal_form for word in currencies_found]\n\nprint(\"Найденные наименования валют:\", currencies_found)\nprint(\"Лемматизированные формы:\", lemmatized_currencies)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EДанный код выполняет поиск наименований валют на русском языке (у каждой библиотеки, лемматизатора или модели есть ограничение по языкам) в заданном тексте и лемматизирует их с использованием библиотеки pymorphy2. Логика кода следующая:\u003C/p\u003E"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Задается текст, в котором мы хотитим найти наименования валют.","Инициализируется лемматизатор с помощью pymorphy2.MorphAnalyzer().","Создается регулярное выражение currency_pattern, которое ищет наименования валют. Это регулярное выражение ищет следующие слова: «доллар«, \"долларов\", \"евро\", \"рубль\", \"рубля\", »рублей», игнорируя регистр (флаг re.ignorecase). В данной реализации ограничение — 3 валюты.","С использованием re. findall, производится поиск всех совпадений с регулярным выражением currency_pattern в заданном тексте. Результат поиска сохраняется в переменной currencies_found.","Далее, для каждого найденного наименования валюты из списка currencies_found, выполняется лемматизация с использованием morph. parse(word) [0]. normal_form. Это преобразует слово в его нормальную (лемматизированную) форму с учетом разных склонений и форм на русском языке. Лемматизированные формы сохраняются в переменной lemmatized_currencies.","Найденные наименования валют и их лемматизированные формы выводятся на экран."],"type":"UL"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EТаким образом, код находит и лемматизирует наименования валют в тексте, что позволяет вам работать с ними в единой форме, игнорируя различные склонения и формы.\u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Резюме"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EИтого мы вычленили ФИО отправителя и получателя, сумму и валюту, а также ключевое слово для определения сценария действий. Код написан на основе простых функций без учёта оптимальности. Написать подобный код не так сложно, а вот польза от этого кода колоссальная, так как помогает автоматизировать процесс и не заставлять клиентов ждать. \u003C/p\u003E"}},{"type":"header","cover":false,"hidden":false,"anchor":"","data":{"style":"h2","text":"Приложение, если будет интересно"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EА теперь пример прямо с сайта библиотеки \u003Ca href=\"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fdemo.deeppavlov.ai%2F%23%2Fexamples%2Ftoken_ner&postId=839218\" rel=\"nofollow noreferrer noopener\" target=\"_blank\"\u003Edeeppavlov\u003C/a\u003E\u003C/p\u003E"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"\u003Ci\u003EВсем пока и до новых встреч!\u003C/i\u003E","image":{"type":"image","data":{"uuid":"201e88be-5c9c-501b-8117-5a568a78f206","width":2664,"height":1532,"size":107465,"type":"png","color":"f9f8fa","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABwAJ/8QAIhAAAgICAQMFAAAAAAAAAAAAAQIDBAARBSExUQYTFJLS/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQIA/8QAHBEBAAIDAAMAAAAAAAAAAAAAAQACAxEhBRJB/9oADAMBAAIRAxEAPwDUJY7EgUhkR130ZdnXnvlByDL4lw9feh+h/WbcNQIo371vhfSaW7k8yy8rbjkEkhYOonXSnfcDxlYrKey9keQpXLa5c337GlIIFRVWFAAAAAo0BmV3EANE/9k="}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Ci\u003EP. S. надеюсь количество опечаток было минимальным\u003C/i\u003E\u003C/p\u003E"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003EРесурсы на публикакации\u003C/p\u003E"}},{"type":"link","cover":false,"hidden":false,"anchor":"","data":{"link":{"type":"link","data":{"url":"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fmedium.com%2F%40vov.lov8%2F%D1%87%D1%82%D0%BE-%D0%B5%D1%81%D1%82%D1%8C-ner-%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%8B-%D0%B8-%D0%BA%D0%B0%D0%BA-%D0%B8%D1%85-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D1%8F%D1%8E%D1%82-%D0%B2-%D0%B1%D0%B8%D0%B7%D0%BD%D0%B5%D1%81%D0%B5-%D0%BE%D1%82-%D0%B0-%D0%B4%D0%BE-%D1%8F-%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0-47a774e001d6&postId=839218","title":"Что есть NER сервисы и как их применяют в бизнесе от А до Я (практика)","description":"Введение","image":{"type":"image","data":{"uuid":"dc5bede7-2bc2-5f80-b9f9-bbdb3f7f785c","width":152,"height":152,"size":3489,"type":"png","color":"040404","hash":"","external_service":[]}},"v":1,"hostname":"medium.com"}}}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"\u003Cp\u003E\u003Ca href=\"https://api.vc.ru/v2.8/redirect?to=https%3A%2F%2Fwww.linkedin.com%2Fposts%2Flovtsovvladimir_ml-nlp-ner-activity-7110550088074059776-rEqw%3Futm_source%3Dshare%26utm_medium%3Dmember_desktop&postId=839218\" rel=\"nofollow noreferrer noopener\" target=\"_blank\"\u003Ehttps://www.linkedin.com/posts/lovtsovvladimir_ml-nlp-ner-activity-7110550088074059776-rEqw?utm_source=share&utm_medium=member_desktop\u003C/a\u003E\u003C/p\u003E"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":2,"reposts":0,"views":485,"hits":4364,"reads":null,"online":0,"timespent":null,"shares":0,"reactions":2,"total":4853},"dateFavorite":0,"hitsCount":0,"isCommentsEnabled":true,"isLikesEnabled":true,"isRemovedByUserRequest":false,"isFavorited":false,"isPinned":false,"repostId":null,"repostData":null,"subscribedToTreads":false,"isEditorial":false,"isAudioAvailable":false,"audioUrl":null,"isAudioAvailableToGenerate":false,"commentEditor":{"enabled":true,"who":null,"text":"","until":null,"reason":null,"type":"everybody"},"isBlur":false,"isPublished":true,"isDisabledAd":false,"withheld":[],"ogTitle":null,"ogDescription":null,"url":"https://vc.ru/id2263319/839218-chto-est-ner-servisy-i-kak-ih-primenyayut-v-biznese-ot-a-do-ya-praktika","author":{"id":2263319,"name":"Владимир Ловцов","nickname":null,"description":"TG - @Vladimir_Lov","uri":"","avatar":{"type":"image","data":{"uuid":"c83c1b0f-bc22-5555-8b32-f43cf5a7607c","width":1257,"height":1280,"size":171210,"type":"jpg","color":"25313c","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"d061e742-d606-577e-ad3e-09d8082127ba","width":1792,"height":1024,"size":675182,"type":"webp","color":"5db9b1","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABwUG/8QAIxAAAgECBgIDAAAAAAAAAAAAAQIDBAUABgcREiExYRNRcf/EABgBAAIDAAAAAAAAAAAAAAAAAAQFAgMG/8QAJxEAAQIFAwIHAAAAAAAAAAAAAQIDAAUREiEEMUEUI1FhcYGh0eH/2gAMAwEAAhEDEQA/AFCPM+ZYq+zU9DmRp8rWqnK3pLmsUtZSzsivw+UbyyhnDbAddL2RipJWypZVWpItt2p509oQ9PLdVoWLggOUNxWSCSPAKNBXOK87CKp1K0mYki3Xlge+TXSRSfZAU7H1gkOa0Cl3x+wqVLJetRUGxn0+oP8AIE0z1FbSPK7QNaORiLEoTw33I8ecTYyyCYDnnZm1reASNscmMlBcbgsEarXVAAQAASt9fuBgSMCNS802XFEpG54j/9k="}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":3201273,"userId":2263319,"count":0,"shareImage":"https://api.vc.ru/achievements/share/3201273"}],"lastModificationDate":1771950241,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":8},"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":2263319,"name":"Владимир Ловцов","nickname":null,"description":"TG - @Vladimir_Lov","uri":"","avatar":{"type":"image","data":{"uuid":"c83c1b0f-bc22-5555-8b32-f43cf5a7607c","width":1257,"height":1280,"size":171210,"type":"jpg","color":"25313c","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"d061e742-d606-577e-ad3e-09d8082127ba","width":1792,"height":1024,"size":675182,"type":"webp","color":"5db9b1","hash":"","external_service":[],"base64preview":"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCAAKAAoDAREAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABwUG/8QAIxAAAgECBgIDAAAAAAAAAAAAAQIDBAUABgcREiExYRNRcf/EABgBAAIDAAAAAAAAAAAAAAAAAAQFAgMG/8QAJxEAAQIFAwIHAAAAAAAAAAAAAQIDAAUREiEEMUEUI1FhcYGh0eH/2gAMAwEAAhEDEQA/AFCPM+ZYq+zU9DmRp8rWqnK3pLmsUtZSzsivw+UbyyhnDbAddL2RipJWypZVWpItt2p509oQ9PLdVoWLggOUNxWSCSPAKNBXOK87CKp1K0mYki3Xlge+TXSRSfZAU7H1gkOa0Cl3x+wqVLJetRUGxn0+oP8AIE0z1FbSPK7QNaORiLEoTw33I8ecTYyyCYDnnZm1reASNscmMlBcbgsEarXVAAQAASt9fuBgSMCNS802XFEpG54j/9k="}},"cover_y":0},"achievements":[{"title":"Год на vc.ru","code":"registration_1_year","description":"Первый год с vc.ru. Получена 24 июля 2025.","previewUuid":"0d11c244-49de-50e7-894e-b9b27945d42b","formats":{"glb":"https://static.vc.ru/achievements/fish.glb","usdz":"https://static.vc.ru/achievements/fish.usdz"},"viewData":{"contentColor":"#C67AA3","textMaxWidth":0.634765625,"textX":0.5888671875,"textY":0.54296875,"logoX":0.5859375,"logoY":0.6669921875,"logoXNoText":0.6044921875,"logoYNoText":0.5439453125},"id":3201273,"userId":2263319,"count":0,"shareImage":"https://api.vc.ru/achievements/share/3201273"}],"lastModificationDate":1771950241,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":false,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"category":{"discoveryType":"blogs"},"counters":{"subscribers":8},"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":2}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}}],"ogTitle":null,"ogDescription":null,"isAnonymized":true}};