2011-11-02 14 views
7

Lo que estoy tratando de implementar es un "resultados de búsqueda de toma (como en el título & breve descripción) triviales, agruparlos en grupos con nombres significativos" en PHP.Biblioteca PHP para clustering de palabras/PNL?

Después de horas de búsqueda en Google e innumerables búsquedas en SO (obteniendo resultados interesantes como siempre, aunque nada realmente útil) Todavía no puedo encontrar ninguna biblioteca de PHP que me ayude a manejar el clúster.

  • ¿Existe una biblioteca de PHP por ahí que me podría haber perdido?
  • Si no es así, ¿hay algún FOSS que administre los clústeres y tenga una API decente?
+3

Clústerlos según qué? ¿Qué es un grupo significativo para ti? – netcoder

+0

Defina "grupos con nombre significativo". – hakre

+0

@netcoder: en una biblioteca de clústeres de propósito general, eso no debería importar. La elección de las características debería determinar qué tipo de grupos se producen. –

Respuesta

4

De esta manera:

utilizar una lista de palabras vacías, obtener todas las palabras o frases no en las palabras vacías, contar las ocurrencias de cada uno, más o menos en orden descendente.

Las palabras vacías deben ser una lista de todos los términos comunes en inglés. También debe incluir signos de puntuación, y tendrá que volver a colocar previamente todos los signos de puntuación como una palabra separada, p. Ej. "Algo como esto." -> "Algo, como esto". O bien, puede eliminar toda la puntuación.

$content=preg_replace('/[^a-z\s]/', '', $content); // remove punctuation 

$stopwords='the|and|is|your|me|for|where|etc...'; 
$stopwords=explode('|',$stopwords); 
$stopwords=array_flip($stopwords); 

$result=array(); $temp=array(); 
foreach ($content as $s) 
if (isset($stopwords[$s]) OR strlen($s)<3) 
{ 
if (sizeof($temp)>0) 
    { 
    $result[]=implode(' ',$temp); 
    $temp=array(); 
    }    
} else $temp[]=$s; 
if (sizeof($temp)>0) $result[]=implode(' ',$temp); 

$phrases=array_count_values($result); 
arsort($phrases); 

Ahora tiene una matriz asociativa en orden de la frecuencia de los términos que ocurren en sus datos de entrada.

La forma en que desea realizar las coincidencias depende de usted, y depende en gran medida de la longitud de las cadenas en los datos de entrada.

Vería si alguna de las 3 mejores teclas de matriz coinciden con cualquiera de las 3 principales de cualquier otra en los datos. Estos son tus grupos.

Avíseme si usted tiene algún problema con esto.

+0

Olvidé mencionar a strtolower() primero, aunque debería ser obvio. – Alasdair

2

"... agruparlos en grupos significativos" es un poco vago, tendrá que ser más específico.

Para empezar, podría ver los clústeres de K-Means.

Tener un vistazo a esta página y página web:

PHP/irInformation Retrieval and other interesting topics

EDITAR: Usted podría tratar de algunos de minería de datos a sí mismo por los resultados de búsqueda de referencias cruzadas con algo así como el directorio dmoz RDF volcado de datos abierta y luego enumerar las categorías coincidentes.

EDIT2: ¡Y aquí está una pregunta de dmoz/categoría que también menciona "Búsqueda facetada"!

Dmoz/Monster algorithme to calculate count of each category and sub category?

+0

Gracias, ya lo había encontrado ... Si bien es una lectura interesante y un buen código de ejemplo, está lejos de ser una biblioteca. En cuanto a los "grupos significativos", [esta búsqueda Yippy (tenga en cuenta lo que ellos llaman "nubes")] (http://search.yippy.com/search?input-form=clusty-simple&v%3Asources=webplus-ns-aaf&v% 3Aproject = clusty & query = sightseeing + munich) ilustra bastante bien lo que intento implementar. – vzwick

+0

@vzwick: ¿Quieres decir ... faceting? – netcoder

+0

@vzwick Ah, el sitio de ejemplo explica todo. La respuesta simple es no, no encontrará una biblioteca que lo haga automáticamente por usted. – zaf

1

si está haciendo esto para Inglés solamente, usted podría utilizar WordNet: http://wordnet.princeton.edu/. Es un léxico ampliamente utilizado en la investigación que proporciona, entre otras cosas, conjuntos de sinónimos de palabras en inglés. La distancia más corta entre dos palabras podría servir como una métrica de similitud para agruparse como propuso zaf.

Aparentemente hay una interfaz PHP para WordNet aquí: http://www.foxsurfer.com/wordnet/. Surgió en esta pregunta: How to use word Net with php, pero no lo he intentado. Sin embargo, también es posible interconectarse con una herramienta de línea de comandos de PHP.

1

También puede consultar Programming Collective Intelligence (Capítulo 3: Descubriendo grupos) de Toby Segaran que pasa por este caso de uso usando Python. Sin embargo, deberías poder implementar cosas en PHP una vez que entiendas cómo funciona.

Aunque no es PHP, el proyecto Carrot2 ofrece varios motores de agrupamiento y puede integrarse con Solr.

0

Esto puede estar muy lejos, pero echa un vistazo a OpenCalais. Tienen un servicio web que le permite pasar un bloque de texto y le devolverá una respuesta parseable de las cosas que encontró en el texto, como lugares, personas, hechos, etc. Puede usar estas categorías para construir su "nubes" y también elegir qué resultados mostrar.

He usado esta biblioteca varias veces en PHP y siempre ha sido muy fácil trabajar con ella.

De nuevo, puede que no sea relevante para lo que intenta hacer. ¿Tal vez podrías publicar un ejemplo de lo que intentas lograr?

0

Si puede predefinir los filtros para su búsqueda facetada (los grupos nombrados), entonces será mucho más fácil.

En lugar de confiar en un algoritmo que utiliza la entrada del buscador actual y sus resultados particulares para generar la lista de filtros, debería usar un conjunto de las búsquedas más comunes realizadas por todos los usuarios y luego etiquetar los resultados con ellos si coinciden.

Usted terminaría con una tabla (o algo) de URL en una combinación de muchos a muchos a una tabla de etiquetas, por lo que cada URL de resultados podría tener varias etiquetas apropiadas.

Cuando el usuario busca, simplemente hace coincidir su búsqueda con el índice completo. Pero para los filtros, tomas los mejores resultados de entre los resultados actuales.

Trabajaré en ejemplos de consulta si lo desea.