2009-04-27 19 views
11

Estoy buscando implementar un indizador simple hacia adelante en PHP. Sí, entiendo que PHP no es la mejor herramienta para la tarea, pero quiero hacerlo de todos modos. El razonamiento detrás de esto es simple: quiero uno, y en PHP.¿Cómo se puede implementar un índice hacia adelante en PHP?

Hagamos algunas suposiciones básicas:

  1. La totalidad Interweb consiste en unos cinco mil HTML y/o documentos de texto plano. Cada documento reside dentro de un dominio particular (UID). No existen otros formatos patentados/arcanos en nuestro imaginario cavemanque Interweb.

  2. El resultado de nuestro algoritmo de indexación hacia adelante basado en PHP debe ser impresionante a lo largo de las líneas de:

    UID1 -> index.html -> Helen, ella, era, campeón, con, pecas

    UID1 -> foo.html -> pollo, los agricultores, vaya, hogar, comer, ovejas

    UID2 -> blah.html -> siguiente, la semana, el, badgerwatch

    UID2 -> gah.txt -> uno, uno, y, uno, es, no, numberwang

Idealmente, me gustaría ver soluciones que tengan en cuenta, incluso en su forma más elemental, los conceptos de tokenización/desambiguación de límites de palabras/etiquetado de parte de la voz. Por supuesto, se dan cuenta de esto es una ilusión, y por lo tanto se humilla cualquier intento digno en el análisis de dichos documentos imaginarios por:

  1. La extracción del material contenido real del texto dentro del documento como una lista de palabras en el orden en que se presentan.
  2. Todo el tiempo, haciendo caso omiso de cualquier basura como <script> y <html> etiquetas para calcular una lista de UID (que podría ser, por ejemplo, un dominio) seguido por el nombre del documento (el recurso dentro del dominio) y, finalmente, la lista de palabras para ese documento. Me doy cuenta de que las etiquetas HTML juegan un papel importante en la colocación semántica del texto dentro de un documento, pero en esta etapa I no me importa.
  3. Tenga en cuenta una solución que puede construir la lista de palabras MIENTRAS lee el documento es más frío que el que necesita leer en el documento completo primero.

En esta etapa, no me preocupan los dónde o cómo de almacenamiento. Incluso un conjunto rudimentario de declaraciones 'impresas' será suficiente.

Gracias de antemano, espero que esto sea lo suficientemente claro.

+1

+1 para impresionantes textos de muestra – Artelius

+0

¿Es esta su tarea? Parece que solo quieres un simple analizador de archivos ... – Louis

+4

@Lou ¿Tarea? Vamos – karim79

Respuesta

7

Tome un vistazo a

http://simplehtmldom.sourceforge.net/

Haces algo como

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

Y que le dará todo el texto. Want para repetir sólo los enlaces

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

Es muy útil y potente. Compruébalo.

+0

pregunta rápida: ¿eliminamos entradas en el índice directo después de haberlo consumido y lo convertimos en índice invertido? – Roylee

5

No creo que estoy totalmente claro en lo que estamos tratando de hacer, pero usted puede conseguir a un simple resultado bastante facilidad:

  1. ejecutar la página a través Tidy (a good introduction) para asegurarse va a tener un HTML válido.
  2. Bótelo todo antes (e incluido) <body>.
  3. Pase por el documento un carácter a la vez.
    1. Si el personaje es un '<', no hacen nada con los siguientes caracteres hasta que aparezca un '>' (salta HTML)
    2. Si el personaje es un "carácter de palabra" (alfanuméricos, guiones , posiblemente más) añádalo a la "palabra actual".
    3. Si el carácter es un "carácter no verbal" (puntuación, espacio, posiblemente más), agregue la "palabra actual" a la lista de palabras en el índice directo, y borre la "palabra actual".
  4. Haz lo anterior hasta que toques </body>.

Eso es realmente de ello, es posible que tenga que añadir en algunas excepciones para manejar cosas como <script> etiquetas (que no quiere tener en cuenta que Javascript esté palabras que deben ser indexados), sino que debe darle un básico índice adelante.

+0

Gracias Chad, eso es realmente útil :) – karim79

Cuestiones relacionadas