{"id":14284,"url":"\/distributions\/14284\/click?bit=1&hash=82a231c769d1e10ea56c30ae286f090fbb4a445600cfa9e05037db7a74b1dda9","title":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u043d\u0446\u044b \u0441 \u0441\u043e\u0431\u0430\u043a\u0430\u043c\u0438","buttonText":"","imageUuid":""}

Искусственный интеллект смотрит жалобы​

Любую сложную задачу можно попробовать решить простыми методами. И решение задачи Machine Learning не является исключением.

Обратная связь – это самая ценная информация, поэтому следует максимально подробно изучить каждый её бит. Анализируя жалобы от клиентов, мы объективно видим, в каких бизнес-процессах возникают проблемы. Поскольку процессы часто взаимосвязаны, их возможно сгруппировать и рассматривать как группу. Соответственно, мы приходим к стандартной задаче Machine Learning (ML) – «многоклассовая классификация». В результате данного анализа решается задача — сбор сводной аналитики по организации.

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

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

def review_to_wordlist(review): review_text = re.sub('[^а-яА-ЯёЁ]',' ', review) words = review_text.strip().lower().split() words = [w for w in words if not w in stop_words] words = [morph.parse(w)[0].normal_form for w in words] new_stop_words = find_names(words) words = [w for w in words if not w in new_stop_words] return words

Точность по модели существенно зависит от уникальности текста, поэтому из текста необходимо убрать слова, не несущие особого смысла – «стоп-слова». Обычно в состав слов входят предлоги, союзы и другие незначимые части речи. Также мы дополнили словарь стоп-слов именами и отчествами.

def find_names(words, prob_thresh = 0.4): words = [w for w in words if 'str' in str(type(w))] add_stop_words = [w for w in words for p in morph.parse(w) if 'Name' in p.tag and p.score >= prob_thresh] stop_words.update(add_stop_words) return stop_words

До момента реализации проекта классификация производилась вручную, следовательно, у нас есть данные, размеченные экспертами. А это классическая ML задача обучения с учителем. Предобработанный текст приводим к виду, который модель может обработать. Для этого переводим ответы на жалобы в векторы признаков (используемая в коде независимая переменная – features, зависимая – labels).

tfidf = TfidfVectorizer(sublinear_tf=True, min_df=5, norm='l2', encoding='utf8', ngram_range=(1, 2), stop_words=stop_words) features = tfidf.fit_transform(df_temp['Consumer_complaint_narrative']) labels = df_temp['Num_bp']

Для классификации выбрана модель Linear Support Vector Classification. Это было сделано по следующим причинам:

  • высокая эффективность при работе с измерениями большой размерности;
  • устойчивая работа в случае превышения размерности над количеством сэмплов.

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

0
Комментарии
-3 комментариев
Раскрывать всегда