Новое обновление: Wildberries позволяет всем пользователям бесплатно отменять заказы!

Новое обновление: Wildberries позволяет всем пользователям бесплатно отменять заказы!

Wildberries наконец-то добавил бесплатную кнопку отмены заказа сразу после оформления для всех пользователей. Раньше она была доступна только при заказах с постоплатой.

АВИТО КРИК ДУШИ ПОРА ВВОДИТЬ ЭТУ ОПЦИЮ

В НАШЕ НЕПРОСТОЕ ВРЕМЯ НА АВИТО КРОМЕ РЕАЛЬНЫХ ПОКУПАТЕЛЕЙ/ ПОЛЬЗОВАТЕЛЕЙ ЗАЧАСТУЮ ЗА ПРОФИЛЯМИ МОГУТ СКРЫВАТЬСЯ В ЛУЧШЕМ СЛУЧАЕ ТЕ, КОМУ ЗАНЯТЬСЯ НЕЧЕМ (#хулиганы ), В ХУДШЕМ СЛУЧАЕ #МОШЕННИКИ , ПРИКИДЫВАЮЩИЕСЯ ПОКУПАТЕЛЯМИ. По факту такие пользователи так как не является покупателями, могут нести опасность и угрозу не только для товара, но и…

9

Распознавание круглых печатей

Бузинов Игорь, специалист в области Data Science поделится опытом применения преобразования Хафа для поиска окружностей на страницах сканированных документов.

Идея обратиться к идентификации геометрических объектов на изображении родилась при решении задачи поиска фальсификата в pdf файлах. В период пандемии многие организации перешли на особ…

3

Точный адрес, пожалуйста

Многие аналитики данных сталкиваются с задачей распознавания адресов, напечатанных на документах.

Для решения этой задачи я обратился к инструментам выявления сущностей в тексте с помощью NLP: NLTK, Spacy, Flair, DeepPavlov, Polyglot, AdaptNLP, Stanza, AllenNLP, HanLP, PullEnti, Natasha и т. д. Глаза начали разбегаться. И что же делать? Коне…

2

API и ФССП: как это работает?

В рамках профессиональной деятельности у меня часто возникает задача получения данных об исполнительном производстве (ИП) в отношении физических лиц с сайта ФССП.

В принципе на сайте ФССП возможность…

2

Многопоточная дешифровка и транскрибация записей телефонных переговоров системы NICE

В этой статье мы хотим познакомить читателей с опытом применения продукта от компании NICE Systems - системой NICE Interaction Management. Данная система обеспечивает тотальную запись разговоров, экранов и всех сопутствующих CTI-данных работы операторов контактных центров. По завершению разговора с оператором система позволяет клиенту дать обратную…

4

Многопотоковая обработка файлов

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

Мне потребовалось преобразовать достаточно большое количество аудио файлов для д…

4

Как найти дубликаты изображений с использованием Computer Vision?

В данной статье мы расскажем, как можно выявить FRAUD сотрудников, проведя анализ полученных изображений документов, приложенных к авансовым отчетам, с помощью Computer Vision.

В нашем случае FRAUDом является прикрепление одного и того же проездного билета к разным авансовым отчетам и, соответственно, необоснованное получение повторной оплаты…

2

Определяем принадлежность объектов к зоне вечной мерзлоты с помощью GeoPandas

Как GeoPandas поможет определить принадлежность объектов к зоне вечной мерзлоты.

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

2

Как найти однотипную информацию в большом количестве файлов, используя Python?

Недавно мы решали следующую задачу – необходимо найти и удалить содержащие номера карт файлы, размещенные на общем ресурсе. Если нужно было бы искали что-то, определенное и однозначное, мы могли бы воспользоваться поиском в самой операционной системе (используя стандартны поиск текста в содержимом файла). Но, как правило, поиск стандартными средств…

5

Pavlov. Deep Pavlov. Или как определить «эмоциональности» в обращениях клиентов?

Pavlov. Deep Pavlov. Или как определить «эмоциональности» в обращениях клиентов?

Сегодня мы покажем, как с помощью инструмента DeepPavlov обучить классификатор для определения наличия «эмоциональности» в обращениях клиентов.

2

Сбор и анализ данных в соц.сетях с API и NLP

Довольно сложная задача найти информацию для работы в области DataScience. Она есть в открытом доступе в такой социальной сети как Вконтакте.

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

3
)==-1 and i.find('.xlsx.')==-1:\n open_arch(path+'/'+i) #Функция по обработке архивов\n else:\n #Если это директория, то проваливаемся в нее\n find_file(os.listdir(path+'/'+i),path+'/'+i)\n except Exception as err:\n print(err,path+'/'+i)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Теперь напишем саму функцию, которая будет обрабатывать найденные по условию файлы:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"def open_arch(path_file):\n z = zipfile.ZipFile(path_file, 'r') #открываем архив\n files=z.namelist() #получаем список файлов в архиве\n try:\n for f in files:\n if f=='xl/sharedStrings.xml':\n if re.search(pattern_card16, z.read(f))!=None or re.search(pattern_card18, z.read(f))!=None:\n list_file.write(path_file+'\\n') #Если находит совпадение, то пишем путь в файл\n #print(re.findall(pattern_card16, z.read(r))) # если вам нужно \n #print(re.findall(pattern_card18, z.read(r))) # выводить совпадения\n except Exception as err:\n print(err, files)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Определяем директорию для поиска и запускаем функцию для поиска:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"path='Y:' #указываем путь к общему ресурсу, здесь я его подцепил как диск Y: \n\nlist_file=open('list_file', 'w+') #открываем файл для записи\nfind_file(os.listdir(path), path) #запускаем обработку","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Резюме

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Наша работа сделана. Ждем, когда отработает скрипт и получим итоговый файл для анализа. Вы зададите вопрос, почему я сразу не стал удалять файлы? Потому что поиск основан на простом регулярном выражении и туда могут попасть номера заявок, договоров и т.д.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В результате нам удалось избежать ручного анализа более 154 тысяч файлов и сократить выборку более чем в 100 раз.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Я надеюсь, моя инструкция была полезна. Спасибо за внимание.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

#selectel_инструкция

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":8,"reposts":0,"views":6,"hits":2345,"reads":null,"online":0},"dateFavorite":0,"hitsCount":2345,"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/dev/156704-kak-naiti-odnotipnuyu-informaciyu-v-bolshom-kolichestve-failov-ispolzuya-python","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"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":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"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":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","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":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764947189,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":235819,"name":"Разработка","description":"Сообщество разработчиков: публикации о личном опыте, выдающиеся приёмы при решении рутинных задач, полезные материалы для профессионального роста.","uri":"/dev","avatar":{"type":"image","data":{"uuid":"fef5b5fb-e488-5b7f-8445-e3a26a910b44","width":1200,"height":1200,"size":7757,"type":"png","color":"343434","hash":"04042b2b1c1000","external_service":[]}},"cover":{"type":"image","data":{"uuid":"2a214cc5-35cc-58ca-bc07-fc1c892d2101","width":960,"height":280,"size":177,"type":"png","color":"343434","hash":"","external_service":[]}},"lastModificationDate":1642411346,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"dev","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":5}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}},{"type":"entry","data":{"id":153742,"customUri":null,"subsiteId":447345,"title":"Pavlov. Deep Pavlov. Или как определить «эмоциональности» в обращениях клиентов?","date":1598595142,"dateModified":1598595142,"blocks":[{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"c20294c8-53eb-1ff4-67ed-f451af014ea9","width":1280,"height":720,"size":1716530,"type":"png","color":"062e46","hash":"","external_service":[]}}}]}},{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"

Сегодня мы покажем, как с помощью инструмента DeepPavlov обучить классификатор для определения наличия «эмоциональности» в обращениях клиентов.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

DeepPavlov – это открытая программная библиотека разговорного AI для создания виртуальных диалоговых ассистентов и анализа текста. Официальный сайт проекта – http://ipavlov.ai/ru.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Перед обучением классификатора нам потребуется размеченный датасет обращений клиентов. В котором обращения с признаками эмоциональности помечены «1», а нейтральные обращения – «0».

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Функция для очистки данных и лемматизации выглядит следующим образом:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\t#функция для лемматизации текста\n2.\tdef lemmatize(text):\n3.\t text = re.sub('[^a-zA-Z]',' ',text).lower()\n4.\t word_list = nltk.word_tokenize(text)\n5.\t lemmatized_output = ' '.join([wordnet_lemmatizer.lemmatize(w) for w in word_list])\n6.\t return \" \".join(lemmatized_output.split())","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Сохраним полученный текст и целевой признак в файл для дальнейшего использования:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\tdf.to_csv('comments.csv')","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Рассмотрим процесс обучения. Для этого необходимо считать датасет в специальную структуру с помощью методов библиотеки DeepPavlov. Разберем подробнее:

"}},{"type":"list","cover":false,"hidden":false,"anchor":"","data":{"items":["Установим DeepPavlov:"],"type":"UL"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\t!pip install deeppavlov","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

2. Импортируем необходимые для работы классы:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\t#Импорт необходимых библиотек для DP\n2.\tfrom deeppavlov.dataset_readers.basic_classification_reader import BasicClassificationDatasetReader\n3.\tfrom deeppavlov.dataset_iterators.basic_classification_iterator import BasicClassificationDatasetIterator\n4.\tfrom deeppavlov.models.preprocessors.str_lower import str_lower\n5.\tfrom deeppavlov.models.tokenizers.nltk_moses_tokenizer import NLTKMosesTokenizer","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

3. Загружаем датасет из файла. При этом укажем целевую переменную, и колонку с текстом:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\tdf_dp = BasicClassificationDatasetReader().read(\n2.\t data_path='',\n3.\t train='comments.csv',\n4.\t x = 'edit_text',\n5.\ty = 'emotional')","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

4. Для обучения и тестирования разобьем на трейн-тест в пропорции 20/80:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\ttrain_iterator = BasicClassificationDatasetIterator(\n2.\t data=df_dp,\n3.\t field_to_split='train'\n4.\t split_fields=['train', 'valid'], \n5.\t split_proportions=[0.8, 0.2], \n6.\t split_seed=777, \n7.\t seed=42)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

5. Создадим объект для последующей разбивки по классам:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\ttokenizer = NLTKMosesTokenizer()","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

6. Запишем трейн-тест в отдельные переменные:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\tx_train, y_train = train_iterator.get_instances(data_type=\"train\")\n2.\tx_valid, y_valid = train_iterator.get_instances(data_type=\"valid\")","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

7. Для дальнейшей работы токенизируем текст и переводим все символы в нижний регистр:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\ttrain_x_lower_tokenized = str_lower(tokenizer(train_iterator.get_instances(data_type='train')[0]))","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

8. Создадим из текста вектор, используем метод tf-idf – для измерения важности слова в документе:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\ttfidf = SklearnComponent(\n2.\tmodel_class=\"sklearn.feature_extraction.text:TfidfVectorizer\",\n3.\t infer_method=\"transform\",\n4.\t save_path='./tfidf2_tmp.pkl',\n5.\t load_path='./tfidf2_tmp.pkl',\n6.\t mode='train')\n7.\t \n8.\ttfidf.fit(train_iterator.get_instances(data_type='train')[0])\n9.\ttfidf.save()","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

9. Объявим классификатор SGDClassifier:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\tcls = SklearnComponent(\n2.\t model_class=\"sklearn.linear_model:SGDClassifier\",\n3.\t infer_method=\"predict\",\n4.\t save_path='./SGD_tmp.pkl',\n5.\t load_path='./SGD_tmp.pkl',\n6.\t C=1,\n7.\t mode='train')","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

10. Обучим классификатор и сохраним модель:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\tcls.fit(tfidf(x_train), y_train)\n2.\tcls.save()","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

11. Предскажем наличие эмоциональности на валидационной выборке:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"1.\ty_valid_pred = cls(tfidf(x_valid))","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

12. Для оценки качества нашей модели мы будем использовать метрику F1:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"11.\tf1_score(np.array(y_valid), np.array(y_valid_pred), average='binary', pos_label='1')","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В нашем случае она составила 0,81.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Так, на простом примере за 12 шагов мы обучили свой классификатор текстов. Непосредственно наш классификатор был обучен на 15 тыс. обращений. После этого он может классифицировать 100 тыс. обращений за 10 мин. Для сравнения, человеку бы потребовалось 5 рабочих месяцев для выполнения аналогичной задачи, то есть в 5 тыс. раз дольше.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":1,"favorites":5,"reposts":0,"views":4,"hits":3275,"reads":null,"online":0},"dateFavorite":0,"hitsCount":3275,"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/ai/153742-pavlov-deep-pavlov-ili-kak-opredelit-emocionalnosti-v-obrasheniyah-klientov","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"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":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"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":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","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":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764947189,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":332941,"name":"AI","description":"Нейросети, искуственный интеллект, машинное обучение","uri":"/ai","avatar":{"type":"image","data":{"uuid":"47d7652c-7ff3-5ad3-b72c-3d0aa7d14f06","width":1200,"height":1200,"size":311374,"type":"png","color":"8dd2f1","hash":"2070ecd4e4745850","external_service":[]}},"cover":{"type":"image","data":{"uuid":"d830f642-8293-f95c-8c0a-cf31c79fd3aa","width":1920,"height":384,"size":110830,"type":"gif","color":"3b3846","hash":"","external_service":[],"duration":0}},"lastModificationDate":1602860409,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":false,"isDisabledAd":false,"nickname":"ai","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":2}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}},{"type":"entry","data":{"id":119231,"customUri":null,"subsiteId":447345,"title":"Сбор и анализ данных в соц.сетях с API и NLP","date":1586503016,"dateModified":1586503016,"blocks":[{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Довольно сложная задача найти информацию для работы в области DataScience. Она есть в открытом доступе в такой социальной сети как Вконтакте.

"}},{"type":"text","cover":true,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Таким образом, чтобы получить какую-либо информацию например о пользователе, необходимо сделать http-запрос такого типа:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"https://api.vk.com/method/users.get?user_id=210700286&v=5.52","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

где мы видим протокол, по которому осуществляется соединение, адрес API-сервиса, название метода API и параметры запроса.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В ответ сервер вернет JSON с запрошенными данными.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

В чем удобство данного метода сбора информации?

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Наш выбор пал на язык Python и такие библиотеки как: rutermextract, urllib.request, json.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Чтобы создать новое приложение, необходимо перейти на страницу:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"https://vk.com/editapp?act=create","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Там создаем приложение и переходим на вкладку Настройки, там имеется ID-приложения. Данный идентификатор понадобится для авторизации.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Вставим следующую строку в адресную строку браузера:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"https://oauth.vk.com/authorize?client_id=5490057&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.52","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Где client_id должен быть равен идентификатору вашего приложения.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Таким образом мы смогли получить токен. Токен нужен для идентификации приложения при запросах к базе данных социальной сети.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Проверим нашу работу:

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"https://api.vk.com/method/friends.getOnline?v=5.52&access_token=","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

После access_token= пишем наш токен и нажимаем Enter. Вуаля! Мы получили идентификаторы пользователей, которые на текущий момент находятся онлайн.

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"b5a85679-8a4d-5e35-2e2a-c04e5641de0a","width":358,"height":294,"size":116051,"type":"png","color":"1b1c1c","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Теперь сделаем кое-что поинтересней.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#Поиск сотрудников по имеющимся данным\ndef search_users():\n q = 'Vladislav%20Makarov' #Имя Фамилия\n count = '10' #количество пользователей\n birth_day = '07' #день рождения\n birth_month = '08' #месяц рождения\n birth_year = '1997' #год рождения\n #сам запрос\n response = urllib.request.urlopen(URL + 'users.search?q=' + q + '&count=' + count + '&birth_day=' + birth_day + '&birth_month=' + birth_month + '&birth_year=' + birth_year + '&v=5.52&access_token=' + token)\n #преобразуем в json формат и в словарь\n json_m = response.read().decode('utf-8')\n data = json.loads(json_m)\n ids = []\n for i in data['response']['items']:\n ids.append(i['id'])\n return ids","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Данная функция возвращает идентификаторы пользователей по заданным параметрам. Конечно параметры будет лучше перевести в параметры функции, но для демонстрации оставим так как есть.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Результат выполнения программы:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"337ae4a4-0d5a-d96b-8530-83a983cc074d","width":664,"height":40,"size":6258,"type":"png","color":"2c2c2c","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

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

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#возврат записей со стены пользователя или сообщества\ndef wall(owner_id):\n count = '2' #количество записей\n response = urllib.request.urlopen(URL + 'wall.get?owner_id=' + owner_id + '&v=5.52&access_token=' + token)\n\n json_m = response.read().decode('utf-8')\n data = json.loads(json_m)\n #тут мы выводим текст записи на стене пользователя\n try:\n print(data['response']['items'][1]['text'])\n analyze(data['response']['items'][1]['text'])\n except Exception as e:\n print(e)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Результат выполнения данной функции представлен на картинке ниже:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"f709e2ba-9b96-fdcc-e050-597aaae48683","width":663,"height":95,"size":15746,"type":"png","color":"2d2d2d","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

У нас есть несколько видов постов: пост написанный самим человеком, репост, и посты с картинками. Посты с картинками и репосты не рассматриваем, в данной статье рассмотрим только посты написанные самими пользователями и извлечем ключевые слова из них.

"}},{"type":"code","cover":false,"hidden":false,"anchor":"","data":{"text":"#функция по извлечению ключевых слов поста\ndef analyze(text):\n term_extractor = TermExtractor()\n for term in term_extractor(text):\n print(term.normalized, term.count)","lang":""}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Данная функция получает на вход текст поста и извлекает из него ключевые слова. С помощью встроенного морфологического анализатора pymorphy2.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Результат извлечения ключевых слов представлен на следующей картинке:

"}},{"type":"media","cover":false,"hidden":false,"anchor":"","data":{"items":[{"title":"","image":{"type":"image","data":{"uuid":"beab946c-7415-4558-ee6b-4fbc6e769469","width":665,"height":39,"size":4867,"type":"png","color":"2c2c2c","hash":"","external_service":[]}}}]}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Такие ключевые слова извлечены из поста. Сложно говорить о смысле текста, но уже можно понять какие возможности можно получить с помощью данного инструмента.

"}},{"type":"text","cover":false,"hidden":false,"anchor":"","data":{"text":"

Имея некоторые данные о своих клиентах: ФИО и дату рождения, можно найти некоторую часть этих клиентов в социальных сетях, посмотреть их увлечения, что они пишут и думают. Разделить этих клиентов на некоторые кластеры выявить девиантное поведение, вести диалог с ними особенным образом.

"}}],"summaryContent":null,"isExistSummaryContent":false,"warningFromEditor":null,"warningFromEditorTitle":null,"counters":{"comments":0,"favorites":4,"reposts":0,"views":2,"hits":5103,"reads":null,"online":0},"dateFavorite":0,"hitsCount":5103,"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/id447345/119231-sbor-i-analiz-dannyh-v-socsetyah-s-api-i-nlp","author":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"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":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"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":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","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":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764947189,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"subsite":{"id":447345,"name":"NTA","nickname":null,"description":null,"uri":"","avatar":{"type":"image","data":{"uuid":"e7175678-aaab-09f8-0271-7b3af7ac4670","width":1207,"height":1207,"size":83090,"type":"jpg","color":"e3ebf8","hash":"","external_service":[]}},"cover":{"cover":{"type":"image","data":{"uuid":"8575b55d-a1f0-53ee-9ad6-78268f9ea45c","width":1280,"height":373,"size":56005,"type":"jpg","color":"b0b9ca","hash":"","external_service":[]}},"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":4980908,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/4980908"},{"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":1356821,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/1356821"},{"title":"5 лет на vc.ru","code":"registration_5_years","description":"Провёл 5 лет вместе с vc.ru. Получена 23 июля 2025.","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":130113,"userId":447345,"count":0,"shareImage":"https://api.vc.ru/achievements/share/130113"}],"lastModificationDate":1764947189,"isSubscribed":false,"isSubscribedToNewPosts":false,"isMuted":false,"isAvailableForMessenger":true,"badgeId":null,"isDonationsEnabled":false,"isPlusGiftEnabled":true,"isUnverifiedBlogForCompanyWithoutPro":true,"isRemovedByUserRequest":false,"isFrozen":false,"isDisabledAd":false,"isPlus":false,"isVerified":false,"isPro":false,"yandexMetricaId":null,"badge":null,"isOnline":false,"tgChannelShortname":null,"isUnsubscribable":true,"type":1,"subtype":"personal_blog"},"reactions":{"counters":[{"id":1,"count":3}],"reactionId":0},"isNews":false,"source":null,"clusters":[],"donations":{"amount":0,"isDonated":false},"commentsSeenCount":null}}],"ogTitle":null,"ogDescription":null,"isAnonymized":true}};