Но, хм:
(a) Зачем вам использовать HashMap, если вы собираетесь всегда искать его последовательно? На обработку хеш-ключей и т. Д. Уходит много лишних затрат, когда вы их никогда не используете Конечно, лучше использовать простой ArrayList или LinkedList.
(б) Какое это имеет отношение к тезаурусу? Зачем вам искать в тезаурусе регулярные выражения? Если бы я хотел знать синонимы, скажем, «кот», я бы подумал, что я буду искать «кот», а не «с. *».
Моя первая мысль о том, как построить тезаурус, была бы ... ну, я думаю, первый вопрос, который я задам, это: "Является ли синоним отношением эквивалентности?", Т.е. если А является синонимом для В, не так ли? следовать, что B является синонимом A? И если A является синонимом для B, а B является синонимом для C, то является ли A синонимом для C? Если предположить, что ответы на эти вопросы «да», то мы хотим построить что-то, что делит все слова в языке на наборы синонимов, поэтому мы можем сопоставить любое слово в каждом наборе со всеми другими словами в этом наборе. , Так что вам нужен способ взять любое слово, сопоставить его с какой-либо точкой связи, а затем перейти от этой точки связи ко всем словам, которые соответствуют ему.
Это было бы просто для базы данных: просто создайте таблицу с двумя столбцами, скажем «word» и «token», каждый со своим собственным индексом. Все синонимы отображаются на один и тот же токен. Маркер может быть любым, если он уникален для любого заданного набора синонимов, например порядковый номер. Затем найдите данное слово, найдите соответствующий токен, а затем получите все слова с этим токеном. Например, мы можем создать записи с (большой, 1), (большой, 1), (гигантский, 1), (кошка, 2), (кошачий, 2) и т. Д. Поиск «большой» и вы получите 1, затем Ищите 1, и вы получите "большой", "большой" и "гигант".
Я не знаю ни одного класса во встроенных коллекциях Java, который бы делал это. Самый простой способ, который я могу придумать, - это создать две скоординированные хеш-таблицы: одну, которая отображает слова в токены, а другую, которая отображает токены в массив слов. Таким образом, таблица 1 может иметь большие-> 1, большие-> 1, гигантские-> 1, кошка-> 2, кошачьи-> 2 и т. Д. Тогда таблица 2 отображает 1 -> [большой-большой-гигантский], 2-> [кошка, кошка] и т. д. Вы смотрите в первой таблице, чтобы сопоставить слово токену, а во второй - чтобы сопоставить этот токен со списком слов. Это неуклюже, потому что все данные хранятся избыточно, может быть, есть лучшее решение, но я не собираюсь забирать его из головы. (Что ж, было бы легко, если бы мы предполагали, что будем каждый раз последовательно искать по всему списку слов, но производительность может ухудшиться, когда список станет большим.)