У меня есть следующий рабочий код Java для поиска слова против списка слов, и он работает отлично и как ожидалось:
public class Levenshtein {
private int[][] wordMartix;
public Set similarExists(String searchWord) {
int maxDistance = searchWord.length();
int curDistance;
int sumCurMax;
String checkWord;
// preventing double words on returning list
Set<String> fuzzyWordList = new HashSet<>();
for (Object wordList : Searcher.wordList) {
checkWord = String.valueOf(wordList);
curDistance = calculateDistance(searchWord, checkWord);
sumCurMax = maxDistance + curDistance;
if (sumCurMax == checkWord.length()) {
fuzzyWordList.add(checkWord);
}
}
return fuzzyWordList;
}
public int calculateDistance(String inputWord, String checkWord) {
wordMartix = new int[inputWord.length() + 1][checkWord.length() + 1];
for (int i = 0; i <= inputWord.length(); i++) {
wordMartix[i][0] = i;
}
for (int j = 0; j <= checkWord.length(); j++) {
wordMartix[0][j] = j;
}
for (int i = 1; i < wordMartix.length; i++) {
for (int j = 1; j < wordMartix[i].length; j++) {
if (inputWord.charAt(i - 1) == checkWord.charAt(j - 1)) {
wordMartix[i][j] = wordMartix[i - 1][j - 1];
} else {
int minimum = Integer.MAX_VALUE;
if ((wordMartix[i - 1][j]) + 1 < minimum) {
minimum = (wordMartix[i - 1][j]) + 1;
}
if ((wordMartix[i][j - 1]) + 1 < minimum) {
minimum = (wordMartix[i][j - 1]) + 1;
}
if ((wordMartix[i - 1][j - 1]) + 1 < minimum) {
minimum = (wordMartix[i - 1][j - 1]) + 1;
}
wordMartix[i][j] = minimum;
}
}
}
return wordMartix[inputWord.length()][checkWord.length()];
}
}
Прямо сейчас, когда я ищу слово, например job
, он возвращает список:
Выход
joborienterede
jobannoncer
jobfunktioner
perjacobsen
jakobsen
jobprofiler
jacob
jobtitler
jobbet
jobdatabaserne
jobfunktion
jakob
jobs
studenterjobber
johannesburg
jobmuligheder
jobannoncerne
jobbaser
job
joberfaringer
Как вы можете видеть, на выходе есть много связанных слов, но также есть несвязанные, такие как jakob
, jacob
и т.д., что верно в отношении формулы Левенштейна, но я хотел бы построить дальше и написать метод, который может точно настроить мой поиск, чтобы я мог получить более релевантные и связанные слова.
Я работал несколько часов на нем и потерял зрение от творчества.
Мой вопрос: Можно ли настроить существующий метод, чтобы возвращать соответствующие/связанные слова. Или я должен использовать другой подход? Или? во всех случаях ДА или НЕТ, я оценил, могу ли я получить вдохновение и вдохновение в отношении улучшения результатов поиска?
UPDATE
После того, как я задал этот вопрос долгое время назад, я действительно не нашел решение, и я вернулся к нему, потому что настало время, когда мне нужен полезный ответ, , это нормально, чтобы предоставить ответ с образцами кода JAVA, но что наиболее важным является подробный ответ с описанием доступных методов и подходов, используемых для индексации наилучших и наиболее релевантных результатов поиска и игнорирования каких-либо релевантных слов. Я знаю, что это открытая и бесконечная область, но мне нужно немного вдохновения, чтобы начать что-то там.
Примечание. Самый старый ответ прямо сейчас основан на одном из входов комментариев и не полезно (бесполезно), он просто сортирует расстояние, что не означает получение лучших результатов/качества поиска.
Итак, я сделал сортировку по расстоянию, и результаты были такими:
job
jobs
jacob
jakob
jobbet
jakobsen
jobbaser
jobtitler
jobannoncer
jobfunktion
jobprofiler
perjacobsen
johannesburg
jobannoncerne
joberfaringer
jobfunktioner
jobmuligheder
jobdatabaserne
joborienterede
studenterjobber
поэтому слово jobbaser имеет значение, а jacob/jakob не имеет значения, но расстояние для jobbaser больше, чем jacob/jakob. Так что это не помогло.
Общая обратная связь относительно ответов
- @SergioMontoro, он решает почти проблему.
- @uSeemSurprised, он решает проблему, но требует постоянной манипуляции.
- Концепция @Gene превосходна, но она ретранслируется на внешний URL.
Спасибо Я хотел бы лично поблагодарить всех вас, кто внес свой вклад в этот вопрос, у меня есть хорошие ответы и полезные комментарии.
Особая благодарность за ответы от @SergioMontoro, @uSeemSurprised и @Gene, это разные, но действительные и полезные ответы.
@D.Kovács указывает на какое-то интересное решение.
Жаль, что я не смогу дать щедрость всем этим ответам. Выбирайте один ответ и дайте ему щедрость, это не значит, что другие ответы недействительны, но это означает только то, что конкретный ответ, который я выбрал, был полезен для меня.