在Java中使用Levenshtein distance改进搜索结果
我有以下工作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
如您所见,输出中有很多相关单词,但也有不相关的单词,如 等,这在Levenshtein公式方面是正确的,但我想进一步构建并编写一个可以微调我的搜索的方法,以便我可以获得更多相关和相关单词。jakob
jacob
我花了几个小时来研究它,失去了创造力的视野。
我的问题:是否可以微调现有方法以返回相关/相关单词 或者我应该采取另一种方法 Or???在所有情况下,是的或否,我很感激是否可以获得有关改善搜索结果的意见和灵感?
更新
在问了这个问题很久之后,我还没有真正找到解决方案,我又回到了它,因为现在是时候我需要一个有用的答案了,用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指出了一些有趣的解决方案。
我希望我能为所有这些答案提供赏金。选择一个答案并给予赏金,这并不意味着其他答案无效,但这只意味着我选择的特定答案对我有用。