Как работает функция tensorflow tf.edit_distance?
Как он сравнивает строку, хранящуюся в двух разных разреженных матрицах, эквивалентных 2-мерной или трехмерной плотной матрице.
Пример, приведенный на веб-странице тензорного потока https://www.tensorflow.org/api_docs/python/tf/edit_distance, не так очевиден. Пожалуйста, дайте объяснение, используя некоторые другие примеры.
Также этот пример непонятен.
#'hypothesis' is a tensor of shape [2, 1] with variable-length values:
#(0,0) = ["a"] and (1,0) = ["b"]
hypothesis = tf.SparseTensor([[0, 0, 0],[1, 0, 0]],["a", "b"],(2, 1, 1))
#'truth' is a tensor of shape `[2, 2]` with variable-length values:
#(0,0) = [], (0,1) = ["a"], (1,0) = ["b", "c"],(1,1) = ["a"]
truth = tf.SparseTensor([[0, 1, 0],[1, 0, 0],[1, 0, 1],[1, 1, 0]],["a", "b",
"c", "a"],(2, 2, 2))
normalize = True
#'output' is a tensor of shape [2, 2] with edit distances normalized by
#'truth' lengths.
output ==> [[inf, 1.0],[0.5, 1.0]],
(0,0): no truth, (0,1): no hypothesis, (1,0): addition, (1,1): no hypothesis
Каким образом выпуск имеет размер [2,2]?
Что здесь делает нормализация?






гипотеза в плотной форме выглядит так
[[['a']],
[['b']]] # (2, 1, 1)
правда это
[[[],['a']],
[['b', 'c'], ['a']]] # (2, 2, 2)
Мы пытаемся найти Расстояние Левенштейна между гипотезой и значением истинности. Итак, вот что происходит:
at (0,0,0) - насколько далеко ['a'] в гипотезе от [] - в этой позиции нет истины, поэтому невозможно вычислить расстояние
at (0,0,1) - поскольку в этой позиции нет ничего в гипотезе, мы возвращаем 1. В отличие от случая выше, расстояние равно 1, потому что теоретически гипотеза может быть сделана такой же, как истина, вставив один символ (см. расстояние Левенштейна расчеты)
at (1,0,0) - насколько далеко ['b'] в hyp от ['b', 'c'] в действительности. Это снова 1, так как мы можем вставить символ, чтобы гипс был таким же, как истина. Но мы выбрали нормализацию выходного расстояния. Итак, мы делим на длину отрезка истинности, который равен 2. Итак, вы получаете 0,5.
at (1,0,1) - насколько далеко [] в hyp от ['a'], поскольку в этой позиции в hyp нет ничего, мы возвращаем 1
Результатом будет (2,2), потому что ранг гипотезы и истины равен 3. Функция возвращает тензор с рангом (ранг-1).
Помогает представление о том, что мы пытаемся здесь сделать. У вас есть 2 последовательности в гипотезе и 2 последовательности в истине. Таким образом, ваш результат будет таким, чтобы вы получали баллы за каждую позицию в каждой последовательности.
Вот пример, в котором мы пытаемся сопоставить 4 гипотезы со значением истинности. Я думаю, вам нужно сделать это для каждой последовательности истинности для варианта использования, который вы описываете в своем комментарии - дайте мне знать, если вы найдете что-то более эффективное :-)
import tensorflow as tf
hypothesis = tf.SparseTensor(
[[0, 0, 0],
[1, 0, 0],
[2, 0, 0],
[3, 0, 0]],
["a", "b", "c", "d"],
(4, 1, 1))
truth = tf.SparseTensor([[0, 0, 0], [0, 0, 1], [0, 1, 0]], ["b", "c", "a"], (1,2,2))
num_hyp = 4
truth = tf.sparse_concat(0, [truth] * num_hyp)
d = tf.edit_distance(hypothesis, truth)
with tf.Session() as sess:
print(sess.run(d))
Выход:
[[1. 1. ]
[0.5 1. ]
[0.5 1. ]
[1. 1. ]]
Обновленный ответ, соответствующий вашему случаю выше.
Спасибо @dgumo за ваш ответ. Итак, я вижу, что последнее измерение всегда предполагается для представления последовательности, поэтому функция возвращает тензор с рангом меньше исходного ранга. Также предположим, что если у меня есть 2 последовательности, представляющие истину, и я хочу найти расстояние редактирования от последовательностей, сгенерированных из RNN (гипотезы), скажем, 40 последовательностей. Тогда как представить истину и гипотезы так, чтобы я получил 80 расстояний (40 гипо по сравнению с 1-й последовательностью истины, а затем 40 гипо по сравнению со 2-й последовательностью истины)?