Удалить элемент из набора, который не соответствует критериям - PullRequest
7 голосов
/ 30 ноября 2010

Для школьного проекта цель состоит в том, чтобы сделать нечеткое совпадение строки запроса с лирической строкой внутри объекта 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.Для этого проекта все, что требуется, это ранг символов в матче, с начальной и конечной точками неизвестно.С некоторыми изменениями в коде, опубликованном выше, я точно нахожу начальную и конечную точки.Мне нужен способ удалить несоответствия из набора, если текст песни не соответствует поиску.

Ответы [ 2 ]

1 голос
/ 30 ноября 2010

Возможно, вы хотите взглянуть на расстояние Левенштейна .Библиотека Apache commons-lang реализовала ее в версии 2.1 в классе StringUtils .

0 голосов
/ 30 ноября 2010

Патриция три может просто сделать это для вас.

Пройдите через это, посмотрите, есть ли у вас то, что вам нужно.

...