Как можно реализовать форвардный индекс в PHP?

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

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

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

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

    UID1 → index.html → helen, она, была, чемпионка, с веснушками

    UID1 → foo.html → курица, фермеры, идут, дома, едят, овцы

    UID2 → blah.html → next, week, on, badgerwatch

    UID2 → gah.txt → один, один, и один, есть, not, numberwang

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

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

На этом этапе меня не волнуют проблемы или хранилища. Даже рудиментарный набор "печатных" утверждений будет достаточным.

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

Ответ 1

Взгляните на

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;
}

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

Ответ 2

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

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

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