2009-04-27 5 views
11

Je cherche à implémenter un indexeur simple en PHP. Oui, je comprends que PHP n'est pas le meilleur outil pour la tâche, mais je veux le faire quand même. La raison d'être est simple: j'en veux un, et en PHP.Comment pourrait-on implémenter un index forward en PHP?

Nommons quelques hypothèses de base:

  1. L'ensemble se compose de Interweb environ cinq mille HTML et/ou documents en texte brut. Chaque document réside dans un domaine particulier (UID). Aucun autre format propriétaire/arcane n'existe dans notre Interweb cavemanesque imaginaire.

  2. Le résultat de l'algorithme d'indexation avant basé sur PHP impressionnant devrait être le long des lignes de:

    UID1 -> index.html -> hélène, elle, était, champion, avec des taches de rousseur

    UID1 -> foo.html -> le poulet, les agriculteurs, aller, maison, manger, moutons

    UID2 -> blah.html ->, à la semaine, sur, badgerwatch

    UID2 -> gah.txt -> un, un, et, un, est, non, numberwang

Idéalement, j'aimerais voir des solutions qui tiennent compte, même à leur plus élémentaire, des concepts de segmentation de la segmentation de mots/de mots/de marquage de la parole. Bien sûr, je ne sais que c'est un vœu pieux, et donc humiliera toute tentative digne de parsing lesdits documents imaginaires par:

  1. Extraire le vrai truc de contenu textuel dans le document comme une liste de mots dans l'ordre dans qui ils sont présentés.
  2. Pendant ce temps, en ignorant tous les déchets tels que <script> et <html> balises pour calculer une liste des UIDs (qui pourrait être, par exemple, un domaine) suivi du nom du document (la ressource dans le domaine), et enfin la liste de mots pour ce document. Je me rends compte que les balises HTML jouent un rôle important dans le placement sémantique du texte dans un document, mais à ce stade je ne se soucie pas.
  3. Gardez à l'esprit une solution qui peut construire la liste de mots tandis que la lecture du document est plus froide que celle qui doit lire dans l'ensemble du document en premier.

A ce stade, je ne me soucie pas des conditions de stockage. Même un ensemble rudimentaire de déclarations «d'impression» suffira.

Merci d'avance, j'espère que c'était assez clair.

+1

+1 pour des exemples de textes géniaux – Artelius

+0

Est-ce votre devoir? On dirait que vous voulez juste un simple analyseur de fichiers .. – Louis

+4

@Lou Homework? Come – karim79

Répondre

7

Jetez un oeil à

http://simplehtmldom.sourceforge.net/

Vous ne somthing comme

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

Et qui vous donnera tout le texte. Vous voulez parcourir seulement les liens

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

Il est très utile et puissant. Regardez-le.

+0

question rapide: est-ce que nous supprimons les entrées dans l'index avant après que nous ayons consommé et transformé en index inversé? – Roylee

5

Je ne pense pas que je suis tout à fait clair sur ce que vous essayez de faire, mais vous pouvez obtenir un résultat simple assez facilement:

  1. exécuter la page par Tidy (a good introduction) pour vous assurer ça va avoir du HTML valide.
  2. Jeter tout avant (et y compris) <body>. Parcourez le document un caractère à la fois.
    1. Si le personnage est un « < », ne font rien avec les caractères suivants jusqu'à ce que vous voyez un « > » (BOM HTML)
    2. Si le personnage est un « caractère de mot » (alphanumérique, trait d'union , éventuellement plus), ajoutez-le au "mot actuel".
    3. Si le caractère est un "caractère non-mot" (ponctuation, espace, éventuellement plus), ajoutez le "mot courant" à la liste de mots dans l'index avant et effacez le "mot courant".
  3. Procédez comme indiqué ci-dessus jusqu'à ce que vous atteigniez </body>.

qui est vraiment à ce sujet, vous pourriez avoir à ajouter quelques exceptions pour la manipulation des choses comme <script> balises (vous ne voulez pas considérer javascript pour être des mots qui doivent être indexés), mais cela ne devrait vous donner une base index avant.

+0

Merci Chad, c'est vraiment utile :) – karim79

Questions connexes