Допустим, у меня есть список из 5 слов:
[this, is, a, short, list]
Кроме того, я могу классифицировать некоторый текст, подсчитав количество вхождений слов из приведенного выше списка и представив эти подсчеты в виде вектора:
N = [1,0,2,5,10] # 1x this, 0x is, 2x a, 5x short, 10x list found in the given text
Таким же образом я классифицирую многие другие тексты (подсчитайте 5 слов в тексте и представьте их как счетчики - каждая строка представляет другой текст, который мы будем сравнивать с N):
M = [[1,0,2,0,5],
[0,0,0,0,0],
[2,0,0,0,20],
[4,0,8,20,40],
...]
Теперь я хочу найти верхние 1 (2, 3 и c) строки из M, которые наиболее похожи на N. Или, говоря простыми словами, тексты, наиболее похожие на мой исходный текст.
Проблема в том, что простой проверки расстояний между N и каждой строкой от M недостаточно, поскольку, например, строка M4 [4,0,8,20,40] сильно отличается по расстоянию от N, но все же пропорциональна ( в 4 раза) и поэтому очень похожи. Например, текст в строке M4 может быть всего в 4 раза длиннее текста, представленного буквой N, поэтому, естественно, все значения будут в 4 раза больше.
Каков наилучший подход к решению этой проблемы (нахождение наиболее 1,2,3 эт c похожих текстов от М до текста в N)?