Как можно реализовать прямой индекс в PHP? - PullRequest
11 голосов
/ 28 апреля 2009

Я хочу реализовать простой форвард-индексатор в PHP. Да, я понимаю, что PHP вряд ли является лучшим инструментом для решения этой задачи, но я все равно хочу это сделать. Смысл этого прост: я хочу один и в PHP.

Давайте сделаем несколько основных предположений:

  1. Весь Интернет состоит из около пяти тысяч HTML и / или текстовые документы. Каждый документ находится в определенном домене (UID) . Никаких других проприетарных / тайных форматов не существует в нашем воображаемом пещерном Interweb.

  2. Результат нашего замечательного алгоритма прямого индексирования на основе PHP должен выглядеть следующим образом:

    UID1 -> index.html -> Хелен, она, чемпион, с веснушками

    UID1 -> foo.html -> курица, фермеры, иди, домой, есть, овцы

    UID2 -> blah.html -> следующий, неделя, вкл, badgerwatch

    UID2 -> gah.txt -> один, один, и, один, это не число wang

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

  1. Извлечение реального текстового содержимого в документе как список слов в порядке которым они представлены.
  2. Все время игнорируя любой мусор такие как <script> и <html> теги для вычисления списка UID (который может быть, например, доменом), за которым следует имя документа (ресурс в домене) и, наконец, список слов для этого документа. Я понимаю, что HTML-теги играют важную роль в семантическом размещении текста в документе, но на этом этапе мне все равно .
  3. Имейте в виду решение, которое может составить список слов при чтении документа круче тот, который должен сначала прочитайте весь документ.

На данном этапе мне все равно, где и как хранятся данные. Даже элементарного набора «print» операторов будет достаточно.

Заранее спасибо, надеюсь, это было достаточно ясно.

Ответы [ 2 ]

7 голосов
/ 28 апреля 2009

Взгляните на

http://simplehtmldom.sourceforge.net/

Вы делаете что-то вроде

$p = new Simple_dom_parser();
$p->load("www.page.com");
$p->find("body")->plaintext;

И это даст вам весь текст. Хотите перебрать только ссылки

foreach ($p->find("a") as $link)
{
    echo $link->innerText;
}

Это очень полезно и мощно. Проверьте это.

5 голосов
/ 28 апреля 2009

Не думаю, что я полностью понимаю, что вы пытаетесь сделать, но вы можете довольно просто получить простой результат:

  1. Запустите страницу через Tidy ( хорошее введение ), чтобы убедиться, что он будет иметь действительный HTML.
  2. Выбросьте все до (и в том числе) <body>.
  3. Пошагово просматривайте документ по одному символу за раз.
    1. Если символ «<», ничего не делать со следующими символами, пока не увидите «>» (пропускает HTML)
    2. Если символ представляет собой «символ слова» (буквенно-цифровой, дефис, возможно, больше), добавьте его к «текущему слову».
    3. Если символ является «несловесным» (пунктуация, пробел, возможно, больше), добавьте «текущее слово» в список слов в прямом указателе и очистите «текущее слово».
  4. Делайте выше, пока не нажмете </body>.

Это действительно так, вам, возможно, придется добавить несколько исключений для обработки таких вещей, как <script> теги (вы не хотите рассматривать javascript как слова, которые должны быть проиндексированы), но это должно дать вам базовый шаг вперед индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...