Использование машинного обучения для решения инцидентов

Публикация № 1197027 18.02.20

Разработка - Тестирование QA

Машинное обучение Python HelpDesk

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

Я не люблю, когда к месту и не к месту употребляют термин «Искусственный интеллект». «Искусственный интеллект отделяет котиков от собачек», «искусственный интеллект помогает ловить преступников», «абонентам помогут сократить расходы с помощью искусственного интеллекта». Чувствуется в этом какая-то попытка выдать желаемое за действительное. Я предпочитаю термин «Машинное обучение». По крайней мере именно про него я буду рассказывать дальше.

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

Обращаю внимание, что несмотря на ресурс, где статья опубликована – непосредственно к 1С она практически не имеет отношения. Только математика и Python.

 

Постановка задачи:

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

Было решено реализовать две функции:

  1. Автоматический вариант решения. Сразу после того, как сотрудник набрал текст инцидента можно, проанализировав его, предложить ему возможное решение.
  2. Предсказание правильного классификатора. Выбор правильного классификатора — это функция 1 линии техподдержки, правильный выбор позволяет корректно маршрутизировать инцидент, что в свою очередь сокращает время на решение инцидента. Ну, думаю всем очевидно, что если к 1С-нику придет инцидент, что между двумя узлами есть потеря сетевых пакетов, то время решения инцидента увеличится на время пока сотрудник увидит этот инцидент, вернет его на первую линию, а там уже правильно маршрутизируют ошибочно назначенный инцидент.

Реализовать удалось обе функции, о первой я расскажу в этой статье, а про вторую – в следующей.

 

Немного теории.

В 2013 году в компании Google был разработан инструмент для анализа семантики естественных языков word2vec. Идея инструмента – подать на вход текстовый корпус, затем внутри происходит компьютерная магия и на выходе мы получаем матрицу, в которой каждое из слов нашего корпуса представлено как вектор, причем чем более сонаправлены вектора (чем больше косинусное произведение между ними), тем они более похожи.

На картинке я попытался изобразить ТОП-5 векторов, наиболее близких слову «Собака». Обучение матрицы происходило на википедии и на национальном корпусе русского языка. Самостоятельно поиграться можно например тут https://rusvectores.org/ Естественно на рисунке лишь схема, на самом деле матрица является не двумерной, то есть каждое слово задается не двумя координатами, а сотней и более.

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

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

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

Объявим нужные нам библиотеки:

import warnings

warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')

#Подавляем лишние оповещения

import pyodbc

#Все инциденты считываются из базы данных, библиотека для доступа к SQL

import pandas as pd

#Про pandas написано куча книг. Кратко - pandas это высокоуровневая Python библиотека для анализа данных.

import re

#Ммм, регулярки (картинка с Гомером)

import pymorphy2

morph = pymorphy2.MorphAnalyzer()

#Морфологический анализатор.

import logging

logging.root.handlers = []

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

#Библиотека для логирования

from smart_open import smart_open

#Библиотека для работы с большими удаленными файлами

import numpy as np

#Библиотека для работы с большими многомерными массивами

from numpy import random

import genism

# Библиотека обработки естественного языка

import nltk

#пакет библиотек и программ для символьной и статистической обработки естественного языка

from sklearn.model_selection import train_test_split

from sklearn import linear_model

from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer

from sklearn.metrics import accuracy_score, confusion_matrix, recall_score

# sklearn - бесплатная библиотека машинного обучения для языка программирования Python

import matplotlib.pyplot as plt

#Необходимо для рисования графиков

from gensim.models import Word2Vec

#А вот и сам Word2Vec

from sklearn.neighbors import KNeighborsClassifier

from sklearn import linear_model

from nltk.corpus import stopwords

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

 

%matplotlib inline

 

Загрузим стоп слова

stop_words = stopwords.words('russian')

 

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

 

connection_string_remedy = 'DRIVER={ODBC Driver 17 for SQL Server};SERVER=MyServer;DATABASE=MyBase;UID=user;PWD=password'

 

Объявим функцию, которая приведет текст инцидента к машиннообрабатываемому виду. Для этого мы сделаем следующее:

 

1. Удаляем всё лишнее (цифры, подписи, телефоны)

2. Приводим к нижнему регистру.

3. Удаляем стоп-слова.

4. лемматизируем и добавляем часть речи (ну кстати тестирование показало, что добавление части речи не улучшает результат, поэтому ниже этот функционал закомментирован.

 

def lemmatization(text,morphing = True):

    stop_words = stopwords.words('russian')

    border = text.find('Для решения инцидента заявитель должен предоставить')

#После этого текста в инциденте у нас идет служебная информация, ФИО сотрудника,

#магазин, с которого он обратился, номер телефона, IP адрес компьютера и прочее

#то, что для наших целей явно мешает. Удаляем.

    if border > 0:

        text = text[0:border]

    text = text.lower()

    text = re.sub(r"\d+", "", text, flags=re.UNICODE)

    text = re.sub('\W', ' ', text).split()

    if morphing == False:

        return text

    text_new = ''

    x = 0

    previous_word_ne = False

    for item in text:    

        if item == 'не':

            previous_word_ne = True

#это важная часть. Так как машина превращает слова в вектора – для нее «работает» и «не работает» не антонимы,

# а просто -в первом случае один вектор, а во втором случае два и они между собой не связаны.

#Поэтому превратим два слова «не работает» в одно «не_работает»

 

       

        if len(item) > 2:

            if not (item in stop_words):

                if previous_word_ne:

                    text_new = text_new+'не_'+morph.parse(item)[0].normal_form+' '#'_'+str(morph.parse(item)[0].tag.POS)+' '

# morph.parse(item)[0].normal_form – приведение к нормальной форме: «Побежали» -> «бежать», «компьютеров» -> «компьютер» и т.д.

                    previous_word_ne = False

                else:

                    text_new = text_new+morph.parse(item)[0].normal_form+' '#'_'+str(morph.parse(item)[0].tag.POS)+' '

                   

    return text_new

 

Результат работы функции:

lemmatization ("Для решения первой задачи сделаем следующее предположение – у нас есть инцидент и его решение, которое придумано человеком")

 

'решение один задача сделать следующий предположение инцидент решение который придумать человек '

 

Загрузим данные в DataFrame:

 

%%time

cnxn = pyodbc.connect(connection_string_remedy)

cursor = cnxn.cursor()

 

sql = '''

    SELECT Number, Description, ShortDescription

    FROM [MyBase].[dbo].[MyTable] (nolock)

    where cast(DateCreate as date) > '2018-01-01'

    and '''

#Здесь Description – текст инцидента, а ShortDescription его классификатор

 

#Кладем результат запроса в DataFrame и лемматизируем текст инцидента

 

df_result = pd.read_sql_query (sql, cnxn)

for index, row in df_result.iterrows():

    text = row['Description']

    text_new = lemmatization(text)

    df_result.iat[index,1]=text_new

 

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

 

my_tags = (df_result['ShortDescription'].value_counts()>1000)

my_tags = my_tags[my_tags == True].index.tolist()

len(my_tags)

 

У меня получилось 57 самых частых классификаторов. Данный параметр нужно подбирать на основании ваших данных.

 

Копируем DataFrame, чтобы заново не готовить исходный DataFrame. Дальше работаем только с отфильтрованным DataFrame. Сравниваем количество в отфильтрованном и полном DataFrame

 

df_result_filter = df_result[df_result['ShortDescription'].isin(my_tags)]

print(df_result.count())

print(df_result_filter.count())

df_result_filter.to_csv('Data/df_result_filter.csv', encoding = "utf-8")

 

У меня получилось 553551 инцидент в неотфильтрованном и 509497 инцидентов в отфильтрованном датафреймах.

 

Теперь давайте посмотрим на распределение инцидентов по классификаторам:

 

df_result_filter.ShortDescription.value_counts().plot(kind="bar", rot=90)

plt.rcParams['figure.figsize'] = [30, 5]

plt.show()

 

 

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

 

train_data, test_data = train_test_split(df_result_filter, test_size=0.1, random_state=42)

 

Далее создадим вспомогательные функции:

 

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

 

def plot_confusion_matrix(cm, title='Confusion matrix', cmap=plt.cm.Blues):

    plt.imshow(cm, interpolation='nearest', cmap=cmap)

    plt.title(title)

    plt.colorbar()

    tick_marks = np.arange(len(my_tags))

    target_names = my_tags

    plt.xticks(tick_marks, target_names, rotation=90)

    plt.yticks(tick_marks, target_names

    plt.ylabel('True label')

    plt.xlabel('Predicted label')

    fig = plt.gcf()

    fig.set_size_inches(18.5, 10.5)

    fig.savefig('test2png.png', dpi=100)

   

Функция, непосредственно вычисляющая матрицу ошибок.  

 

def evaluate_prediction(predictions, target, title="Confusion matrix"):

    print('accuracy %s' % accuracy_score(target, predictions))

    print('recall %s' % recall_score(target,predictions, average='micro'))

    cm = confusion_matrix(target, predictions)

    cm_normalized = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]

    plot_confusion_matrix(cm_normalized, title + ' Normalized')

 

 

Функция, превращающая текст инцидента в вектор   

def word_averaging(wv, words):

    all_words, mean = set(), []

   

    for word in words:

        if isinstance(word, np.ndarray):

            mean.append(word)

        elif word in wv.vocab:

            mean.append(wv.syn0norm[wv.vocab[word].index])

            all_words.add(wv.vocab[word].index)

 

    if not mean:

        logging.warning("cannot compute similarity with no input %s", words)

        # FIXME: remove these examples in pre-processing

#        return np.zeros(wv.layer1_size,)

        return np.zeros(wv.vector_size,)

 

    mean = gensim.matutils.unitvec(np.array(mean).mean(axis=0)).astype(np.float32)

    return mean

 

def  word_averaging_list(wv, text_list):

    return np.vstack([word_averaging(wv, review) for review in text_list])

 

#Разобьем полученные данные на массив (ndarray), строками в котором будут списки (list), где каждый элемент списка – отдельное слово.

def w2v_tokenize_text(text):

    tokens = []

    for sent in nltk.sent_tokenize(text, language='english'):

        for word in nltk.word_tokenize(sent, language='english'):

            if len(word) < 3:

                continue

            tokens.append(word)

    return tokens

 

Приступаем непосредственно к тренировке.

#Используя вышеобъявленную функцию превратим наш Датафрейм в массив с инцидентами (каждый инцидент это список, в котором отдельный элемент списка – слово)

 

inc_tokenized = df_result.apply(lambda r: w2v_tokenize_text(r['Description']), axis=1).values

 

Посмотрим, что у нас получилось, возьмем 50-ый элемент массива:

inc_tokenized[50]

 

['добрый',

 'день',

 'ошибочно',

 'отгрузить',

 'телефон',

 'просить',

 'отменить',

 'отрузка',

 'поставить',

 'остаток',

 'телефон',

 'мочь',

 'вернуть',

 'клиент',

 'номер',

 'сейф',

 'пакет',

 'номер',

 'отгрузка',

 'заранее',

 'спасибо',

 'табельный',

 'номер']

 

Обучим нашу модель

%%time

model = Word2Vec(inc_tokenized,

size=200,

window=5,

min_count=3,

workers=8)

wv = model.wv

 

Создадим L2-нормированные вектора и сохраним результат, он нам потребуется в дальнейшем

wv.init_sims(replace=True)

wv.save_word2vec_format('data/key_vectors_inc.bin')

 

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

 

wv.most_similar(positive=['ошибка'])

 

[('сообщение', 0.653794527053833),
 ('ощибка', 0.5926002264022827),
 ('табличка', 0.552541196346283),
 ('ошбка', 0.525760293006897),
 ('надпись', 0.5208160281181335),
 ('окошко', 0.5118091106414795),
 ('попытка', 0.49567654728889465),
 ('сбой', 0.48171132802963257),
 ('окно', 0.4712887406349182),
 ('уведомление', 0.46060070395469666)]

 

 

wv.most_similar(positive=['сим'])

 

[('симкарта', 0.801783561706543),
 ('симка', 0.7723581790924072),
 ('sim', 0.7251297235488892),
 ('болванка', 0.6134322881698608),
 ('бронзовый', 0.5933068990707397),
 ('сикарта', 0.592644989490509),
 ('icc', 0.582025408744812),
 ('ctn', 0.581929087638855),
 ('не_сим', 0.5614026188850403),
 ('бронза', 0.5609164237976074)]

 

wv.most_similar(positive=['телефон'])

 

[('смартфон', 0.8400038480758667),
 ('айфон', 0.7854971885681152),
 ('планшет', 0.7388856410980225),
 ('lite', 0.6476684212684631),
 ('iphone', 0.613440990447998),
 ('vita', 0.610135018825531),
 ('nokia', 0.6086500287055969),
 ('апп', 0.6069196462631226),
 ('товар', 0.6057144403457642),
 ('prime', 0.6033762693405151)]

 

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

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

 

%%time

full_tokenized = df_result.apply(lambda r: w2v_tokenize_text(r['Description']), axis=1).values

X_full_word_average = word_averaging_list(wv,full_tokenized)

df_result['X_full_word_average'] = list(X_full_word_average)

 

Это позволит нам искать не похожие слова, а похожие инциденты. Давайте проверим, работает ли наше предположение.

 

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

def find_similar_index(a, A):

    subs = (a[:,None] - A)

    sq_dist = np.einsum('ij,ij->j',subs, subs)

    return sq_dist

 

Преобразуем наш инцидент в вектор и найдем вектора, которые наиболее близки нашему. Выберем только те, расстояние до которых меньше 0.3. Чем меньше расстояние – тем ближе наш инцидент к полученному.

 

df_result_copy = df_result_filter

inc_text = '''

Добрый день. Не получается распечатать ценники по акции Самсунг

с услугами связи и акссесуарами. Ценник должен быть акционный. Название

акции в 1С - Акция «Samsung 3-я цена». Данную акцию не находит. И

выдает ошибку. Скрин приложен.

'''

inc_lemmatization = (lemmatization(inc_text))

inc_tokenize = w2v_tokenize_text(inc_lemmatization)

inc_average_list = word_averaging(wv,inc_tokenize)

 

df_result_copy['similar_index'] = find_similar_index(inc_average_list,X_full_word_average.T)

df_result_copy = df_result_copy.sort_values('similar_index')

df_order = df_result_copy[df_result_copy['similar_index']<0.3].head(1000)

df_order.head(10)

 

 

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

 

Инцидент с номером 20862395 это исходный инцидент, посмотрим следующие:

Номер инцидента

Текст

20868378

'Добрый день, по акции Смартфоны Samsung Galaxy с услугами связи и

аксессуарами невозможно напечатать акционный ценник, нет данной акции.

Когда набираешь артикул выдает ошибку

18399650

Добрый день! При печати ценника на Самсунг по акции А30 всего за 99

руб/мес не дает выбрать акцию. Нет возможности напечатать акционный

ценник

18047257

Добрый день, по акции HUAWEI P30 lite ценник должен печататься с суммой

16590р цена по акции, полная цена смартфона 21990р, ценник не

корректный,Ю скрины во вложении

21026274

Добрый день.

Не печатаются ценники по акции скидка на смартфон apple при покупке доп

товаров и услуг

 

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

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

Когда сотрудник ввел текст инцидента первым делом мы отправляем его (текст, а не сотрудника) на поиск похожих инцидентов. В случае если среди похожих есть инцидент с готовым решением – покажем его сотруднику и спрашиваем подошло ли решение. Если решение подходит – мы не создаем инцидент, считая что проблема решена.

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Diversus 2290 18.02.20 15:38 Сейчас в теме
Отличная статья! Спасибо за подробное описание. Если позволите замечание:
В случае если среди похожих есть инцидент с готовым решением – покажем его сотруднику и спрашиваем подошло ли решение. Если решение подходит – мы не создаем инцидент, считая что проблема решена.
На мой взгляд было бы лучше все таки создавать инцидент, сразу устанавливая статус, что он решен и способ его решения - машинное обучение с указанием на способ решения. Тогда можно было бы видеть тут же в help desk/service desk сколько таких инцидентов было решено с использованием машинного обучения. Иначе не совсем понятен порядок цифр и сколько в процентном отношении все таки по факту решается автоматически.
PS: Но это больше придирки конечно :)
anatoliy.kichuk; romankoav; +2 Ответить
3. Repich 556 18.02.20 16:11 Сейчас в теме
(1) Эта информация фиксируется в отдельной базе. Точнее фиксируется сам факт что пользователю предложено решение и его ответ "подошло/не подошло". Но идея - создавать инцидент и сразу закрывать его - интересная, это действительно дополнительная информация для аналитики, спасибо, обдумаю.
2. akim2040 32 18.02.20 15:43 Сейчас в теме
Можно спросить, у Вас тоже есть такие нерадивые пользователи, которые считают что на сервис-деск достаточно кинуть один скриншот без всякого описания?
Если да, как такие обрабатываете?
4. Repich 556 18.02.20 16:14 Сейчас в теме
(2) К сожалению только вручную. Первая линия возвращает их на инициатора с требованием описать проблему.
5. TODD22 18 18.02.20 16:19 Сейчас в теме
(4)
К сожалению только вручную. Первая линия возвращает их на инициатора с требованием описать проблему.

А автоматически это нельзя сделать? Если нет текстового описания то нужно ответить на ряд наводящих вопросов и отправить повторно. Можно сразу сделать форму в которую нельзя отправить без текстового описания.
6. Repich 556 18.02.20 16:23 Сейчас в теме
(5)
А автоматически это нельзя сделать? Если нет текстового описания то нужно ответить на ряд наводящих вопросов и отправить повторно. Можно сразу сделать форму в которую нельзя отправить без текстового описания.


Можно конечно. Но так как жалоб от первой линии нет - значит проблема не сильно им мешает.
7. TODD22 18 18.02.20 16:26 Сейчас в теме
(6)У нас заявка без описания не создаётся.
8. akim2040 32 18.02.20 17:00 Сейчас в теме
(7) ну ведь ничего не мешает написать в описании "не работает", и это будет не очень информативно. Думаю и правда, такое только под ручную обработку
Fox-trot; +1 Ответить
9. TODD22 18 18.02.20 17:10 Сейчас в теме
(8)
ну ведь ничего не мешает написать в описании "не работает", и это будет не очень информативно.

Конечно ничего не мешает. Но наличие этого поля уже дисциплинирует. К тому же можно там же делать подсказки как надо описывать ошибки, пожелания по доработке и тд.
Меньше "холостой" работы для ТП им не надо отправлять пользователю его ошибку что бы дополнял. Обычно описание есть. Не всегда внятное, но всё же есть.
10. pm74 221 18.02.20 18:33 Сейчас в теме
(0) супер , прочитал пока бегло но впечатляет
11. lunjio 65 18.02.20 20:37 Сейчас в теме
(0)
Спасибо за статью, очень интересное решение.
У вас это в виде внешней компоненты/сервиса, как организовано на уровне архитектуры ? Погрузите пожалуйста в непосредственную реализацию, тоесть вы разбираете текущее обращение, получаете схожие слова, запросом отбираете инциденты где есть эти слова, потом их так же к векторам преобразуете и т.д? Либо внешний сервис напрямую к скулю обращается и сам уже получает список инцидентов с похожими словами и их преобразует к векторам и выдает упорядоченными по схожести ?
Как с производительностью дела обстоят ? За какой промежуток времени обработка и выдача результата происходит ? Спасибо
12. Repich 556 18.02.20 21:18 Сейчас в теме
(11) Наверное отвечу отдельной статьей.
17. Repich 556 25.02.20 18:27 Сейчас в теме
13. rabid_otter 134 20.02.20 11:28 Сейчас в теме
прочел бегло, статья крутая. вот это я понимаю автоматизация автоматизации.
juliia1992; +1 Ответить
14. kalyaka 878 21.02.20 09:26 Сейчас в теме
А есть какие-нибудь решения, которые бы могли проводить смысловой лингвистический анализ и на основе смысловых фреймов определять о чем идет речь в тексте? А то так получается, что анализа никакого нет, есть чисто статистическая выборка и оценка вероятности, что на основе такого набора слов скорее всего речь идет об этом.

Это чем-то мне напоминает изучение иностранного языка в школе, когда учитель не особо заморачивается над передачей понимания, делает упор на зубрежке иностранных слов. После такого обучения на основе данных о контексте переводимого текста и знания отдельных слов можно ловко "фантазировать" близкий (иногда не очень) по смыслу перевод.
15. Repich 556 21.02.20 16:08 Сейчас в теме
(14) То, о чем вы пишите работает точно так же как и описанный выше механизм. Берется выборка для обучения, на основе которой строится модель, которая в свою очередь выдает коэффициент сходства исследуемого текста и тех классификаторов, которые есть в модели.
Машинное обучение и модные сейчас нейронные сети оперируют ТОЛЬКО числами.
Если вы обучили модель на журнальных статьях - она сможет отличить статью про спорт от статьи про автомобили, но рассказ Куприна от повести Чехова она отличить не сможет.
16. kalyaka 878 21.02.20 17:13 Сейчас в теме
(15) Я имел в виду использование лингвистического анализа: типа кто-то или что-то совершает такое то действие. Выделить объект и субъект и возможные отношения между ними. Т.е. это получается экспертная система с возможностью накопления связанной информации для поиска путей решения.

Хотя наверное это уже класс систем более сложных и оправданных где-нибудь в медицине, сложной технической поддержки, в правовых системах и т.д. А так проще и дешевле использовать статистические модели просто на наборе слов. Такие системы могут работать только с простыми текстами и на однообразных запросах. Это я пытаюсь выделить ограничения очень перегретой темы использования ИИ.
Оставьте свое сообщение

См. также

Тестер: частые вопросы

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    33558    grumagargler    31    

168

Быстрый старт в тестировании на платформе 1С (Vanessa-ADD)

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Если вы давно хотите освоить тестирование в мире 1С. Но не знали, с чего начать. Теперь знаете.

02.02.2023    8114    NikitaIvanchenko    28    

129

Применение внешних компонент для решения задач сценарного тестирования

Тестирование QA Бесплатно (free)

При первом знакомстве с Vanessa Automation я обнаружил высокий порог вхождения в этот продукт: для старта необходимо установить и настроить внешние утилиты: для создания скриншотов InfarView, для записи видео VLC, для управления мышью и клавиатурой SikuliX и прочее. Появилось желание сократить число внешних зависимостей, а в идеале сделать так, чтобы решение было автономным и работало «из коробки». Да, этого удалось достичь и даже больше: теперь есть еще встроенный редактор Gherkin, парсер языка Gherkin, имеется частичная поддержка Git.

11.01.2023    2155    kandr    0    

35

Интерактивная справка и помощник первого запуска Vanessa Automation

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Недавно у нас появился помощник первого запуска и интерактивная справка

21.06.2022    2302    fenixnow    0    

45

С чего начать внедрение автотестов

Тестирование QA Бесплатно (free)

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

18.05.2022    3158    stepan96    0    

26

Как начать писать тесты без регистрации и СМС

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

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

11.05.2022    1662    zeltyr    5    

13

Тестирование - игровое моделирование

HighLoad оптимизация Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Мы рассмотрим подход к тестированию с применением элементов искусственного интеллекта

25.04.2022    1648    ivanov660    0    

15

Практические кейсы и примеры создания сценарных тестов с использованием фреймворка Тестирование 3.0

Тестирование QA Бесплатно (free)

Начальник сектора разработки ООО «Группа Полипластик» Владимир Крючков на Infostart Meetup DevOps продемонстрировал коллегам работу фреймворка «Тестирование 3.0», рассказал о процессе совместной разработки тестов и порассуждал о мировых тенденциях в тестировании.

11.06.2021    12514    ivanov660    26    

36

Использование mock при интеграции с внешним API

Тестирование QA Бесплатно (free)

На Infostart Meetup DevOps инженер-программист Андрей Крапивин поделился с коллегами опытом тестирования интеграции с внешним API – показал возможности мокирования и рассмотрел их применение на реальном примере тестирования погодного виджета для конфигурации «Бухгалтерия 3.0».

28.05.2021    12264    Scorpion4eg    0    

15

Vanessa Automation. Как начать создавать видеоинструкции

Тестирование QA Бесплатно (free)

Автоматические видеоинструкции на основе сценариев тестирования поражают воображение. Но многие сталкиваются с проблемами при попытке создать собственные фичи для видео. В ходе мастер класса на онлайн-митапе «DevOps в 1С» Светлана Попова рассмотрела особенности создания видеоинструкций с помощью Vanessa Automation для SikuliX и веб-клиента. И рассказала, какие подводные камни нужно учесть при их написании.

26.05.2021    8574    SvVik    12    

48

Ищем паттерны в сценарных тестах. Практика - Фреймворк Тестирование 3.0

Корректировка данных Тестирование QA Бесплатно (free)

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

29.03.2021    2309    ivanov660    0    

18

Hello world в Vanessa-ADD bddRunner

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Минимальный пример на Vanessa-ADD bddRunner без теории. При написании использовались: 1С 8.3.10.2753, Vanessa add 6.6.5.

24.02.2021    1657    kirinalex    0    

12

Практика применения DevOps. Тестирование

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В третьей части мастер-класса «Практика применения DevOps» на конференции Infostart Event 2019 Inception выступила Светлана Попова. Она рассмотрела возможности использования двух инструментов тестирования от фирмы «1С» – «Сценарного тестирования» и связки СППР и Vanessa Automation, и рассказала про плюсы и минусы каждого из этих вариантов.

11.12.2020    7705    SvVik    0    

50

Тестирование серверного поведения с Vanessa Automation

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Обзор модуля "ИнициаторДанных" (версия VA 1.2.034), пример скрипта

14.09.2020    4499    unichkin    18    

25

Vanessa, видеоинструкции для web-клиента

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Vanessa-Automation. Использование видеоинструкций в web-клиенте.

01.06.2020    4980    SvVik    3    

29

Молчание "best practices": тестовые и эталонные данные, структура и связность, падения и новая функциональность, и другие неудобные вопросы к сценарному тестированию

Рефакторинг и качество кода Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Непонимание некоторых базовых вопросов мешает программистам начать применять инструменты тестирования в процессе разработки для 1С. Как разобраться в терминологии и интегрировать процесс тестирования в разработку 1С-решений на конференции Infostart Event 2019 Inception рассказал руководитель отдела разработки компании C.T.Consultants Решитко Дмитрий.

29.05.2020    6923    grumagargler    14    

49

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

Тестирование QA Бесплатно (free)

Продолжаю (и заканчиваю) тему с автоматическим решением инцидентов. Перейдем от теории к практике.

25.02.2020    5653    Repich    9    

49

Тестирование: Отлаживаем и тестируем REST интерфейс 1С с помощью SoapUI

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Рассмотрим быстрый и удобный способ облегчения разработки и отладки REST, SOAP веб сервисов, а также создания автоматизированных тестов.

03.02.2020    8891    ivanov660    4    

71

Vanessa, улучшаем инструкции

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Vanessa Automation умеет делать хорошие инструкции, давайте посмотрим, какие инструменты для этого есть.

30.10.2019    13370    OPM    12    

86

Vanessa Automation + СППР

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Vanessa Automation. Использование автоматизированного тестирования в СППР.

07.11.2019    20356    SvVik    15    

141

Vanessa, хочу все и сразу

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Vanessa Automation это инструмент для тестирования прикладных решений на платформе 1С, но он/она может больше, чем только тестирование.

11.10.2019    19573    OPM    36    

156

Интерактивная отладка

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Инструменты не панацея - главное подход эффективный.

13.08.2019    5059    kuzyara    7    

19

Интеграция сценарного тестирования в процесс разработки

Тестирование QA Бесплатно (free)

Разработчик системы «Тестер» Дмитрий Решитко в своем докладе на конференции INFOSTART EVENT 2018 EDUCATION показывает, что процесс тестирования можно очень плотно интегрировать в процесс разработки, что внедрение тестирования – это возможность развития программиста как такового, позволяющая ему упорядочивать ход мыслей и оставаться «в фокусе». Навыки построения процесса кодирования на стыке с тестированием сокращают время на концентрацию, освобождают от страха перед изменениями и улучшают память разработчика.

08.07.2019    11228    grumagargler    7    

88

Автоматизация тестирования с помощью WinAutomationUI

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Рассматривается использование инструмента WinAutomationUI для создания автоматизированных сценарных тестов на примере 1 + 1 = 2.

11.12.2018    8123    AlexKo    30    

29

Новичок в TDD

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Краткие итоги первых шагов при разработке в 1С через TDD.

08.10.2018    12962    Alligator84    86    

65

Автоматизация тестирования

Тестирование QA Бесплатно (free)

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

04.10.2018    14367    ivanov660    23    

91

Проблемы с запуском TestClient. "Ошибка сетевого взаимодействия при вызове"

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

При выполнении кода автоматического тестирования появляется ошибка "Ошибка сетевого взаимодействия при вызове"

05.07.2018    6777    chugada    3    

3

xUnitFor1C - набор инструментов для выполнения тестирования (модульного/юнит, приемочного, сценарного для 1С 8.3, интеграционного) в 1С:Предприятии 8

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

xUnitFor1C - простой и мощный фреймворк для тестирования в 1С. Позволяет тестировать в разных режимах обычное приложение, тонкий и толстый клиент управляемого приложения. Поддерживаются любые платформы 1С - от 8.2.17 до 8.3.5 и выше. Любые наборы тестов могут прогоняться в полностью автоматическом режиме. Автозапуск используется в различных build-серверах в системах Continuous Integration. Также возможно очень простое создание тестовых данных на основании табличных макетов. Эти макеты можно генерировать из реальных боевых данных. Полученные данные в тестах загружаются одной строкой кода. В статье я кратко описал историю продукта + вставил небольшое описание различных возможностей нашего фреймворка + список полезных статей/примеров/видео, обучающих/рассказывающих о практическом применении инструмента

13.11.2015    50729    artbear    53    

216

Простая отладка внешних обработок

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Простой способ, упрощающий отладку внешних обработок, печатных форм и тд. ВНИМАНИЕ! Данный метод НЕ работает в режиме работы "Управляемое приложение"! Статья актуальна только для режима "Обычное приложение"

22.10.2013    70193    EvilDoc    69    

71

BDD в 1С

Математика и алгоритмы Тестирование QA Бесплатно (free)

Я расскажу вам про магию BDD. Сначала будет немного теории, а потом я покажу, как это применимо к 1С на практике. BDD расшифровывается как Behavior Driven Development, разработка через поведение системы. Это означает, что мы выстраиваем весь наш процесс разработки, исходя из ожидаемого поведения.

30.08.2016    31281    Pr-Mex    19    

134

Опыт практического применения методики BDD на 1С. Написание сценариев

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Эта статья открывает цикл публикаций, в которых я хочу поделиться опытом использования методики BDD при разработке на 1С. В этой статье речь пойдёт о написании сценариев.

03.07.2016    27031    oleynik.dv    131    

135

Как протестировать неэкспортные процедуры модулей

Тестирование QA Платформа 1С v8.3 Бесплатно (free)

Процедура для доступа к внутренним методам модуля без нарушения инкапсуляции.

17.11.2015    14619    json    30    

19