Shell   29-06-2023, 13:06
#1
Buenas!.

Es un ejercicio que estoy haciendo. No es sencillo, se necesitan distintas condiciones.
Estoy comenzando por la primera condición.

"La palabra comienza por consonante".

Por ahora me encuentro el problema que la palabra acabe en consonante.

He añadido al array de vocales, las vocales con tildes, pero creo que estos elementos se pueden evitar.  ( Añadirlos es más fácil ).
La idea es que funcione por ahora la primera condición.

Código:
Private vocales As String[] = ["a", "e", "i", "o", "u", "á", "é", "í", "ó", "ú"]
Private consonantes As String[] = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "ñ", "p", "q", "r", "s", "t", "v", "w", "y", "z"]

Public Sub Main()

  'Condición 1. Consonante al comienzo de la palabra
  'No se comtempla aún que exista al final de la palabra una consonante

  'Descomponer("casa")
  'Descomponer("colibrí")
  Descomponer("frigorífico")

  'Aquí fallaría
  'Descomponer("neveras")

End

Public Sub Descomponer(palabra As String)

  Dim lugar As Integer
  Dim subcadena As String

  While String.Len(palabra) > 1
    subcadena = ConsonanteAlPrincipio(palabra)
    Print subcadena

    'Para obtener el lugar hasta donde llega la subcadena:
    'Encuentro el comienzo de la subcadena dentro de la cadena palabra y le añado el tamaño de la longitud de la subcadena menos una posición
    'No existe una posición cero, las cadenas comienzan desde 1

    lugar = String.RInStr(palabra, subcadena) + String.Len(subcadena) - 1

    'Eliminamos de la palabra, la subcadena que se encuentra en el lugar más una posición
    'Creando una palabra nueva, lo que queda de la palabra original
    palabra = String.Mid(palabra, lugar + 1)
  Wend

End

Public Function ConsonanteAlPrincipio(cadena As String) As String

  Dim palabra As String
  Dim x As Integer
  Dim encuentraconsonante As Boolean
  Dim encuentravocal As Boolean

  palabra = ""
  x = 1

  While Not encuentraconsonante Or Not encuentravocal And x <= String.Len(cadena)

    'Primero encontrar la consonante
    If consonantes.Find(String.Mid(cadena, x, 1)) <> -1 Then
      encuentraconsonante = True
      palabra &= String.Mid(cadena, x, 1)
    Endif

    'Si encontramos la consonante, podemos buscar la vocal
    If encuentraconsonante Then
      If vocales.Find(String.Mid(cadena, x, 1)) <> -1 Then
        encuentravocal = True
        palabra &= String.Mid(cadena, x, 1)
      Endif
    Endif
    Inc x

  Wend

  Return palabra

End

¿ Cómo haríais para solventar el problema de la consonante al final ?. ( Lo sé, seguro que después encuentro la solución ).  Angel

Saludos
Última modificación: 29-06-2023, 14:22 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   29-06-2023, 14:21
#2
Parece que ahora funciona mejor.

La función  ConsonanteAlPrincipio, me ha quedado así:

Código:
Public Function ConsonanteAlPrincipio(cadena As String) As String

  Dim palabra As String
  Dim x As Integer
  Dim encuentraconsonante As Boolean
  Dim encuentravocal As Boolean
  Dim incremento As Integer

  palabra = ""
  x = 1
  incremento = 1

  While Not encuentraconsonante Or Not encuentravocal And x <= String.Len(cadena)

    'Primero encontrar la consonante
    If consonantes.Find(String.Mid(cadena, x, 1)) <> -1 Then
      encuentraconsonante = True
      palabra &= String.Mid(cadena, x, 1)
    Endif

    'Si encontramos la consonante, podemos buscar la vocal
    If encuentraconsonante Then
      If vocales.Find(String.Mid(cadena, x, 1)) <> -1 Then
        encuentravocal = True
        palabra &= String.Mid(cadena, x, 1)
        'Comprobar si sumando una posición llegamos al tamaño de la cadena
        If x + 1 = String.Len(cadena) Then
          'Se tiene que añadir la consonante que queda en la última posición de la cadena
          palabra &= String.Mid(cadena, x + 1, 1)
          'Cambiamos el valor del incremento en 2
          incremento = 2
        Endif
      Endif
    Endif
    x += incremento
  Wend

  Return palabra

End

Lógicamente no he optimizado el ejemplo Rolleyes
Y que le faltan otras condiciones, naturalmente.

Saludos
Archivos adjuntos
.gz
DescomponerSilabas-0.0.3.tar.gz (Tamaño: 12.47 KB Descargas: 0)
Última modificación: 29-06-2023, 14:28 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
guizans   29-06-2023, 19:58
#3
Hace algún tiempo que desarrollé una librería en Gambas para descomponer las palabras en sílabas. No me preguntes mucho como funciona, como siempre no comenté el código y sinceramente no tengo ni puta idea de lo que hace cada cosa. También es verdad que lo que hice fue traducir literalmente una biblioteca, que no me acuerdo como se llama, de Python a Gambas, sin pararme a optimizar ni nada por el estilo. En principio debería funcionar sin problemas. Échale un ojo a ver si te sirve y si realmente funciona.

Un saludo.
Archivos adjuntos
.gz
gbsilabeador-code-1.0.tar.gz (Tamaño: 13.69 KB Descargas: 1)
Shell   29-06-2023, 22:20
#4
Pruebo y te comento. Gracias.

Encontré un error aquí.  He comentado la linea errónea.

Código:
Public Function silabaTonica(palabra As String) As String ''Retorna la sílaba tónica de una palabra
 
  Dim sil As New String[]
  Dim toni As Integer
 
  sil = silabeame(palabra)
  toni = miTonica(sil)
 
  'Return sil[sil.Count + toni]
  Return sil[sil.Max + toni]
 
End

Y funciona bien. Hasta lo que he visto. Wink

Pues debe tener algo más. Si va con .Count con unas palabras y con .Max con otras.
He probado con la palabra "soldado" y con .Count falla y he probado con "árbol" y necesita .Count, así que debe haber algo más.
Última modificación: 29-06-2023, 23:16 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   30-06-2023, 11:21
#5
He bajado con pip3 la fuente del proyecto. Para ver como es el código original y como va.

Ya que directamente bajar la fuente desde github e intentar usar la clase, da problema por el tema de paquetes.
Pero no acaba ahí la cosa.

En Linux Mint Mate 20.3 se usa por defecto Python 3.8.10 y el proyecto requiere la 3.9.
Este método .removesuffix() no existe en la clase str en la versión 3.8.10

Opinión personal. El desarrollador "pudo" crear un método propio y ser independiente de los métodos que incluye cada versión.
Lo que demuestra en parte:

- El método puede ser complicado a la hora de crearlo por si mismo.
- Utilizó algo que ya estaba precocinado. Aprovechó lo que tenía.
- Los desarrolladores "parece" que somos muy "comodones". Sad

Eso desde luego es un problema. La creatividad en parte se anula. Y usamos una caja negra y todos contentos.
Como funciona a mi plin, yo duermo con Pikolin.

Ni te digo ya que la versión de Python va ya por la 3.11. ( La estable ).
Y eso de subir de versión no me acaba de agradar ( si no lo rompe todo ) o tienes que estar usando otras tácticas.
Que por lo general es lo que se usa. ( Falta de costumbre ).

A cada versión de la distro, versión nueva de Python. Siempre actualiza dentro de la que tienes. En mi caso 3.8.X

Tuviste que complicarte bastante para llevarlo a Gambas. Es que no parece un código sencillo. Ya en Python es lioso.
Tuviste que reinventar.

Otra función que he cambiado es esta:

Código:
Private Function contiene2(lis As String[], pala As String) As Boolean
 
  'Dim devolver As Boolean = False
  Dim letras As New String[]
 
  For a As Integer = 1 To String.Len(pala)
    letras.Add(String.Mid(pala, a, 1))
  Next
 
  For Each j As String In letras
    If lis.Exist(j) Then
      'Siempre va a devolver True
      'devolver = True
      Return True
    Endif
  Next
  'Siempre va a devolver False
  'Return devolver
  Return False
 
End

Me ha funcionado igual.

Saludos
Última modificación: 30-06-2023, 11:21 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Grandamakulo   30-06-2023, 18:04
#6
Con el módulo PCRE se pueden añadir REGEXP a Gambas3 con cierta limitaciones. Aquí aporto mi contador de sílabas —se puede usar como «silabador» fácilmente—. Espero que sea de ayuda:
Código:
  ' **** Estadísiticas de un texto.
  ' <<<< Devuelve una matriz de enteros:
  '       [0]: Número de palabras
  '       [1]: Número de tipos
  '       [2]: Número de caracteres
  '       [3]: Perspicuidad de Szgrizt 1993
  ' >>>> Texto plano para obtener estadísticas.
  '
  '' ╔═════════════════════════════════════════════════════════════╗
  '' ║ Atención: PCRE sólo admite texto ASCII extendido, no UTF-8. ║
  '' ║            Los valores obtenidos son aproximados.           ║
  '' ╚═════════════════════════════════════════════════════════════╝

  Dim iPaso As New Integer[4]     ' Variable de paso para almacenar resultados
  Dim sEse As String              ' Cadena de trabajo
  Dim iPal As Integer             ' Nº Palabras para cálculo perspicuidad
  Dim iSil As Integer             ' Nº Sílabas   "    "
  Dim iLet As Integer             ' Nº Letras    "    "
  Dim iFrs As Integer             ' Nº Frases    "    "
  Dim SCAM As String = Chr(7)     ' El símbolo «campanita» que ya no se usa

  ' Si no hay texto, no hay resultados
  If Not Texto Then Return [0, 0, 0, 0]

  ' Palabras
  sEse = RegExp.Replace(Texto, "([A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9])[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]*", SCAM, RegExp.Greedy)
  iPal = Split(sEse, SCAM).Max
  iPaso[0] = iPal

  ' Tipos
  sEse = RegExp.Replace(Texto, ".", SCAM, RegExp.Greedy)
  iPaso[1] = Split(sEse, SCAM).Max

  ' Caracteres
  sEse = RegExp.Replace(Texto, "\\S", SCAM, RegExp.Greedy)
  iPaso[2] = Split(sEse, SCAM).Max

  ' Sílabas
  sEse = RegExp.Replace(Texto, "[aeo]h[iu]|[iu]h[aeo]|[aeo][iu]|[aeo][y]|[y]|[íú]|[iu][^aeo]|[aeo]|[áéíóú]|[q|g]ui[aeo]", SCAM, RegExp.Greedy + RegExp.Caseless)
  iSil = Split(sEse, SCAM).Max

  ' Letras
  sEse = RegExp.Replace(Texto, "[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]", SCAM, RegExp.Greedy)
  iLet = Split(sEse, SCAM).Max

  ' Frases
  sEse = RegExp.Replace(Texto, "[.?!][^.?!]", SCAM, RegExp.Greedy)
  iFrs = Split(sEse, SCAM).Max

  ' Perspicuidad
  If iPal > 0 And iFrs > 0 Then
    iPaso[3] = 206.835 - 62.3 * iSil / iPal - iPal / iFrs
  Else
    iPaso[3] = 0
  Endif

  Return iPaso

End

Por si acaso el código es un poco espeso —soy yo XP—, el patrón de «silabación» para castellano es:

[aeo]h[iu]|[iu]h[aeo]|[aeo][iu]|[aeo][y]|[y]|[íú]|[iu][^aeo]|[aeo]|[áéíóú]|[q|g]ui[aeo]

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
guizans   02-07-2023, 20:20
#7
La verdad es que si me que me costó "traducir" de Python a Gambas. Pensé que lo había probado todo pero por lo que veo me quedó algo en el tintero. El código es muy lioso y no tengo ni idea de lo que hace cada cosa. En el proyecto original tampoco está comentado, por lo tanto me he dedicado a traducir el proyecto, no a estudiar lo que hace y como lo hace.
 Me alegro que haya servido para algo.

Un saludo.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.