Intereting Posts

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

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

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

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

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

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

    UID1 -> foo.html -> цыпленок, фермеры, идут, дома, едят, овцы

    UID2 -> blah.html -> next, week, on, badgerwatch

    UID2 -> gah.txt -> один, один, и один, есть, не, numberwang

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

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

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

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

    Взгляни на

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

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

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

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

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