Как назначить или добавить новую «метку» проблемы к постоянно растущей коллекции обзоров?

#python #python-3.x #nlp #artificial-intelligence #data-science

#python #python-3.x #nlp #искусственный интеллект #наука о данных

Вопрос:

Итак, в основном у меня есть фрейм данных, который выглядит как:

 user_id, comment
0, 'Functional but Horrible UI'
1, 'Great everything works well'
2, 'I struggled finding plus button because of theme colors in dark mode'
3, 'Keeps stopping on Android 10'
4, 'I like the functionaity but color theme could be better'
5, 'Consistently crashing. Uninstalled'
6, 'Good overall'
7, 'sfdfsdlfksd'
8, 'I lost in complex settings'
9, 'Configuring app is really a headache'
10, 'aaaaaaaaaaaaa'
 

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

 problems = {
'color_theme': 3,
'app_settings': 2,
'crashing' : 2}
 

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

  1. У меня нет меток для обзоров. Если бы нам нужно было просматривать каждый обзор, чтобы узнать, о какой проблеме идет речь (т. Е. Обозначить ее), мы бы просто зарегистрировали его и знали, над чем нам нужно работать.
  2. Я не знаю заранее, какие проблемы возникнут в будущем, поэтому, даже если мы каким-то образом обозначим все в какой-то момент времени, этого будет недостаточно, так как может возникнуть какая-то невидимая проблема, и нам придется делать это снова.
  3. Даже если у нас есть система маркировки каким-то образом, как мы будем обновлять модель, например, определяем ли мы новую модель с другой архитектурой для постоянно меняющихся меток?

Итак, в этих обстоятельствах я пытался найти подход ИИ, который облегчил бы мою ситуацию. Я довольно хорошо разбираюсь в python и имею практические знания keras / tensorflow и других библиотек, но ни у одной из них, похоже, нет такого гибкого модельного подхода. Я также просматривал платформу AI от Google Cloud Platform, но она могла до некоторой степени анализировать настроения, но не понимать в контексте приложения, что, например, кнопка также является частью пользовательского интерфейса и цвета. Итак, как я мог бы подойти к этой проблеме более элегантным способом?

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

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

Комментарии:

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

Ответ №1:

Существует множество проблем, которые необходимо решить:

  1. Найдите примеры, которые действительно описывают проблему. Так что не просто «хорошо в целом», а больше похоже на «Функциональный, но ужасный пользовательский интерфейс».
  2. Найдите точные категории (такие как пользовательский интерфейс, сбои и т. Д.).
  3. Классифицируйте данные по категориям без помеченных данных.
  4. Повторите 2 и 3 для получения новых данных.

Проблемы в деталях:

1. вероятно, это просто, вы могли бы либо использовать анализ настроений, либо классифицировать их в relevant— unreлевантные с помощью какого-то алгоритма активного обучения. Например, есть эта библиотека python для активного обучения.

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

3. совпадает с 1. но с разными метками и только для данных, отфильтрованных по 1. Используя активное обучение, вам на самом деле не нужны помеченные данные, но вы будете помечать их, когда модель попросит об этом. Это приводит к классификации с несколькими метками. При классификации с несколькими метками возможно, что образец не помечен ни одной из ваших категорий. Давайте назовем их ‘no-category’-samples.

4. Теперь у вас есть конвейер, который классифицирует данные по категориям. Время от времени вам придется проверять список образцов «без категории» и повторить 2. Есть ли какие-то полезные новые категории в этих примерах «без категории»? Если да, добавьте новую категорию в свой набор меток и (повторно) обучите классификацию с несколькими метками. Если вы использовали подход «один против другого», вы можете просто добавить новую модель, не нужно переучивать существующие. Я думаю, было бы сложно автоматизировать этот шаг, поскольку для определения полезных категорий требуется знание предметной области. В продуктивной среде я бы, вероятно, установил уведомление по электронной почте, если есть определенное количество новых образцов «без категории». Каждые 100 новых «без категорий» вы должны просматривать данные и определять возможные новые категории.

Ответ №2:

Используйте кластеризацию для автоматической категоризации

Вот пример того, как вы можете использовать извлечение функций предложения Tensorflow и автокластерирование Sklearns для кластеризации вашей информации

Сначала давайте настроим импорт и данные

 import tensorflow_hub as hub
model = hub.KerasLayer("https://tfhub.dev/google/nnlm-en-dim128/2")
 

Вы можете прочитать все о tensorflow hub онлайн. Он предоставляет предварительно обученные модели для языка и изображений. В основном мы собираемся использовать его для извлечения 128 функций из ваших предложений. Я не знаю, что это за функции, но они «семантические» по своей природе, поэтому достаточно просто сравнить функции одного предложения с функциями другого для сходства.

Теперь для ваших данных. Я добавил еще несколько примеров, похожих на некоторые.

 data = ['Functional but Horrible UI', 'Really bad UI but works', 'hate the UI but functions',
    'Great everything works well', 'plus plus on it all working nicely', 'it all works like I expect',
    'I struggled finding plus button because of theme colors in dark mode', 'dark mode isnt good for my eyes'
    'Keeps stopping on Android 10', 'the Android 10 install crashes', 'what is with Android 10 not work'
    'I like the functionaity but color theme could be better', 'better colours please', 'what is with the horrible colors?'
    'Consistently crashing. Uninstalled', 'crashes all the time', 'why u crash so much ... crash crash crash',
    'Good overall', 'good', 'works', 'overall it is good',
    'sfdfsdlfksd',
    'I lost in complex settings',
    'Configuring app is really a headache',
    'aaaaaaaaaaaaa']
 

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

 data_as_latent = model(data).numpy()
data_as_latent.shape

# (22, 128)
 

И теперь мы используем sklearn для кластеризации предложений. Сначала я использую TruncatedSVD, чтобы сначала уменьшить размерность данных со 128 до 12. Причина этого в том, что BayesianGaussianMixture (код кластеризации) плохо работает с большим количеством измерений

 from sklearn.decomposition import TruncatedSVD
from sklearn.mixture import BayesianGaussianMixture

def reduceDimensions(latents):
    svd = TruncatedSVD(n_components=12)
    svd.fit(latents)
    return svd.transform(latents).tolist()

def cluster(data_as_latent, clusters=4):
    bgm = BayesianGaussianMixture(n_components=clusters)
    bgm.fit(data_as_latent)
    return bgm.predict(data_as_latent)

data_as_smaller = reduceTo2D(data_as_latent)
data_as_cluster = cluster(data_as_smaller)
 

И теперь мы получаем результат и видим волшебство!

 for phrase,cluster in zip(data,data_as_cluster):
    print(f'Assigned cluster {cluster} to phrase : {phrase}')

Assigned cluster 0 to phrase : Functional but Horrible UI
Assigned cluster 0 to phrase : Really bad UI but works
Assigned cluster 0 to phrase : hate the UI but functions
Assigned cluster 0 to phrase : Great everything works well
Assigned cluster 3 to phrase : plus plus on it all working nicely
Assigned cluster 3 to phrase : it all works like I expect
Assigned cluster 3 to phrase : I struggled finding plus button because of theme colors in dark mode
Assigned cluster 2 to phrase : dark mode isnt good for my eyesKeeps stopping on Android 10
Assigned cluster 0 to phrase : the Android 10 install crashes
Assigned cluster 2 to phrase : what is with Android 10 not workI like the functionaity but color theme could be better
Assigned cluster 1 to phrase : better colours please
Assigned cluster 2 to phrase : what is with the horrible colors?Consistently crashing. Uninstalled
Assigned cluster 0 to phrase : crashes all the time
Assigned cluster 0 to phrase : why u crash so much ... crash crash crash
Assigned cluster 1 to phrase : Good overall
Assigned cluster 1 to phrase : good
Assigned cluster 0 to phrase : works
Assigned cluster 1 to phrase : overall it is good
Assigned cluster 0 to phrase : sfdfsdlfksd
Assigned cluster 0 to phrase : I lost in complex settings
Assigned cluster 2 to phrase : Configuring app is really a headache
Assigned cluster 0 to phrase : aaaaaaaaaaaaa
 

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

Обработка выбросов

Вы можете обрабатывать выбросы, используя очень похожую технику, но с другой функцией Sklearn . Вот видео, которое я сделал https://youtu.be/rGRS-fbpbB4 это показывает детали этого.

Поиск фраз, похожих на другие фразы

Допустим, мы хотим найти все фразы, которые действительно похожи на crashes all the time . Мы можем использовать косинусное сходство, чтобы найти предложения с очень похожими скрытыми пробелами, например:

 import scipy
similarity = scipy.spatial.distance.cosine
reference = model(['crashes all the time']).numpy()[0]
scores = [similarity(reference,value) for value in data_as_latent]
for phrase,score in sorted( list(zip(data,scores)), key=lambda x: x[1]):
    print(f'Score {int(100 - score*100)} to phrase : {phrase}')
 

и ваши результаты выглядят так

 Score 100 to phrase : crashes all the time
Score 49 to phrase : hate the UI but functions
Score 48 to phrase : why u crash so much ... crash crash crash
Score 37 to phrase : the Android 10 install crashes
Score 28 to phrase : I struggled finding plus button because of theme colors in dark mode
Score 28 to phrase : it all works like I expect
Score 26 to phrase : plus plus on it all working nicely
Score 26 to phrase : Great everything works well
Score 21 to phrase : Really bad UI but works
Score 21 to phrase : what is with Android 10 not workI like the functionaity but color theme could be better
Score 20 to phrase : Configuring app is really a headache
Score 18 to phrase : I lost in complex settings
Score 17 to phrase : what is with the horrible colors?Consistently crashing. Uninstalled
Score 15 to phrase : dark mode isnt good for my eyesKeeps stopping on Android 10
Score 14 to phrase : Good overall
Score 13 to phrase : overall it is good
Score 10 to phrase : good
Score 10 to phrase : works
Score 9 to phrase : sfdfsdlfksd
Score 4 to phrase : better colours please
Score 3 to phrase : Functional but Horrible UI
Score -26 to phrase : aaaaaaaaaaaaa