Autor Tema: Analisis lexico  (Leído 202 veces)

cris0710

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Analisis lexico
« en: 03 de Marzo 2021, 20:23 »
Un programa que lea un texto, que pueden ser varias líneas y a continuación:

Comparar las palabras de ese texto contra las palabras de una lista llamada Diccionario.
Indicar el número de coincidencias.
Volver a mostrar el texto resaltando de alguna forma las palabras coincidentes.

Esto es lo que llevo pero no me entra al ultimo if y no se si el diccionario me reciba las palabras como una lista o como una sola cadena, agradeceria mucho si me pudieran apoyar.

Código: [Seleccionar]
#include<conio.h>
#include<iostream>
#include <string.h>
using namespace std;

int main(){
    char palabra[50];
    char *tokenPtr;
    char cont=' ';
std::string strtoken;
    char diccionario[50]={"hola vallarta mexico"};
    int x,a,tam,i;
    x=1;
   
   
    cout<<"ingrese cadena "<<endl;
    cin.getline(palabra,50);
   
    tam=strlen(palabra);
   
    for(i=0;i<tam;i++){
   
        if(palabra[i]==' ' ){
            x++;
           
        }
    }
   
    cout<< "Estan escritas "<<x<<" palabras "<<endl;
    cout<<"La frase introducida es: "<<endl;
  tokenPtr = strtok ( palabra, " ");
while ( tokenPtr != NULL )
{
cout<<"La palabra es: " <<tokenPtr <<endl;
tokenPtr = strtok( NULL, " " );
strtoken = tokenPtr;
}
 
if(diccionario==palabra){
cont++;
}
cout<<"Palabras que coinciden con el diccionario "<<cont<<endl;

return 0;
}


cris0710

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Re: Analisis lexico
« Respuesta #1 en: 03 de Marzo 2021, 23:00 »
O si consideran que sería más fácil hacerlo en Java no hay problema

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 574
    • Ver Perfil
Re: Analisis lexico
« Respuesta #2 en: 04 de Marzo 2021, 01:07 »
Mmmhh, en Java si se me ocurren formas sencillas de hacerlo.
Pero claro, Java incorpora librerías y clases que bien usadas, te hacen la vida muy fácil.

Por ejemplo, la clase Scanner que normalmente usamos para leer por teclado, se le puede pasar un String y pedir que nos vaya dando palabras de una en una para ir comprobando si se encuentra en el diccionario.
El diccionario, si lo hacemos con un String, esta clase nos da el método contains() para con toda sencillez averiguar si la palabra existe en el diccionario.

Para resaltar las palabras coincidentes, mientras se comprueba si las palabras existen en el diccionario, se puede ir construyendo una copia del texto original en otro String, o mejor aún, en un StringBuilder.
Si se encuentra una palabra en el diccionario, la pasamos a la copia metiéndola entre corchetes por ejemplo.
Y si no se encuentra, la pasamos a la copia tal cual, sin resaltar nada.

Código: [Seleccionar]
public class Palabras {

public static void main(String[] args) {

String texto = "Este es un texto para probar un programa escrito en Java";
String diccionario = "texto programa Java";

Scanner sc = new Scanner(texto);
int contador = 0;
StringBuilder textoResaltado = new StringBuilder();

while (sc.hasNext()) {
String palabra = sc.next();
if (diccionario.contains(palabra)) {
textoResaltado.append(String.format("[%s] ", palabra));
contador++;
}
else
textoResaltado.append(String.format("%s ", palabra));
}
sc.close();

System.out.println("Texto original:\n" + texto);
System.out.println("\nDiccionario: " + diccionario);
System.out.println("\nCoincidencias: " + contador);
System.out.println("Texto con coincidendias resaltadas:\n" + textoResaltado.toString());
}

}

En pantalla, tendríamos este resultado:
Citar
Texto original:
Este es un texto para probar un programa escrito en Java

Diccionario: texto programa Java

Coincidencias: 3
Texto con coincidendias resaltadas:
Este es un [texto] para probar un [programa] escrito en [Java]
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

cris0710

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 14
    • Ver Perfil
Re: Analisis lexico
« Respuesta #3 en: 05 de Marzo 2021, 18:21 »
Le hice algunas pequeñas modificaciones para adaptarlo un poco a poder introducir por pantalla.

Código: [Seleccionar]
import java.sql.*;//impota todas las librerias de mysql
import java.util.*;// importa todas las librerias de utilidad para leer en teclado
public class Palabras {

 public static void main(String[] args) {

     Scanner scn = new Scanner(System.in);
  String texto = " ";
  System.out.println("Ingresa la cadena de texto que deseas revisar");
  texto = scn.nextLine();
  Scanner sc = new Scanner(texto);
  String diccionario = "hola canada mexico";
  int contador = 0;
 


  StringBuilder textoResaltado = new StringBuilder();
 

  while (sc.hasNext()) {
   String palabra = sc.next();
   if (diccionario.contains(palabra)) {
    textoResaltado.append(String.format("[%s] ", palabra));
    contador++;
   }
   else
    textoResaltado.append(String.format("%s ", palabra));
  }
  sc.close();
 
  System.out.println("Texto original:\n" + texto);
  System.out.println("\nDiccionario: " + diccionario);
  System.out.println("\nCoincidencias: " + contador);
  System.out.println("Texto con coincidendias resaltadas:\n" + textoResaltado.toString());
 }

}

 

Esto es un laboratorio de ideas...
Aprender a programar

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".