Если положение очень важно, как вы подчеркиваете, тогда критическая метрика будет основываться на разнице позиций между одними и теми же элементами в разных векторах (например, вы можете суммировать абсолютные значения различий или их квадраты). Большая проблема, которая должна быть решена, - сколько весить элемент, который присутствует (скажем, N-й) в одном векторе, и полностью отсутствует в другом. Является ли это относительно незначительной проблемой - как если бы, например, отсутствующий элемент действительно присутствовал сразу после фактических - или это действительно очень большое дело? Это невозможно сказать без большего понимания реальной области применения. Вы можете попробовать различные способы решения этой проблемы и посмотреть, какие результаты они дают в примерах, которые вам небезразличны!
Например, предположим, что «отсутствующий элемент примерно такой же, как если бы он присутствовал, сразу после фактических». Затем вы можете предварительно обработать каждый входной вектор в элемент отображения разметки в положение (критическая оптимизация, если вам нужно сравнить множество пар входных векторов!):
def makedict(avector):
return dict((item, i) for i, item in enumerate(avector))
, а затем сравнить два таких слова:
def comparedicts(d1, d2):
allitems = set(d1) | set(d2)
distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
return sum(d * d for d in distances)
(или abs (d) вместо возведения в квадрат в последнем утверждении). Для того чтобы недостающие элементы весили больше (делайте надстройки, то есть векторы, рассматривайте дальше), вы можете использовать удвоенную длину вместо просто длин или некоторую большую константу, например, 100, в программе с аналогичной структурой.