Экспериментировал так:
1. Стемминг
2. Отсечение мусора
3. Набор слов и словосочетаний по каждые два и три слова, идущие подряд
4. Сопоставление с базой синонимов
5. Поиск терминов (тегов в вашем случае) по найденным синонимам
6. Выбор наиболее подходящего из ассоциированных терминов (тегов) (один и тот же синоним может относиться к разным терминам) определяя дальность по графу терминов
7. Сохранение нераспознанных сочетаний в архив, чтобы предложить позже пользователю, как накопится некоторое количество с предположением возможных связей с другими.
Я реализовал нечто подобное для ключевых слов к загружаемому контенту (видео, текст, аудио, картинка) на одном из проектов.
На входе пользователю предоставлялся список заранее отобранных ключевых слов для конкретного типа контента — он постоянен. Если мы загружаем видео можно увидеть что-то вроде «ролик, видео, фильм, клип» и.т.д.
По клику например, на «ролик» вытаскивался список наиболее релевантных (точнее часто используемых с этим тегом) ключевых слов. Списки сохранялись в БД в виде дерева, и перегенерировались время от времени.
Полуавтоматическое добавление тегов — решение