Разбор и форматирование результатов поиска - PullRequest
3 голосов
/ 27 февраля 2009

Поиск:

Скрипты + Языковые Сети + Страницы Приложения

Результаты:

... язык сценариев первоначально ... создание динамических веб-страниц . Он имеет ... графические приложения .... цель язык сценариев , то есть ... d создание веб-страниц в качестве вывода ...

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

Как именно вы будете делать это?

Это довольно не зависит от языка, но я буду реализовывать решение в среде PHP, поэтому, пожалуйста, ограничьте ответы вариантами, которые не требуют определенного языка или структуры.

Вот мой мыслительный процесс: создать массив из поисковых слов. Определите, какое поисковое слово имеет самый низкий индекс относительно того, где оно найдено в теле статьи. Соберите эту часть тела в другую переменную, а затем удалите этот раздел из тела статьи. Вернитесь к шагу 1. Вы можете даже добавить счетчик к каждому слову, пропуская его, когда счетчик достигает 3 или около того.

Важно:

Решение должно соответствовать всем условиям поиска нелинейным образом. Смысл, термин один должен быть найден после второго термина, если он существует после второго. Точно так же это должно быть найдено после 3-го семестра. Срок 3 должен быть найден перед термином 1 и 2, если он существует до них.

Решение должно позволить мне объявить «Разрешить только три совпадения для каждого термина, а затем прекратить сводку».

Дополнительный кредит:

Получите переменную padding для необязательного дополнения слова вместо символов.

Ответы [ 2 ]

1 голос
/ 09 марта 2009

Мой мыслительный процесс:

  1. Создание массива результатов, который поддерживает неуникальные пары имя / значение (PHP поддерживает это в своем стандартном array объекте)
  2. Прокручивать каждый поисковый запрос и находить его начальную позицию в тексте поиска
  3. Добавить элемент в массив результатов, в котором хранится только что найденная позиция символа с фактическим поисковым термином в качестве ключа
  4. Когда вы найдете все поисковые термины, отсортируйте массив по возрастанию по значению (позиция символа поискового запроса)
  5. Теперь результаты поиска будут в том порядке, в котором они были найдены в тексте поиска
  6. Перебрать массив результатов и использовать заданный отступ слов, чтобы получить слова на каждой стороне поискового запроса, а также отслеживать количество слов в отдельной паре имя / значение

Псевдокод, или моя лучшая попытка:

function string GetSearchExcerpt(searchText, searchTerms, wordPadding = 0, searchLimit = 3)
{
  results = new array()
  startIndex = 0
  foreach (searchTerm in searchTerms) 
  {
    charIndex = searchText.FindByIndex(searchTerms, startIndex) // finds 1st position of searchTerm starting at startIndex
    results.Add(searchTerm, charIndex)
    startIndex = charIndex + 1
  }
  results = results.SortByValue()
  lastSearchTerm = ""
  searchTermCount = new array()
  outputText = ""
  foreach (searchTerm => charIndex in results)
  {
    searchTermCount[searchTerm]++
    if (searchTermCount[searchTerm] <= searchLimit)
    {
      // WordPadding is a simple function that moves left or right a given number of words starting at a specified character index and returns those words
      outputText += "..." + WordPadding(-wordPadding, charIndex) + "<strong>" + searchTerm + "</strong>" + WordPadding(wordPadding, charIndex)
    }
  }

  return outputText
}
0 голосов
/ 09 марта 2009

Лично я бы преобразовал условия поиска в регулярные выражения, а затем использовал бы Regex Find-Replace, чтобы обернуть совпадения в сильные теги для форматирования.

Скорее всего, лучшим вариантом будет маршрут RegEx. Таким образом, в вашем примере вы получите три отдельных значения RegEx.

Поскольку вы хотите решение, не зависящее от языка, я не буду помещать здесь фактические выражения, поскольку точный синтаксис зависит от языка.

...