Анализ данных, Кластеризация

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

Время прочтения: 3 мин.

Как мы уже писали ранее «Speech-analytics – обработка аудиозаписей» — любую сложную задачу можно попробовать решить простыми методами, и решение задачи 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. Это было сделано по следующим причинам:

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

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

Советуем почитать