JavaScript - ayuda con ejercicio de entrada/salida

 
Vista:
sin imagen de perfil
Val: 10
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

ayuda con ejercicio de entrada/salida

Publicado por daniel (5 intervenciones) el 11/12/2018 19:36:24
construiremos un programa que estime cual es la palabra más frecuente en el lenguaje español. Para ello, nuestro programa contará cuantas veces aparece cada palabra tomando como entrada una serie de libros y analizando estos. El programa devolverá la palabra más frecuente de entre esos libros analizados. El programa empleará los siguientes libros para ser analizados:

La Regenta: http://www.gutenberg.org/cache/epub/17073/pg17073.txt
La Divina Comedia: http://www.gutenberg.org/cache/epub/57303/pg57303.txt
El Lazarillo de Tormes: http://www.gutenberg.org/cache/epub/320/pg320.txt
Don Quijote de la Mancha: http://www.gutenberg.org/cache/epub/2000/pg2000.txt
Platero y yo: http://www.gutenberg.org/cache/epub/9980/pg9980.txt

El programa no deberá contabilizar toda aquella palabra que se encuentre en la siguiente lista: https://raw.githubusercontent.com/stopwords-iso/stopwords-es/master/stopwords-es.txt

he pensado soluciones como crear una funcion que abra y lea cada libro, pero lo que no se es como contabilizar cada palabra en concreto.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 10
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

ayuda con ejercicio de entrada/salida

Publicado por daniel (5 intervenciones) el 11/12/2018 20:26:44
otra opción que estaba mirando es trabajar con Maps de Javascript, eso me permitiría leer cada palabra y añadirla a un Map con el numero de apariciones, pero sigo teniendo el problema de como detectar cada palabra distinta y almacenarla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

ayuda con ejercicio de entrada/salida

Publicado por daniel (5 intervenciones) el 12/12/2018 13:39:02
Muchas gracias por la contestación. Me encantaría, si puedes, ver como lo solucionarías. Yo después de darle muchas vueltas se me ocurre una manera de hacerlo, que mañana me pondré a implementar por trabajo que no puedo antes. La idea es almacenar todas las palabras en un Map de Javascript, y de ahí pedirle que me cuente el numero de apariciones cambiando el valor key asociado a cada palabra, pero ya digo, es una idea y no se exactamente como hacer las operaciones del Map.
Si encuentras alguna forma y no te importa compartirla te lo agradecería mucho.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de abzer0x
Val: 477
Bronce
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

ayuda con ejercicio de entrada/salida

Publicado por abzer0x (2 intervenciones) el 13/12/2018 06:55:00
Hola, hice un pequeño código en Nodejs, tal vez pueda servirte. La lógica puede adaptarse en varios lenguajes, PHP, Python, Java, etc.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
const fs = require("fs");
const readline = require("readline");
const books = [
  "El Lazarillo de Tormes.txt",
  "La Regenta.txt"
];
const stopwordsEs = fs.readFileSync("stopwords-es.txt").toString().split(/\n/);
const mapOfWords = new Map();
 
books.forEach((book, index) => {
  const rl = readline.createInterface({
    input: fs.createReadStream(book),
    crlfDelay: Infinity
  });
 
  // Leeo linea por linea el archivo
  rl.on("line", (line) => {
    // Elimino espacios en blanco y recorro la linea palabra por palabra.
    line.trim().split(" ").forEach(word => {
      // convierto todo a minúscula
      word = word.replace(/^$/g, "").toLowerCase();
      if (word.length > 0) {
        // Compruebo que la palabra no se encuentra en el array stopwordsEs
        if (!stopwordsEs.includes(word)) {
          // Si la palabra ya se encuentra en el Map incremento su valor en 1 de lo contrario la agrego al Map
          // con un valor inicial de 1
          mapOfWords.has(word) ? mapOfWords.set(word, mapOfWords.get(word) + 1) : mapOfWords.set(word, 1);
        }
      }
    })
  });
 
  rl.on("close", () => {
    if (index === books.length - 1) {
      // Ordeno el Map de forma ascendente y luego tomo el primer elemento, 
      // el cual será la palabra que más veces utilzó.
      const words = [...mapOfWords.entries()].sort((a, b) => b[1] - a[1]);
      const word = words[0];
      console.log(`La palabra '${word[0]}' aparece ${word[1]} veces en el libro`);
    }
  });
});


https://nodejs.org/dist/latest-v11.x/docs/api/readline.html
https://nodejs.org/dist/latest-v11.x/docs/api/fs.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
3
Comentar
sin imagen de perfil
Val: 10
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

ayuda con ejercicio de entrada/salida

Publicado por daniel (5 intervenciones) el 13/12/2018 17:22:33
hola buenas, muchas gracias por la contestación. Antes de mirarla he hecho mi propio código que ahora adjunto.
Funciona pero tengo un problema con el cual no se lidiar. A la hora de hacer el split por espacios en cada libro, obviamente me coge signos de puntuación u otros elementos como corchetes etc y no se como quitarlos. Si no los quito el recuento no es del todo válido por tanto si pudierais ayudarme.

Dejo aquí mi código, un saludo y muchas gracias.

En el código que dejo, aún no saco la más utilizada, porque tengo el problema que os he comentado y me gustaría resolverlo.

Espero podáis ayudarme como hasta ahora :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const fs= require ('fs');
let file=fs.openSync('divina.txt','r');
let text=fs.readFileSync(file,'utf-8');
 
let myMap= new Map();
let contador=0;
 
for(let line of text.split('\n')){
    let words= line.split(' ');
    for(let word of words){
        word.toLowerCase();
        if(myMap.has(word)){
            contador=myMap.get(word)+1;
            myMap.set(word,contador);
        }else myMap.set(word,1);
    }
}
 
for (let [key, value] of myMap) {
	console.log(key, value);
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado 1 puesto en JavaScript (en relación al último mes)
Gráfica de JavaScript

ayuda con ejercicio de entrada/salida

Publicado por daniel (5 intervenciones) el 16/12/2018 19:09:43
aquí os dejo el código final que he sacado.
Me sigue dando un problema con el filtrado, ya que como resultado final me sale un "de,36500" cosa que "de" no deberia de contabilizar. Pero no he conseguido mas. Seguiré en ello. He utilizado un Set para las excepciones y un Map para cargar todas las palabras de los libros.
Por cierto, trabajo con el programa visual studio code, con codigo en javascript, por si es de ayuda.
Ahí os lo dejo, saludos y gracias. Si alguien tiene alguna idea que la comparta como hasta ahora por favor.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
let myMap= new Map();
let excepciones= new Set();
 
let libro1= 'divina.txt';
let libro2= 'donquijote.txt';
let libro3= 'laregenta.txt';
let libro4= 'lazarillo.txt';
let libro5= 'platero.txt';
 
 
let valor_maximo=0;
let palabra;
 
const fs= require ('fs');
let file2=fs.openSync('stopwordses.txt','r');
let text2=fs.readFileSync(file2,'utf8');
for(let line2 of text2.split('\n\r')){
    excepciones.add(line2);
}
 
 
myMap=cargarLibro(libro1,myMap,excepciones);
myMap=cargarLibro(libro2,myMap,excepciones);
myMap=cargarLibro(libro3,myMap,excepciones);
myMap=cargarLibro(libro4,myMap,excepciones);
myMap=cargarLibro(libro5,myMap,excepciones);
 
 
for (let key of myMap.keys()) {
    if(valor_maximo<myMap.get(key)){
        valor_maximo=myMap.get(key);
        palabra=key;
    }
}
fs.closeSync(file2);
 
console.log(palabra,myMap.get(palabra));
 
 
 
 
function cargarLibro (libro, mapPalabras,nousar){
 
    let contador=0;
 
    const fs= require ('fs');
    let file=fs.openSync(libro,'r');
    let text=fs.readFileSync(file,'utf8');
 
 
 
    for(let line of text.split('\n\r')){
        let words= line.split(' ');
        for(let word of words){
            word=word.toLowerCase().trim();
            if(word!==' ' && !nousar.has(word)){
                if(mapPalabras.has(word)){
                    contador=mapPalabras.get(word)+1;
                    mapPalabras.set(word,contador);
                }else mapPalabras.set(word,1);
            }
        }
    }
 
    fs.closeSync(file);
 
    return mapPalabras;
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar