Для школьного проекта цель состоит в том, чтобы сделать нечеткое совпадение строки запроса с лирической строкой внутри объекта Song.Общая структура данных представляет собой древовидную карту уникальных слов в сочетании с наборами песен, которые содержат это слово в тексте.
У меня есть предварительный набор совпадений песен, которые содержат строку запроса.Суть в том, что я должен присвоить каждой результирующей песне ранг в зависимости от количества символов в разделе соответствия, включая пробелы.Например, поиск «она любит тебя» возвращает следующие совпадения:
«... Она любит тебя ...» The Beatles, rank = 13"... Она просто любит тебя ..." Бонни Райтт, ранг = 18"... Она любит меня, ну ты ..." Элвис Пресли, ранг = 23
Я использую для сортировки результатов:
for (int i=0; i<lyrics.length; i++) {
if (lyrics[i].equals(query[0])) { //got the start point
start=i; //adjust the start index point
//loop through lyrics from start point
for (int j=1; j<query.length; j++) {
if (lyrics[j].equals(query[query.length-1])) {
end=i; //found the last word
}
//if next lyric word doesn't match this query word
if (!lyrics[i+j].equals(query[j])) {
//advance loop through lyrics. when a match is found, i is adjusted to
//the match index
for (int k= i+j+1; k<lyrics.length; k++) {
if (lyrics[k].equals(query[j]) || lyrics[k].equals(query[0]))
i=k++;
} //end inner advance loop
} //end query string test
}//end query test loop
song.setRanks(start, end); //start and end points for the rank algorithm.
} //end start point test
Поскольку все песни в наборе результатов содержат слова запроса в любом конкретном порядке, не все они будут включены враспечатка результата.Используя этот алгоритм, как я могу установить триггер для удаления песни из набора, если запрос не соответствует какой-либо конкретной длине?
Правка. Является ли Lucene решением этой проблемы?Это серая область в проекте, которую я расскажу завтра в классе.Он позволяет нам выбирать любые структуры данных для этого проекта, но я не знаю, пройдет ли проверка использования другой реализации для сопоставления строк.
Edit 2 @ belisarius - я не вижу, как применяется расстояние редактированияВот.Наиболее распространенное применение расстояния Левенштейна требует строки a длины n и строки b длины m, а расстояние - это количество правок, необходимых для a == b.Для этого проекта все, что требуется, это ранг символов в матче, с начальной и конечной точками неизвестно.С некоторыми изменениями в коде, опубликованном выше, я точно нахожу начальную и конечную точки.Мне нужен способ удалить несоответствия из набора, если текст песни не соответствует поиску.