2010-07-08 27 views
6

si alguien alguna vez ha enviado una historia a digg, comprueba si la historia ya se envió o no, supongo que mediante una búsqueda difusa.búsqueda de php (difusa) que coincida con

Me gustaría implementar algo similar y quiero saber si están utilizando una clase php de código abierto.

Soundex isnt hacerlo, frases/cuerdas pueden ser de hasta 250chars de longitud

+1

¿Estás seguro de que no solo coinciden con el título o la URL? ... He tenido un gran éxito con la fórmula de Levenshtein, pero estoy seguro de que comenzaría a fallar con grandes conjuntos de datos. – Fosco

+0

lo estoy intentando ahora, pero estoy pensando que podría derretir una cuenta de alojamiento barata con cualquier tipo de tracción – chris

Respuesta

0

Se puede (dependiendo del tamaño del conjunto de datos) utiliza búsqueda de texto completo de MySQL, y buscarse un artículo (s) que tienen un alto puntaje y están dentro de un cierto período de tiempo, y sugieren esto/estos para el usuario.

Más puntaje aquí: MySQL Fulltext Search Score Explained

+0

Maths no es mi punto fuerte – chris

+0

Desafortunadamente, la programación tiene mucho que ver con las matemáticas. – Pete

5

Desafortunadamente, hacer esto en PHP es prohibitivamente caro Sin embargo, ciertamente puede aplicar el algoritmo para pequeños conjuntos de datos (alta utilización de CPU y de memoria.).

Para ampliar específicamente en cómo se puede crear una fusión servidor: par de funciones integradas de PHP va a determinar la "distancia" entre las cuerdas: levenshtein y similar_text.

Maniquí de datos: (pretenden ser titulares de noticias)

$titles = <<< EOF 
Apple 
Apples 
Orange 
Oranges 
Banana 
EOF;

$titles = explode("\n", $titles);

En este punto, $ títulos solo debe ser una matriz de cadenas. Ahora, crea una matriz y compara cada titular con CADA otro título para ver si hay similitud. En otras palabras, para 5 titulares, obtendrá una matriz 5 x 5 (25 entradas). Ahí es donde entra la CPU y el receptor de memoria.

Es por eso que este método (a través de PHP) no se puede aplicar a miles de entradas Pero si quisiera:

$matches = array(); 
foreach($titles as $title) { 
    $matches[$title] = array(); 
    foreach($titles as $compare_to) { 
     $matches[$title][$compare_to] = levenshtein($compare_to, $title); 
    } 
    asort($matches[$title], SORT_NUMERIC ); 
}

En este punto, lo que básicamente tiene es una matriz con "distancias de texto". En concepto (no en datos reales) se ve más o menos como en esta tabla a continuación. Tenga en cuenta que hay un conjunto de 0 valores que van en diagonal, lo que significa que en el ciclo de coincidencia, dos palabras idénticas son, bueno, idénticas.

 
     Apple Apples Orange Oranges Banana 
Apple 0  1  5  6  6 
Apples 1  0  6  5  6 
Orange 5  6  0  1  5 
Oranges 6  5  1  0  5 
Banana 6  6  5  5  0 

El $ real coincida con arreglo parece algo como esto (truncada):

Array 
(
    [Apple] => Array 
     (
      [Apple] => 0 
      [Apples] => 1 
      [Orange] => 5 
      [Banana] => 6 
      [Oranges] => 6 
     ) 

    [Apples] => Array 
     (
     ... 

De todos modos, le toca a usted para (mediante experimentación) determinar que una buena distancia numérica de corte podría mayormente partido - y luego aplicarlo. De lo contrario, lea en sphinx-search y úselo, ya que tiene librerías PHP.

Naranja, ¿te alegras de haber preguntado por esto?

2

Sugiero tomar las URL enviadas por los usuarios y almacenarlas en varias partes; nombre de dominio, ruta y cadena de consulta. Use la función PHP parse_url() para derivar las partes de la URL enviada.

Indique al menos el nombre de dominio y la ruta. Luego, cuando un nuevo usuario envía una URL, busca en su base de datos un registro que coincida con el dominio y la ruta. Como las columnas están indexadas, primero se filtrarán todos los registros que no estén en el mismo dominio y luego se buscarán en los registros restantes. Dependiendo de su conjunto de datos, esto debería ser más rápido que simplemente indexar la URL completa. Asegúrese de que su cláusula WHERE esté configurada en el orden correcto.

Si eso no satisface sus necesidades, le sugiero que pruebe Sphinx. Sphinx es un motor de búsqueda de texto completo SQL de código abierto mucho más rápido que MySQL en búsqueda de texto completo. Es compatible con stemming y algunas otras características agradables.

http://sphinxsearch.com/

También puede tomar el contenido de títulos o el texto de la presentación usuarios, ejecutar a través de una función para generar palabras clave, y buscar en la base de datos para los registros existentes con los palabras clave o similares.

Cuestiones relacionadas