Machine learning
NewTechAudit
135

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

Любую сложную задачу можно попробовать решить простыми методами. И решение задачи 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. Это было сделано по следующим причинам:

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

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

Материал опубликован пользователем.
Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "NewTechAudit", "author_type": "editor", "tags": [], "comments": 0, "likes": 1, "favorites": 2, "is_advertisement": false, "subsite_label": "ml", "id": 113362, "is_wide": true, "is_ugc": false, "date": "Wed, 18 Mar 2020 22:59:59 +0300", "is_special": false }
0
Комментариев нет
Популярные
По порядку

Прямой эфир