Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Contar palabras repetidas

Estas en el tema de Contar palabras repetidas en el foro de Javascript en Foros del Web. Hola! Quiero crear un script que me permita saber cuantas veces se repite una palabra dentro de un textarea, el script que tengo ahora devuelve ...
  #1 (permalink)  
Antiguo 23/12/2014, 13:36
Avatar de Wizerol  
Fecha de Ingreso: octubre-2014
Mensajes: 35
Antigüedad: 9 años, 6 meses
Puntos: 0
Contar palabras repetidas

Hola! Quiero crear un script que me permita saber cuantas veces se repite una palabra dentro de un textarea, el script que tengo ahora devuelve el numero de palabras y espacios, se puede implementar el contador de repeticiones de palabras dentro del mismo script? Tendria que mostrar algo así:

Texto: Hola me llamo Hola.

Resultado:
Palabras: 4.
Espacios: 3.
Numero de apariciones por palabra: Hola: 2, me: 1, llamo: 1.

Código:
function impRe(){
 
text1 = texto.value;                                               

var sim = /\s+/gi;                                                      

var palabras= texto.value.trim().replace(sim, ' ').split(' ').length;

var espacios= texto.value.split(" ").length - 1;            
    
alert("Numero espacios: " + (espacios) + "\nNumero de palabras: " + (palabras))

}
Es posible? Muchas gracias!
  #2 (permalink)  
Antiguo 23/12/2014, 14:55
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Contar palabras repetidas

En PHP existe una función llamada array_count_values, la cual genera un array en donde las claves son las palabras que el array original contiene y los valores son la cantidad de veces que se repite cada valor en el array. Aquí puedes ver un algoritmo que implementa la funcionalidad de dicha función en JavaScript, solo te quedaría formar un array con el valor del <textarea>, el cual podrías formar con la función split.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 23/12/2014, 20:41
Avatar de Wizerol  
Fecha de Ingreso: octubre-2014
Mensajes: 35
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Contar palabras repetidas

Gracias pero no consigo hacer que funcione, lo he modificado del siguiente modo:

Código Javascript:
Ver original
  1. var tmp_arr = texto.value.trim().replace(sim, ' ').split(' ').length;

Es lo que hay que hacer o hay que crear una nueva variable?
El split del textarea es correcto?
Cual es la variable que muestra el resultado?

Siento ser tan pesado con las preguntas pero estoy empezando a programar y tengo un montón de dudas! Espero que pronto pueda responder preguntas!
  #4 (permalink)  
Antiguo 23/12/2014, 21:34
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Contar palabras repetidas

Lo que tienes que hacer es tomar el valor del <textarea>, aplicarle el método split, separando las palabras a partir de los espacios y otros signos que no sean letras (y/o números) y a dicho resultado, le aplicarías la función del enlace que te dejé. De esa manera, obtendrás el resultado deseado.

Un ejemplo:
Código HTML:
Ver original
  1. <textarea id = "foo">Hola mundo, hoy es martes, mañana es nochebuena, pasado mañana es navidad. Hola mundo</textarea>

Código Javascript:
Ver original
  1. /* ACÁ IMPLEMENTAS EL ALGORITMO DE LA PÁGINA QUE TE DEJÉ */
  2.  
  3. var valorTextarea = document.querySelector("#foo").value,
  4.     array = valorTextarea.split(/[\s\.,]+/g),
  5.     resultado = array_count_values(array);
  6.  
  7. for(var palabra in resultado){
  8.     console.log("La palabra '" + palabra + "' se repite " + resultado[palabra] + " vez/veces");
  9. }

El resultado es el siguiente:
Código BASH:
Ver original
  1. La palabra 'Hola' se repite 2 vez/veces
  2. La palabra 'mundo' se repite 2 vez/veces
  3. La palabra 'hoy' se repite 1 vez/veces
  4. La palabra 'es' se repite 3 vez/veces
  5. La palabra 'martes' se repite 1 vez/veces
  6. La palabra 'mañana' se repite 2 vez/veces
  7. La palabra 'nochebuena' se repite 1 vez/veces
  8. La palabra 'pasado' se repite 1 vez/veces
  9. La palabra 'navidad' se repite 1 vez/veces

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 23/12/2014 a las 21:40 Razón: Mejora
  #5 (permalink)  
Antiguo 24/12/2014, 05:03
Avatar de Wizerol  
Fecha de Ingreso: octubre-2014
Mensajes: 35
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Contar palabras repetidas

No funciona, opto por enseñarte el código completo... Aún así se podria utilizar al mismo tiempo que el script que cuenta las palabras y los espacios?

Código Javascript:
Ver original
  1. function array_count_values(array) {
  2.  
  3.   var tmp_arr = {};
  4.     key = '';
  5.     t = '';
  6.  
  7.   var __getType = function(obj) {
  8.     var t = typeof obj;
  9.     t = t.toLowerCase();
  10.     if (t === 'object') {
  11.       t = 'array';
  12.     }
  13.     return t;
  14.   };
  15.  
  16.   var __countValue = function(value) {
  17.     switch (typeof value) {
  18.       case 'number':
  19.         if (Math.floor(value) !== value) {
  20.           return;
  21.         }
  22.  
  23.       case 'string':
  24.         if (value in this && this.hasOwnProperty(value)) {
  25.           ++this[value];
  26.         } else {
  27.           this[value] = 1;
  28.         }
  29.     }
  30.   };
  31.  
  32.   t = __getType(array);
  33.   if (t === 'array') {
  34.     for (key in array) {
  35.       if (array.hasOwnProperty(key)) {
  36.         __countValue.call(tmp_arr, array[key]);
  37.       }
  38.     }
  39.   }
  40.  
  41.   return tmp_arr;
  42.    
  43.     var valorTextarea = document.querySelector("texto").value,   //el id del textarea es 'texto'
  44.     array = valorTextarea.split(/[\s\.,]+/g),
  45.     resultado = array_count_values(array);            
  46.  
  47. for(var palabra in resultado){
  48.     alert("La palabra '" + palabra + "' se repite " + resultado[palabra] + " vez/veces");
  49. }
  50. }
La función se llama de esta manera?
Código HTML:
Ver original
  1. <input type="button" value="Start" onClick="array_count_values(array);">
Buenas fiestas.

Última edición por Wizerol; 24/12/2014 a las 05:04 Razón: Agregar contenido.
  #6 (permalink)  
Antiguo 24/12/2014, 06:28
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Contar palabras repetidas

Fijate si te sirve:
Código:
<div id="log"></div>
<script>
function contarPalabras(frase){
	var tmp={},cantPal,cantEsp,lista,i=0;
	frase=frase.split('.').join('').split(',').join('').split(';').join('').split(':').join('').split('-').join('').split('(').join('').split(')').join('').split('[').join('').split(']').join('').split('"').join('').split("'").join('');
	lista=frase.split(' ');
	cantPal=lista.length;
	cantEsp=cantPal-1;
	for(;i<cantPal;i++){
		if(tmp.hasOwnProperty(lista[i])){
			tmp[lista[i]]+=1;
		}else{
			tmp[lista[i]]=1;
		}
	}

	return [cantPal,cantEsp,tmp];
}
var data=contarPalabras('Este año fue muy bueno, excepto por dos acontecimientos muy dolorosos: la muerte de mi padre y la desaparición de mi compañera y amiga: mi gatita Ginny');
var acum=[];
for (var i in data[2]){
	acum.push(i+': '+data[2][i]);
}
document.getElementById('log').innerHTML='Cant. palabras: '+data[0]+'<br>Cant. espacios: '+data[1]+'<br>'+acum.join('<br>');

</script>
  #7 (permalink)  
Antiguo 24/12/2014, 10:18
Avatar de America|UNK  
Fecha de Ingreso: noviembre-2006
Ubicación: Piura - Perú
Mensajes: 582
Antigüedad: 17 años, 5 meses
Puntos: 56
Respuesta: Contar palabras repetidas

Si ya estás usando navegadores modernos puedes usar el método map, luego de convertir el texto en array y recorrer cada palabra guardando en otro array donde va el conteo de cada palabra repetida. Si quieres compatibilidad para navegadores antiguos puedes usar map de jQuery.
Código Javascript:
Ver original
  1. function contarPalabras(s){
  2.     var r = {}
  3.     s = s.split(/\s+/).map(function(a){ !r[a] && (r[a] = 0); r[a]++ })
  4.     return function(what){
  5.         return {"palabras": s.length, "espacios": s.length - 1, "repeticiones": r}[what]
  6.     }
  7. }
  8.  
  9. var result = contarPalabras("Hola me llamo Hola")
  10.  
  11. result("palabras") //4
  12. result("espacios") //3
  13. result("repeticiones") //{Hola: 2, me: 1, llamo: 1}
  14. result("repeticiones")["Hola"] //2
__________________
/* El que atiende, entiende..., el que entiende, aprende!.
Desarrollo Web Freelance, Contactar */
  #8 (permalink)  
Antiguo 24/12/2014, 11:34
Avatar de marlanga  
Fecha de Ingreso: enero-2011
Ubicación: Murcia
Mensajes: 1.024
Antigüedad: 13 años, 3 meses
Puntos: 206
Respuesta: Contar palabras repetidas

http://jsfiddle.net/s0f57q82/

Código Javascript:
Ver original
  1. String.prototype.contar = function() {
  2.     var c = {};
  3.     this.toLowerCase().replace(/[^a-záéíóúüñ ]+/ig, ' ').replace(/\s+/g, ' ').replace(/(^\s+)|(\s+$)/,'').split(" ").forEach(function(p){
  4.         c[p] = (p.length && c[p] ? c[p] + 1 : 1);
  5.     });
  6.     return c;
  7. };

Otra muy parecida a la anterior que tenía hecha de hace tiempo.
  #9 (permalink)  
Antiguo 24/12/2014, 11:47
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Contar palabras repetidas

Wizerol: ¿Por qué colocaste el código de la invocación de la función dentro de la función? No debiste de hacerlo. Por otra parte, al darle clic al <textarea>, no mostrarás nada ya que la función retorna un objeto, mas no lo imprime. Eso ya te toca hacerlo o bien podrías modificar la función:

Código HTML:
Ver original
  1. <textarea onclick = "array_count_values(this.value)">Este año fue muy bueno, excepto por dos acontecimientos muy dolorosos: la muerte de mi padre y la desaparición de mi compañera y amiga: mi gatita Ginny</textarea>

Código Javascript:
Ver original
  1. function array_count_values(texto) {
  2.  
  3.   var array = texto.split(/[^a-zñáéíóúÁÉÍÓÚÑ\d]+/gi);
  4.  
  5.   var tmp_arr = {};
  6.     key = '';
  7.     t = '';
  8.  
  9.   var __getType = function(obj) {
  10.     var t = typeof obj;
  11.     t = t.toLowerCase();
  12.     if (t === 'object') {
  13.       t = 'array';
  14.     }
  15.     return t;
  16.   };
  17.  
  18.   var __countValue = function(value) {
  19.     switch (typeof value) {
  20.       case 'number':
  21.         if (Math.floor(value) !== value) {
  22.           return;
  23.         }
  24.  
  25.       case 'string':
  26.         if (value in this && this.hasOwnProperty(value)) {
  27.           ++this[value];
  28.         } else {
  29.           this[value] = 1;
  30.         }
  31.     }
  32.   };
  33.  
  34.   t = __getType(array);
  35.   if (t === 'array') {
  36.     for (key in array) {
  37.       if (array.hasOwnProperty(key)) {
  38.         __countValue.call(tmp_arr, array[key]);
  39.       }
  40.     }
  41.   }
  42.  
  43.   var valores = [];
  44.  
  45.   for (var i in tmp_arr) valores.push("La palabra '" + i + "' se repite " + tmp_arr[i] + " vez/veces");
  46.   alert(valores.join("\n") + "\n\nHay " + (texto.match(/\s+/g).length) + " espacios" + "\nHay " + array.length + " palabras");
  47. }

DEMO

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Última edición por Alexis88; 24/12/2014 a las 11:57 Razón: Mejora
  #10 (permalink)  
Antiguo 24/12/2014, 12:26
Avatar de Wizerol  
Fecha de Ingreso: octubre-2014
Mensajes: 35
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Contar palabras repetidas

Funciona bien en el sandbox pero al implementarlo en mi código no funciona, lo que quieres decir es que llame al textarea con el contenido introducido por el usuario no?
  #11 (permalink)  
Antiguo 24/12/2014, 12:58
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Contar palabras repetidas

Intenta adaptar el código del ejemplo a lo que tienes y prueba. Si algo no funciona, muéstranos el código con los cambios que hiciste.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #12 (permalink)  
Antiguo 24/12/2014, 13:14
Avatar de Wizerol  
Fecha de Ingreso: octubre-2014
Mensajes: 35
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Contar palabras repetidas

No entiendo lo que hago mal, no funciona pero no encuentro otra manera :S

Código HTML:
Ver original
  1.  
  2.  
  3.  
  4. </head>
  5.  
  6. <div align='center'>
  7. <textarea id="texto" cols=70 rows=5></textarea><br><br>
  8. <input href="#" class="myButton" type="button" value="Start" onClick="array_count_values(texto);">
  9. </div>
  10.  
  11. <script type="text/javascript" src="nump.js"></script>
  12. </body>
  13.  
  14. </html>

Código Javascript:
Ver original
  1. function array_count_values(texto) {
  2.  
  3.   var array = texto.value.trim().replace(sim, ' ').split(' ').length;
  4.  
  5.   var tmp_arr = {};
  6.     key = '';
  7.     t = '';
  8.  
  9.   var __getType = function(obj) {
  10.     var t = typeof obj;
  11.     t = t.toLowerCase();
  12.     if (t === 'object') {
  13.       t = 'array';
  14.     }
  15.     return t;
  16.   };
  17.  
  18.   var __countValue = function(value) {
  19.     switch (typeof value) {
  20.       case 'number':
  21.         if (Math.floor(value) !== value) {
  22.           return;
  23.         }
  24.  
  25.       case 'string':
  26.         if (value in this && this.hasOwnProperty(value)) {
  27.           ++this[value];
  28.         } else {
  29.           this[value] = 1;
  30.         }
  31.     }
  32.   };
  33.  
  34.   t = __getType(array);
  35.   if (t === 'array') {
  36.     for (key in array) {
  37.       if (array.hasOwnProperty(key)) {
  38.         __countValue.call(tmp_arr, array[key]);
  39.       }
  40.     }
  41.   }
  42.    
  43.     console.log(texto.match(/\s+/g));
  44.  
  45.   var valores = [];
  46.  
  47.   for (var i in tmp_arr) valores.push("La palabra '" + i + "' se repite " + tmp_arr[i] + " vez/veces");
  48.     alert(valores.join("\n") + "\n\nHay " + (texto.match(/\s+/g).length) + " espacios" + "\nHay " + array.length + " palabras");
  49. }
  #13 (permalink)  
Antiguo 24/12/2014, 13:17
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: Contar palabras repetidas

Fíjate en el valor que envías a la función:

Código HTML:
Ver original
  1. onClick="array_count_values(texto);"

Debería de ser así:

Código HTML:
Ver original
  1. onClick="array_count_values(document.querySelector('#texto').value);"

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: palabras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:34.