Как я вижу эту проблему, есть 2 решения:
- составьте исчерпывающий список всех возможных навыков, которые вы считаете равными
- определить подходящее «расстояние» между двумя заданными навыками и определить порог, который, по вашему мнению, дает хорошие (достаточные) результаты
Предположим, вы идете с первым вариантом, тогда псевдокод довольно прост:
- для любого списка навыков, в которые входит пользователь, переберите все навыки S
- если S находится в наборе «принятых» навыков, то оставить S
- если S не относится к набору «принятых» навыков, проверьте, имеет ли принятый навык S2 S в качестве одного из его вариантов. Если это так, верните S2
Предположим, вы идете со вторым вариантом:
- для любого списка навыков, в который входит пользователь, переберите все навыки S
- установить S в верхний регистр
- разделите S на любой токен, который не является [A-Z], назовите этот Sp
- сортировка Sp по алфавиту
- повторно соедините токены в Sp через пробел, назовите это Sc
- используйте расстояние Левенштейна, чтобы сравнить Sc с другими предметами в списке умений
* * Например, одна тысяча тридцать восемь
React, React Js, React.js, Reactionjs
Реагировать -> РЕАГИРОВАТЬ -> [РЕАГИРОВАТЬ] -> [РЕАГИРОВАТЬ] -> РЕАГИРОВАТЬ
Реагировать Js -> РЕАГИРОВАТЬ JS -> [РЕАГИРОВАТЬ JS] -> [JS РЕАГИРОВАТЬ] -> JS РЕАГИРОВАТЬ // расстояние 3
React.js -> REACT.JS -> [REACT JS] -> [JS REACT] -> JS REACT // расстояние 0