Найти строковый раздел, содержащий другую строку, с возможными промежуточными словами - PullRequest
0 голосов
/ 11 ноября 2010

В последнем проекте семестра цель состоит в том, чтобы выполнить поиск определенной фразы в текстовой строке внутри объекта Song, а затем ранжировать результаты на основе длины совпадения подстроки.Текст песни был прочитан из файла и соответствует разрывам строк в этом файле.

Например, поиск «Она тебя любит» вернул бы их в примерах соответствия:

The Beatles: "... Она любит тебя , да, да, да ... "Ранг = 13 символовБонни Райт: "... Она просто любит тебя ..." Ранг = 18 символовЭлвис Пресли: «... Вы спрашиваете, любит ли 1012 * меня \ r \ nНу, вы не знаете ..." Ранг = 23 символа

Как видно из последнего примера, совпадения могут занимать несколько строк.

У меня есть все песни в TreeMap<String, TreeSet<Song>>, поэтому я получаю все песни, которые соответствуют первому слову взапрос.Трудность, с которой я сталкиваюсь, заключается в поиске совпадений в строке, поскольку в этой ситуации регулярное выражение не будет работать.

Когда объект Song создан, я поместил текст в набор для запуска поиска одногослово, и для этого я использовал String.split("[^a-zA-Z}"), чтобы выделить отдельные слова и отсеять знаки препинания.Поэтому я хочу запустить поиск по этому массиву.Процесс, который я использую, выглядит следующим образом:

break up the query into a String array
  for each Song in the set
    if (song.lyrics.contains(query)
      great, break loop to next song

    otherwise
      int queryCounter=0;
      find first index point in String array that matches query[queryCounter]
        using that as the start point, iterate through the String array for matches

Когда итерация завершена, создается объект Rank, в котором содержатся песня, поисковая фраза, начальная точка и конечные точки соответствующего раздела массива.В объекте Rank есть метод подсчета количества символов и компенсации пробелов для вычисления ранга.Затем он вставляется в PriorityQueue, где первые десять совпадений будут извлечены из исходного набора совпадений.

Проблема в том, что это не предотвращает ложные срабатывания, и ранги совпадений могут быть искажены.Например, Aerosmith Beyond Beautiful содержит «... она любит меня, она не любит тебя ...» В моем процессе я подхожу »... она любит меня, она любит тебя не ... ", поэтому вместо 13-го уровня я получу 27-е место.

Какие изменения необходимы мне, чтобы отсеять ложные срабатывания и неправильные оценки?

1 Ответ

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

Я хотел бы добавить к тому, что jjinguy сказал:

По сути, в блоке 'иначе' после того, как вы найдете первый индекс, соответствующий началу, вы также должны найти возможные другие начальные точки и сбросить старт, если найдете другую

Я бы вел список всех возможных совпадений в песне и, наконец, использовал бы тот, который имеет лучший ранг. Простой сброс начальной точки может не привести к совпадению с лучшим рангом.

Может быть, это не лучший способ, но проблема все еще существует.

...