Дилемма высказываний и намерений

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

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

Некоторые высказывания в намерении могут быть шумными или необычными. Например. Люди не обычно используют «какой у вас год рождения» для намерения get_age. Обычные высказывания: «сколько тебе лет», «сколько тебе лет», «скажи мне, сколько тебе лет».

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

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

Семантические высказывания

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

Например, два слова «Автобус» и «Поезд» относятся к транспорту, и, следовательно, их семантическое родство близко и может быть вычислено по сходству / расстоянию между этими двумя вложениями / векторами слов. Вложение / вектор предложения можно вычислить, усредняя все векторы слов в нем. Для такого вложения семантического высказывания можно использовать различные предварительно обученные векторы слов.

Однако универсальный кодировщик предложений выполняет задачу встраивания высказываний с нейронной сетью с глубоким усреднением на предварительно обученных встраиваниях слов. Это популярно для представления векторов высказываний. Представление универсального кодировщика для высказываний показано ниже:

Ниже приведено векторное подобие таких высказываний. Два предложения «сколько вам лет?» и сколько тебе лет?" семантически похожи и, следовательно, имеют большое сходство (Ссылка 1).

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

Фактор локального выброса (LOF): анализ высказываний с выбросами и выбросами в рамках намерения

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

Преимущество этого метода заключается в том, что вам просто нужно несколько соседей при оценке локального выброса, без необходимости делать какие-либо предположения о распределении получаемых данных. Когда наборы данных большие, это требует больших вычислительных ресурсов из-за алгоритма O (n²) (ссылки 2 и 3). Однако мы применяем этот алгоритм для тех высказываний с намерением, и их обычно не много.

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

Давайте рассмотрим пример, чтобы понять эту концепцию. Скажем, у нас есть пара высказываний, как показано ниже:

utterances=[“how old are you”,”what is your age”,”your age please”,”my phone is good”,”your cellphone is great”]

Универсальный кодировщик будет представлять каждое из высказываний в векторном измерении 512.

import tensorflow_hub as hub
import ssl
from scipy.spatial import distance
from sklearn.neighbors import LocalOutlierFactor
import pandas as pd 
import operator
ssl._create_default_https_context = ssl._create_unverified_context
def loadUniversalSentenceEncoder():
    embed = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
    return embed
embed=loadUniversalSentenceEncoder()
utterance_embeddings=embed(utterances)
utterance_embeddings=utterance_embeddings.numpy()
utterance_embeddings=utterance_embeddings.tolist()
num_utterances=len(utterance_embeddings)

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

dataframe_dist=pd.DataFrame(index=range(num_utterances),columns=range(num_utterances))
dataframe_dist[:]=0.0
for i in range(num_utterances):
    for j in range(i+1, num_utterances):
        dist=distance.cosine(utterance_embeddings[i], utterance_embeddings[j])
        dataframe_dist[i][j]=dist
        dataframe_dist[j][i]=dist
print(dataframe_dist)

Фрейм данных о расстоянии будет

+---+----------+----------+----------+----------+----------+
|   |    0     |    1     |    2     |    3     |    4     |
+---+----------+----------+----------+----------+----------+
| 0 |        0 | 0.198413 | 0.307763 | 0.971798 | 0.679368 |
| 1 | 0.198413 |        0 | 0.187032 | 0.897253 | 0.637271 |
| 2 | 0.307763 | 0.187032 |        0 | 0.887289 | 0.714970 |
| 3 | 0.971798 | 0.897253 | 0.887289 |        0 |  1.02424 |
| 4 | 0.679368 | 0.637271 | 0.714970 |  1.02424 |        0 |
+---+----------+----------+----------+----------+----------+

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

clf = LocalOutlierFactor(n_neighbors=2, metric='precomputed')
y_pred = clf.fit_predict(dataframe_dist)
negative_outlier=clf.negative_outlier_factor_
lof=[-x for x in negative_outlier]
index=0
for ut in utterances:
    print("{}: LOF score is {}".format(ut,lof[index]))
    index=index+1

Результатом приведенного выше кода будет

how old are you: LOF score is 0.9111736723327293
what is your age: LOF score is 1.2160311655250895
your age please: LOF score is 0.9111736723327293
my phone is good: LOF score is 3.2123746351649505
where do you stay: LOF score is 2.370095692078931

В следующем разделе объясняется, как выбрать прототипные или ведущие высказывания в намерении, чтобы понять, какие различные варианты высказываний присутствуют в каждом намерении.

Прототипные высказывания / высказывания лидера

Прототипные или ведущие высказывания - это репрезентативные высказывания, которые потенциально представляют каждую тему, где высказывания в намерении охватываются несколькими темами.

Этот подход представляет собой метод инкрементальной кластеризации за одно сканирование, который обычно зависит от порядка сканирования высказываний. Однако мы устанавливаем порядок сканирования в порядке возрастания оценок LOF высказываний. Это означает, что порядок высказываний упорядочен от сильных отклонений до сильных отклонений.

Этот метод кластеризации требует определенного пользователем порога θ, который является пороговым значением расстояния для метода кластеризации лидеров. Метод возрастающей кластеризации первоначально начинается с пустого набора в качестве прототипа или набора высказываний лидеров и добавляет в него первое отсканированное высказывание (ссылки 4, 5 и 6).

Следующее отсканированное высказывание проверяет, находится ли оно на расстоянии θ от любого из прототипных высказываний или высказываний лидеров в наборе, и если оно истинно, то оно становится последователем этого прототипного высказывания. Если это не так, то отсканированное высказывание становится новым прототипным высказыванием или лидером, который дополняет существующий набор прототипных / лидирующих высказываний.

Этот процесс повторяется до тех пор, пока не завершится сканирование всех высказываний в порядке их оценок LOF. В процессе кластеризации набор данных разбивается на полусферы радиуса θ. Следующая диаграмма объясняет, как этот метод кластеризации выводит лидеров.

Каждое ведущее / прототипное высказывание охватывает тему в намерении, которые являются представителями, если высказывания в намерении охватывают несколько тем. Точная настройка тем зависит от порогового значения θ, выбранного пользователем. Если значение θ мало, то крошечные темы являются представителями прототипных высказываний (ссылки 4, 5 и 6).

Кластеризация лидеров объясняется здесь на примере. Давайте расположим высказывания для прототипа алгоритма кластеризации в порядке возрастания оценок LOF, как указано ниже.

utterance_embeddings=list(zip(utterance_embeddings,lof)
utterance_embeddings.sort(key=operator.itemgetter(1))
utterance_embeddings=[x[0] for x in utterance_embeddings]

Теперь мы можем определить метод кластеризации лидеров, как показано ниже. Значение коэффициента является порогом алгоритма кластеризации лидеров.

def PrototypicalUtterances(utterance_embeddings, factor):
    leaders_index=[]
    index=0
    for index in range(len(utterance_embeddings)):
        if(len(leaders_index)==0):
            leaders_index.append(index)
        else:
            leader_flag=True
            for index1 in leaders_index:
                data1=utterance_embeddings[index1]
                data2=utterance_embeddings[index]   
                dist=distance.cosine(data1, data2)
                if(dist<=factor):
                    leader_flag=False
                    break
        if(leader_flag):
            leaders_index.append(index)
    return leaders_index

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

leaders_index=PrototypicalUtterances(utterance_embeddings, 0.4)
print("The prototypical utterances are")
for index in leaders_index:
    print(utterances[index])

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

The prototypical utterances are
how old are you
my phone is good
where do you stay

Анализ перекрытия намерений:

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

Допустим, у нас есть Intent1 = [p11, p12] и intent2 = [p21, p22], тогда мы определили анализ перекрытия Intent как среднее всех минимальных расстояний прототипов от двух Intents. Минимальное расстояние для прототипа (p11) рассчитывается, как показано ниже.

minDist(p11)=min[dist(p11, p21),dist(p11,p22)]
minDist(p12)=min[dist(p12, p21),dist(p12,p22)]
minDist(p21)=min[dist(p21, p11),dist(p21,p12)]
minDist(p22)=min[dist(p22, p11),dist(p22,p12)]
IntentOverlap=minDist(p11)+minDist(p12)+minDist(p21)+minDist(p22)/4

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

References:
1. https://tfhub.dev/google/universal-sentence-encoder/4
2.https://medium.com/@pramodch/understanding-lof-local-outlier-factor-for-implementation-1f6d4ff13ab9#.
3. Breunig, M. M., Kriegel, H. P., Ng, R. T., & Sander, J. (2000, May). LOF: identifying density-based local outliers. In ACM sigmod record.
4. P Viswanath, and ​V Suresh Babu, ​Rough DBSCAN: A Fast Hybrid Density Based Clustering Method for Large Data Sets​, ​Pattern Recognition Letters​(Elsevier), 30(16):1477-­1488, 2009.
5. V Suresh Babu​, and P Viswanath, ​Rough Fuzzy weighted k nearest leader classifier for large data sets, Pattern Recognition​(Elsevier), 42(9): 1719­-1731, 2009.
​6. V Suresh Babu, ​and P Viswanath, ​Weighted k Nearest Leader Classifier for Large Data Sets​, ​2nd​ International Conference on Pattern Recognition and Machine Intelligence (PReMI’07) ​, Lecture Notes in Computer Science, Springer, 4815:17­-24, India, 2007.