¿Función que devuelve afinidad entre textos?

considero que tengo un

string1 = "hello hi goodmorning evening [...]"

y tengo algunas palabras clave menores

compare1 = "hello evening"
compare2 = "hello hi"

Necesito una función que devuelva la afinidad entre el texto y las palabras clave. Ejemplo:

function(string1,compare1);  // returns: 4
function(string1,compare2);  // returns: 5 (more relevant)

Tenga en cuenta que 5 y 4 son solo por ejemplo.

Podría decir: escriba una función que cuente las ocurrencias, pero para este ejemplo esto no funcionaría porque ambas obtuvieron 2 ocurrencias, pero compare1 es menos relevante porque "hola tarde" no se encuentra exactamente en la cadena1 (las 2 palabras hola y tarde son más distante que hola hola)

¿Hay algún algoritmo conocido para hacer esto?

ADD1:

algos como Editar distancia en este caso NO funcionarían. Porque string1 es un texto completo (como 300-400 palabras) y las cadenas de comparación tienen un máximo de 4-5 palabras.

Respuestas a la pregunta(7)

Su respuesta a la pregunta