Когда нейросеть связно разговаривает с вами человеческим языком, все слова этого разговора в её искусственном мозге так или иначе представлены цифрами. Например, при использовании “word2vec” каждое слово может быть представлено как трёхсотмерный вектор. Каждый компонент формализует некую часть “смысла”, который несёт данное слово.

Будем считать, что логическое расстояние между словами задаётся косинусной мерой в этом трёхсотмерном пространстве. Чтобы посчитать эту меру для некоторых векторов A и B, нужно их скалярное произведение разделить на произведение их модулей. Формула: В рамках данной задачи будем считать, что все компоненты всех векторов нормированы таким образом, что лежат в интервале [0; 1]. Тогда и значение меры является неотрицательным. Также будем использовать 10-мерное пространство вместо 300-мерного для простоты отладки.

Пусть есть “словарь” - набор из N слов, каждое из которых представлено в виде такого 10-мерного вектора:

N = 2
d = [[1, 1, 1, 1, 1, 0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]]

Затем, есть ещё одно 10-мерное слово :

a = [0, 0, 0, 0.1, 0.1, 0.1, 0, 0, 0, 0]

Для слова нужно найти в словаре наиболее логически близкое (для которого косинусная мера максимальна). Результат:

0 0.5164

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