elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección.


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (Moderadores: Novlucker, seba123neo, kub0x, Eleкtro)
| | | |-+  Division Silabas Texto
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Division Silabas Texto  (Leído 378 veces)
eRXeTe

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Division Silabas Texto
« en: 10 Febrero 2017, 08:41 »

Buenas. Me gustaría que alguien me pudiese ayudar con este tema. Necesito en código C# la división de un texto por carácteres saltando de línea. Pero en esa division se debe evitar (en la medida de lo posible) la división por sílabas. Añadiendo un -. Ejemplo:
lorem ipsum dolor sit amet consectetur adipiscing elit
Columnas: 5
 
Lorem
ipsum
dolor
sit
amet
con-
secte-
tur a-
dipis-
cing
elit
 

El código que tengo de momento es éste, esta hecho en PHP que me es más facil:

Código
  1. <?php
  2.  
  3. // Texto (Introducido por el usuario)
  4. $text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam accumsan mattis diam vitae finibus. Maecenas id sagittis arcu. Mauris ac augue turpis. Vestibulum rhoncus ultrices placerat. Proin egestas pulvinar velit, a dignissim massa convallis non. Aliquam mi neque, sagittis ac auctor porta, luctus at ligula. Donec tortor diam, consectetur eget turpis id, finibus hendrerit lacus. Vivamus tempus eros sed accumsan venenatis.";
  5.  
  6. // Número de columnas (Introducidas por el usuario)
  7. $columns = 10;
  8.  
  9. // Calcular la longitud del texto
  10. $length = strlen($text);
  11.  
  12. /**
  13. * $i - Permite ir imprimendo el caracter dentro del texto
  14. * $j - Permite controlar el salto de línea
  15. */
  16. for ($i = $j = 0; $i < $length; $i++) {
  17.                // Comprobar si hay que realizar un salto de línea
  18.                if ($j == $columns) {
  19.                               // Imprimir salto de línea
  20.                              echo $text[$i];
  21.                               echo "<br/>";
  22.                               // Reiniciar el contador para el salto de línea
  23.                               $j = 0;
  24.                               // Saltar a la siguiente iteración del bucle
  25.                               continue;
  26.                }
  27.                // El siguiente IF sustituye los espacios por guiones bajos
  28.                // para verlos mejor. Se puede quitar.
  29.                if ($text[$i] == ' ') {
  30.                               echo " ";
  31.                } else {
  32.                               // Imprimir el caracter correspondiente
  33.                               echo $text[$i];
  34.                }
  35.                // Incrementar el contador para el salto de línea
  36.                $j++;
  37. }
  38.  
  39. ?>
  40.  
Muchisimas gracias de antemano.




· Los códigos deben ir en etiquetas GeSHi
>aquí las reglas del foro
-Engel Lex


« Última modificación: 10 Febrero 2017, 11:13 por engel lex » En línea

Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.104


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Division Silabas Texto
« Respuesta #1 en: 10 Febrero 2017, 17:11 »

Hola. Primero de todo, las preguntas sobre C# van en el subforo de programación .NET.

Las reglas de divisón que quieres aplicar a las palabras de más de "X" caracteres/columnas no están claras. Aquí abajo te muestro un código de ejemplo que puedes adaptar a tus necesidades:

Código
  1. readonly string input = "Lorem ipsum dolor sit amet consectetur adipiscing elit";
  2. readonly char lfChar = '-'; // Line Feed Character Representation
  3. readonly short maxLen = 5;  // Maximum Length (not counting the line feed char)

Código
  1. StringBuilder sb = new StringBuilder(capacity: input.Length);
  2. IEnumerable<string> words = input.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); // Split entire string into words.
  3.  
  4. foreach (string word in words) {
  5.  
  6.    if ((word.Length <= maxLen)) {
  7.        sb.AppendLine(word);
  8.  
  9.    } else {
  10.        int index = 0;
  11.        while ((index < word.Length))  {
  12.            string str = word.Substring(index, Math.Min(maxLen, (word.Length - index)));
  13.            if ((str.Length == maxLen)) {
  14.                sb.AppendLine(string.Format("{0}{1}", str, lfChar));
  15.            } else {
  16.                sb.AppendLine(str);
  17.            }
  18.            index += maxLen;
  19.        }
  20.  
  21.    }
  22.  
  23. }
  24.  
  25. Console.WriteLine(sb.ToString());

Resultado de ejecución:

Lorem
ipsum
dolor
sit
amet
conse-
ctetu-
r
adipi-
scing-
elit


Saludos!


« Última modificación: 10 Febrero 2017, 17:21 por Eleкtro » En línea


NEBIRE


Desconectado Desconectado

Mensajes: 510


Ver Perfil
Re: Division Silabas Texto
« Respuesta #2 en: 10 Febrero 2017, 17:29 »

Es complicado, mucho...

...por que para partir por sílabas en castellano (de entrada da igual el lenguaje de programación que uses), lo primero que debes hacer es determinar las reglas que rigen lo que es una 'sílaba'...

A - Puedes recurrir a la gramática y empaparte de todas las reglas gramaticales, y 'programarlas' para que el programa lo entienda.
B - Puedes recurrir por fuerza bruta a construir todas las sílabas (las sílabas más largas en castellano, son la forma: "11011", donde cada 1 representa una consonante y un 0 una vocal, y un ejemplo sería: "trans", "prons", pero no "trucc" (porque es fijo que tras la última 'c', le sigue otra vocal, que rompería la sílaba por "tru" + "cc0..."). Pero con combinatoria...

1 - Es decir, primero creas todas las permutaciones de 2,3,4 y 5 letras (solo las de 5 letras serían 27^5 permutaciones distintas, algo más de 14'3millones)  
2 - Luego filtra las absurdas. Por ejemplo:
------ Descartar haya 3 o más consonantes seguidas.
------ Descartar las que tengan 3 veces seguidas una misma letra.
------ Descartar las que tengan dos veces seguidas la misma vocal.
------ Descartar las que tengan dos veces seguidas la misma consonante (excepto algunas que si se admiten, como la rr, ll).
------ Descartar...
3 - Finalmente cuando solo queden unas pocas miles que, no sea capaz de filtrar con más reglas programables, las repasas a ojo, y eliminas las que no existan. por ejemplo "mne", existe aunque parezca extraño, como en la palabra: "mnemónico". Esto es, algunas aunque te suenen raro, si eres capaz de pronunciarlas, es fijo que existen o que pueden crearse una palabras con esa sílaba (aunque sea rara, la dejas, pero si eso elevará a una cantidad demasiado grande de sílabas, quizás prefirieras excluirla)...


- En cuanto al programa, yo construiría una clase, la primera tiene la función que se invoca, recibe el texto y va cortando palabras que pasa a una función privada. Esta toma la palabra, extrae la primera sílaba, y se invoca recursivamente a sí misma, pasando como palabra el texto recibido al que se la ha extraído la sílaba hallada. La recursividad acaba cuando ya no quedan caracteres para reinvocar, en ese momento se sabe cuantas sílabas forman la palabra, entonces se dimensiona un array con ese valor y en cada retorno, se va introduciendo la silaba tomada en cada llamada, cuando finalmente devuelve el control a la función publica que llamó a la privada, aquella recibe el array con las sílabas que forman la palabra.
- Cuando la función reciba de vuelta el array con las sílabas d ela palabra, deberá poner el guión en la sílaba que proceda, y pondría el resto de la palabra en otra línea...

La parte compleja está en construir ese diccionario de sílabas (generado con combinatoria, tal vez exista ya un diccionario así que se haya publicado, l odesconozco), o bien que en tiempo real, con las reglas gramaticales, vas extrayendo, (es decir no usa ningún diccionario, se va calculando sobre la marcha)...

También tendrías que decidir que pasa con palabras que contiene números o caracteres raros, ya que las reglas gramaticales no las contemplan como palabras 'per se', como en tu alias modificado así: 3RX3T3...

Y también que pasa si hay una palabra con sílabas no contempladas... (una opción sería considerarla como otra sílaba y añadirla al diccionario, pero claro, si te topas con un texto aleatorio... podrías añadir excesivas sílabas de este tipo. De hecho esta sería una prueba adecuada para determinar si el oprograma opera bien (no solo con un texto claro).

Sobre lo de añadir el - al final de sílaba, eso es obvio, tu céntrate en 'enseñarle' a tu programa a saber qué es una silaba, o en decirle "estás son todas las sílabas quye tenemeos en español",  ...que es lo que te dará trabajo, el resto es superfluo en dificultad y tiempo...

p.d.: OJO: si se trata de otro idioma, podría no valerte, ya que cada idioma tiene sus propias sílabas, en español, no existe la sílaba "lit", como sugeriría la palabra "elit", que procede del latín..., en español es eguro que ninguna palabra acaba en lit, es seguro que la palabra se dividiera en "li" + "t0" (el 0 indica vocal). Luego, si es el caso de tener que admitir otros idiomas, quizás las reglas gramaticales no sean la opción adecuada y debas recurrrir si o si, a la combinatoria, para obtener un diccionario de sílabas. En tal caso, sería acertado meterlas en una tabla hash, para un rápido acceso en las búsquedas. Incluso en combinatoria, tendrás que añadir ciertas reglas 'gramaticales' (pero ya de tu programa), como que no hay sílabas mayores de 5 letras... etc...
« Última modificación: 10 Febrero 2017, 17:57 por NEBIRE » En línea

Eleкtro
Novato Astral y
Moderador Global
***
Desconectado Desconectado

Mensajes: 9.104


El sentido común es el menos común de los sentidos


Ver Perfil
Re: Division Silabas Texto
« Respuesta #3 en: 10 Febrero 2017, 18:06 »

para partir por sílabas en castellano, lo primero que debes hacer es determinar las reglas que rigen lo que es una 'sílaba'...

El usuario no se sabe realmente lo que quiere, por que ha dicho EVITAR partir por sílabas, pero en el ejemplo hay sílabas, y aparte luego está tur a- que incluye un espacio en blanco no sé con qué lógica usada, cuando sit y amet las separa del todo en el ejemplo. Para mi no está nada claro.

De todas formas logicamente llevas mucha razón en eso que has dicho, construir las reglas de distinción de una sílaba para instruir al algoritmo sería algo necesario, tanto para partir la cadena de texto por sílabas, como para evitar partirla por sílabas. Es algo de locos.



Es complicado, mucho...

La parte compleja está en construir ese diccionario de sílabas

Complicado no, lo siguiente. Es que sinceramente, desde el primer momento no merece la pena ni intentarlo. Construir un diccionario/base de datos de palabras con sus sílabas marcadas/delimitadas necesitaría un esfuerzo casi inhumano, ¿y todo para qué?, si el algoritmo seguirá estando condenado a la imperfección y a una refactorización constante. En mi opinión creo que el usuario no se debería comer demasiado la cabeza preocupándose por ese aspecto en concreto. Tampoco ha explicado que motivos le llevan a querer partir por sílabas (o evitar partir por sílabas, como sea) y quizás si supieramos eso se le podría sugerir una solución adaptada a sus necesidades.

Pero si la intención del usuario realmente es partir una cadena de texto distinguiendo las silabas (del castellano), entonces veo bastante complejo perfeccionar un algoritmo (sin diccionario) hasta el punto que sea capaz de sacar las silabas correctas de palabras como salchicha, menstrual, pedigüeñería, pingüino, murciélago u oíamos (por decir algunas aleatorias, pero seguro que hay palabras con mucha mayor complejidad léxica-programática en el Castellano, jeje). Es algo inviable por tiempo y esfuerzo si no existe una motivación profesional y económica detrás de este proyecto.

Saludos!
« Última modificación: 10 Febrero 2017, 18:18 por Eleкtro » En línea


NEBIRE


Desconectado Desconectado

Mensajes: 510


Ver Perfil
Re: Division Silabas Texto
« Respuesta #4 en: 10 Febrero 2017, 18:30 »

Exacto... Desde el momento que pide cortar sílabas, parece querer indicar que quiere cortar sílabas tal y como es en español, y se supone que para mostrar textos correctamente cortados, por sílabas y no entre medias. Sin embargo, al poner luego un texto en latín, ya hay una contradición, aunque quizás sea una ocurrencia de ejemplo de última hora, y que no ha caído en cuenta, lo nefasto que deja entonces, el texto de ejemplo, su cuestión.

En cualquier caso, es muy complejo separar los textos en sílabas correctamente, por contra, hacerlo en palabras  :silbar: es extremadamente  :silbar: fácil  :silbar: ...
...luego si quiere perder tiempo, en algo que nadie va a agradecerle nunca lo suficiente es esfuerzo empleado...  ::)
« Última modificación: 10 Febrero 2017, 18:33 por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
division de HDD
Dudas Generales
peib0l 4 914 Último mensaje 3 Noviembre 2006, 23:16
por i686
Seperar en silabas
Programación Visual Basic
<[(x)]> 3 5,811 Último mensaje 8 Diciembre 2009, 06:45
por MCKSys Argentina
problema con busqueda de silabas ( letra mayuscula) « 1 2 »
Programación C/C++
manutmac 10 1,892 Último mensaje 14 Noviembre 2012, 16:09
por rir3760
¿En ingles se puede separar las palabras en silabas?
Foro Libre
bacanzito 2 726 Último mensaje 6 Agosto 2014, 11:40
por ivancea96
MOVIDO: Division Silabas Texto
Programación General
Eleкtro 0 124 Último mensaje 10 Febrero 2017, 17:11
por Eleкtro
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines