Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Contar el numero de veces que aparece cada palabra en una frase

Estas en el tema de Contar el numero de veces que aparece cada palabra en una frase en el foro de C/C++ en Foros del Web. Hola a todos, bueno resulta que quiero contar el numero de veces que aparece cada palabra en cada frase de un fichero. Lo mas simple ...
  #1 (permalink)  
Antiguo 20/04/2008, 14:11
 
Fecha de Ingreso: abril-2008
Mensajes: 3
Antigüedad: 16 años
Puntos: 0
Contar el numero de veces que aparece cada palabra en una frase

Hola a todos, bueno resulta que quiero contar el numero de veces que aparece cada palabra en cada frase de un fichero. Lo mas simple posible.

Habia pensado cojer una palabra y luego contar desde su posicion las veces que se repite, supongo k habran maneras mucho mejores de hacerlo que esta pero no se me ocurre cual. Podria almacenar primero todas las palabras en un vector y luego para cada palabra recorrer otra vez la frase contando. Pero nose como hacer un vector de palabras la verdad.


de hecho, podria usar search_n con palabras?

algo asi habia pensado, un boceto:

...

vector palabra[20];

while(fichero.getline(linea,1024)){

while(linea!="/n" || "."){

palabra[i]= linea[i];

i++}
// ya tengo la palabra, como recorro de nuevo la linea si estoy en teoria en la posicion i ?

while(linea<1024){

//como comparo caracter a caracter y si no corresponde vuelvo a empezar con la posicion 2? uso getchar? existe algun tipo de getword?

//habia pensado en comparar los primeros caracteres, si son iguales avanzo la palabra i sigo comparando, si no lo son avanzo la frase

while(palabra){
if palabra[i] = linea[u] , i++
if

else linea++

}

ando muy perdido se nota no
  #2 (permalink)  
Antiguo 20/04/2008, 19:31
 
Fecha de Ingreso: julio-2006
Mensajes: 4
Antigüedad: 17 años, 9 meses
Puntos: 0
Re: Contar el numero de veces que aparece cada palabra en una frase

utiliza una bandera auxiliar que recorra, todo, y dale un valor como ban=0, si la encuentra ban=1, y si ban=1, te imprima se encontro o algo asi, creo, o si no no te entendi bien
  #3 (permalink)  
Antiguo 21/04/2008, 07:46
 
Fecha de Ingreso: abril-2008
Mensajes: 3
Antigüedad: 16 años
Puntos: 0
Re: Contar el numero de veces que aparece cada palabra en una frase

no entiendo muy bien lo k dices, Igual me e explicado mal:

Yo tengo una frase obtenida con getline

ahora quiero contar las veces k aparece cada palabra en la frase

es decir, si tengo "hola pedro , como estas pedro ?."

hola=1
pedro=2
,=1
como=1
...

y los problemas que tengo son los k comento arriba,

nose como almacenar palabras en un vector para luego ir comparando de una en una y almacenar cada palabra con su resultado, me han dicho algo de usar diccionarios o tablas hash pero ando muy perdido, no quiero que sea eficiente, me basta con que funcione, en el momento k vaia ia tendre tiempo para darle eficiencia

Estoy buscando sobre los diccionarios pero encuentro pocos tutoriales que me valgan
  #4 (permalink)  
Antiguo 21/04/2008, 12:06
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
Re: Contar el numero de veces que aparece cada palabra en una frase

Hola, a ver si te puedo ayudar. Lo que se me ocurre que podrias hacer es crear un tipo propio como el siguiente:

Código:
typedef struct{
     char *palabra;
     int n;
}Palabra;

palabra
es un puntero de caracter que sirve unicamente para crear un array dinamico para guardar la palabra y no malgastar memoria (habra que pedir memoria para tantas letras como tenga la palabra). Tambien puedes declarar lo siguiente y no complicarte tanto la vida xD.

Código:
char palabra[50];
n guardara el numero de veces que sale repetida la palabra.

Habra que declarar un puntero del tipo Palabra, por ejemplo:

Código:
Palabra *p;
Lo primero que haces es recorrer toda la frase y contar el numero de palabras totales para, posteriormente, poder pedir memoria para tantos registros del tipo Palabra como numero de palabras tenga la frase con el objetivo de crear un array, no se si me explique bien xD. Es decir, si el numero total de palabras es num_total haces...:

Código:
p=(Palabra*)malloc(sizeof(Palabra)*num_total);
Lo siguiente sera inicializar a 0 todos los campos n del array de registros que hemos creado e inicializar con espacios en blanco todos los campos palabra.


Ahora lo que toca es volver a recorrer toda la frase. Lees una palabra y la comparas con todos los campos palabra del array de registros creado. Si es igual incrementas la n.



Es lo que se me acaba de ocurrir... seguramente tendra fallos pero es una idea de donde puedes partir... Consejo: Por el momento olvidate de funciones raras y haz el programa con arrays, registros, tipos propios y demas elementos basicos.

Espero haberme explicado bien jaja. Cualquier duda, pregunta.
  #5 (permalink)  
Antiguo 21/04/2008, 13:52
 
Fecha de Ingreso: abril-2008
Mensajes: 3
Antigüedad: 16 años
Puntos: 0
Re: Contar el numero de veces que aparece cada palabra en una frase

ook gracias, si mas o menos e hecho algo tirando por ahi
y creo k ya lo tengo, es mejor tu version con punteros asi k lo cambiare, hice algo asi en pseudocodigo faltan cosas k he pensado i tengo k implementar:

palabra[15]

while(xxx getline(linea,1000)){
//marco linea como leida, leidas[]=1
//meto las palabras en el vector de palabras...
// para cada caracter de la linea
for (int u=0; u<1000; u++){
si no es blanco o final
if (linea[u]!= (' '...){
//concateno en "palabra" los caracteres hasta llegar a espacio blanco
sprintf (palabra, "%s%c", palabra, linea[u]);
}
else{
// si es igual a espacio blanco, ok tengo la palbra, y la meto en el vector de palabras (strings)
//tb tengo k comprobar k la palabra no este ya metida...
palabras[m]=palabra;
//formateo vector palabra para posterior uso
for (int v=0; v<15; v++){palabra[v]=' ';}

}
//ya tengo todas las palabras en el vector. Pruebo cuantas veces se repite en la linea
while(palabras){
tengo k ver como funciona search_n k segun m han dicho hace lo k exactamente kiero
numerovecespalabrasenfrase[g]=search_n(parametros);


algo asi.


lo podria optimizar como dices en vez de con tamaños fijos palabra[15] vectorpalabras[500] con punteros i luego haciendo malloc.



peeeeeeeero ahora viene La segunda parte del problema k es la siguiente:

Ahora quiero hacer lo mismo para:

"porque no te callas callas en callas callas"

porque no=1
no te=1
te callas=1
callas callas=2
callas en =1
en callas =1


La cosa se complica jejejej i eso tengo k hacerlo para N es decir, para tamaño 1, tamaño2 tamañño 3... N

Total, ahora mismo estoy bloqueado en esto, nose como arreglar la funcion para ke pille los N tipos de lecturas y los almacene todos.

Habia pensado entonces en 2 matrices, para cada linea:

una para almacenar las palabras, en la primera fila las palabras sueltas, en la segunda las palabras compuestas por 2, en la tercera las palabras compuestas x 3...

una para almacenar las repeticiones, en la primera fila el numero de veces k se repite cada palabra para N=1, en la segunda fila las palabras compuestas x 2...

vy a ponerme a ello

Última edición por giomfe; 21/04/2008 a las 15:04
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:04.