Algoritmo Key Words

Iniciado por [u]nsigned, 22 Julio 2011, 18:35 PM

0 Miembros y 1 Visitante están viendo este tema.

[u]nsigned

Bueno, el titulo no es muy descriptivo asi que me explicare.

Lo que quiero es saber si existe algun algoritmo(clase) que a partir de un texto dado, el contenido de una noticia por ejemplo, deduzca cuales podrian ser las posibles 'palabras claves' de dicha noticia. Estoy realizando un portal de noticias, y la idea es no tener que crear a 'mano' las palabras claves o TAGS para cada noticia...existira algo asi o una fomra de hacerlo?

Una forma se me ocurre seria buscando palabras poco usadas como nombres poprios de personas y ciudades, y tambien descartando palabras muy usadas como adjetivos, adverbios, proposiciones, etc..

Saludos

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

madpitbull_99

Supongo que con substr_count() se podría hacer algo.

Primero tendrías que meter todas las palabras en un array y después comprobar cuál es la que más se repite. Esas serán los "tags" de la noticia.





«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

#!drvy

Woah, bastante complicado lo veo  :-\
Aquí siempre tendria que estar el ojo humano o algo que se le acerque xD.

Así a primera vista podría acercarse un poquitin xD...
Código (php) [Seleccionar]
<?php
    
function findkeyword($text,$false,$min,$repeat){
        
$keyword = array();
        
$text strtolower($text); // Covertir a letras minusculas
        
$words explode(' ',$text); // Separar palabras

        
foreach($words as $word){
            if(
preg_match('[\w{'.$min.',}]'$word)){ // Eliminar cualquier palabra menor de # chr.
                
$word preg_replace('[\W]','',$word); // Eliminar cualquier chr excepto [a-z0-9]
                
if(!in_array($word,$false)){
                    
$findrepeat substr_count($text$word); // Contar repeticiones
                    
if($findrepeat $repeat) {$keyword[] = $word;}// añadir a lista clave.
                
}
            }
        }
        return 
array_unique($keyword);
    }

    
$repeat 2// minimas veces repetida para ser keyword.
    
$min 3// minima longitud de la palabra
    
$texto ''// texto para procesar
    
$false = array('you','me','he','and'); // etc.. lista de palabras que no estan admitidas.
    
    
print_r(findkeyword($texto,$false,$min,$repeat));
?>


Suponiendo que el texto es

Silence! Stupid monkey. I kill you. You think you\'r better than
my chicken! NO! Stupid monkey. My chicken is better than you! I kill you! Stupid monkey... my chicken is the best!


Las palabras claves que saca son:
Array ( [0] => stupid [1] => monkey [2] => chicken )


Saludos

madpitbull_99

#3
Lo he hecho de otra manera, aunque la función de drvy es más flexible (filtra palabras).


Código (php) [Seleccionar]
<?php

/*
* Returns the most repetead words (llonger than $long)
* given in a string
*@author MadPitbull
*/
function kWords($txt$lim$long 3) {

$e explode(" "str_replace(array(",""."), " "strtolower($txt)));
$a array_count_values($e);
arsort($a); array_shift($a);
$p array_keys($a);
for ($l 0$l count($p); $l++) {
if (strlen($p[$l]) >= $long ) {
$f[] = $p[$l];
}
}
for ($i 0$i $lim$i++) {
$kW[] = $f[$i];
}
return $kW;
}


$txt "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
$txt2 "Silence! Stupid monkey. I kill you. You think you\'r better than my chicken! NO! Stupid monkey. My chicken is better than you! I kill you! Stupid monkey... my chicken is the best!";
$txt3 "Note that in a multidimensional array, each element may be identified by a _sequence_ of keys, i.e. the keys that lead towards that element. Thus \"preserving keys\" may have different interpretations. Ivan's function for example creates a two-dimensional array preserving the last two keys. Other functions below create a one-dimensional array preserving the last key. For completeness, I will add a function that merges the key sequence by a given separator and a function that preserves the last n keys, where n is arbitrary.";
kWords($txt54);


?>


Primer parámetro: el texto donde buscar; Segundo: es el número de palabras que quieres "filtrar"; Tercero: número mínimo de caracteres que debe tener la palabra.

Devuelve un array, de tipo:


Array
(
    [0] => stupid
    [1] => monkey
    [2] => chicken
    [3] => you!
    [4] => than
)




«Si quieres la paz prepárate para la guerra» Flavius Vegetius


[Taller]Instalación/Configuración y Teoría de Servicios en Red

[u]nsigned

Muchas gracias Mad, me sera de mucha ayuda, lo implementare con una base de palabras 'poco utiles' que estoy armando con preposiciones, articulos, etc.

Saludos

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!