Теги это хорошо. Но не всегда применимо. Не всегда они есть, и в достаточном количества.
Название может сильно отличаться, хотя тоже немаловажно.
Если проект на php то библиотеку скорее лучше брать phpmorphy.
ну или стеммер какой, но тогда слова в качестве тегов пользователю не выведешь.
Первое что приходит в голову это примерно такой алгоритм:
1 — приводим тексты к базовой форме
2 — отбрасываем все стоп-слова по словарю. Можно еще по морфемам от phpmorphy отбирать, но это ИМХО излишнее. Проще словарь ручками под себя оттюнинговать.
3 — прогоняем через синонимизацию (опционально, на самом деле от тематики зависит и качества словаря, иногда уж лучше и не гонять).
4 — вычисляем релевантность наших слов тексту. Я бы взял самый простой алгоритм с тошнотой. Только добавил бы весу словам из заголовка статьи и если есть большое желание добавил бы веса с учетом выданных phpmorphy морфем. (к примеру прилагательным давал бы меньше вес чем существительным)
5 — отбираем топ-N наших ключевых слов, и привязываем их каждой статье. Колво ключей выберете исходя из Вашей задачи, но по опыту думаю это будет между 5 и 10.
6 — теперь самое сложное. Нужно сделать запрос. Тут нужно курить и экспериментировать. ИМХО стоит вычислять некий «рейтинг» близости, тут или количество совпавших слов из нашего топа подойдет, или сделать это колво взвешенным (в зависимости от позиции слова в списке или от его веса в тексте). Дальше уже сильно все зависит от реализации, от ORM и т.п.
ПЫСЫ: на счет морфологической омонимии — лично я в подобных случаях тупо брал первый попавшийся вариант. Суммарно это очень незначительно влияло на результат, а разрешение морфологической омонимии это еще та задача :)