Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Projeto de idioma com python

Olá, antes de explicar certinho o projeto que estou desenvolvendo, quero dar um pequeno preambulo: sou um grande fã do escritor J. R. R. Tolkien (escritor de senhor dos anéis, o Hobbit e outros), uma coisa onipresente na ora de Tolkien são as raças diversas e seus idiomas próprios, já que o escritor também era um grande estudioso e professor de idiomas/línguas. Tolkien amava tanto a linguística que chegou a criar seus próprios idiomas e usar em seus textos, o que me fascina! Também adoro jogos de enigmas, que em quase todos há a presença de códigos diferentes e tipos de cifras para poder descifrar os enigmas, césar, Hex, ASCII, binário, vigenere... E o que essas coisas tem em comum? (pelo menos na minha cabeça). Sempre quis criar meu próprio idioma com Tolkien e agora que comecei a entrar no mundo da programação as noções de código e automação de funções se fundiram e comecei a criar um processo para me facilitar a criação de meu idioma(ou proto-cifra...)

O problema do modo cifra: Quero que o idioma tenha caracteres diferentes desses que usamos normalmente (que você está lendo), mas não quero fazer um simples "troca, troca" como em código L33T, que simplesmente troca letras por números que se parecem. ("ALURA É MASSA" vira "4lur4 3 m4554") Quero traduções mesmo, assim como "book" é uma palavra inglesa que pode se traduzir para "livro", quero por exemplo que "alubix" possa ser traduzido para "livro", e não que "alubix" seja simplesmente "livro" codificado.

(Vou usar ASCII como exemplo pela proximidade que o código tem com o que estou fazendo) O ASCII é um código numérico que representa os caracteres, usando uma escala decimal de 0 a 127. Esses números decimais são então convertidos pelo computador para binários e ele processa seu comando. Por exemplo: "A" em ASCII corresponde a "065" (que também é "01000001" em binário). Assim com o tradutor de ASCII funciona associando um número a uma letra, quero criar um programa que associe números, mas não a letras, e sim a silabas, o que, vai ajudar a solucionar o problema do modo cifra, dando uma impressão maior de tradução ao invés de codificação.

Até agora trabalhei me baseando no português, o que é quase uma sentença de morte, já que na nossa língua não há apenas silabas simples com "ba, be, bi, bo, bu" também há silabas complexas como "pra, pre, pri, pro, pru" o que cria a necessidade de uma tabela gigantesca de informações para algo simples como escrever "con, di, cio, na, dor". Comecei criando uma função para criar a lista de todas as silabas com:

class Cria_Silabas():
    def __init__(self):
        self.vogais = ['','a','b'...]
        # listo todas as letras do alfabeto, junto de um espaço vazio.

    def listar_silabas(self):
        lista_silabas = []
        for vogais in self.vogais:
            for vogais2 in self.vogais:
                for vogais3 in self.vogais:
                    lista_silabas.append(vogais + vogais2 + vogais3)
        #uso 3 "for" um dentro do outro para criar uma lista com todas as combinações possíveis de 3 letras, o espaço vazio é importante para criar silabas simples como "ba", e letras soltas como "a" que na separação silábica as vezes aparecem separada das demais.

        lista_silabas = set(lista_silabas)
        lista_silabas = list(lista_silabas)
        return lista_silabas
        #transformo a lista_silabas em uma sequência "set" para eliminar os elementos iguais e depois o volto para uma lista, já que vou ter de mexer com ela (ou seu retorno).

Esse método funciona, mas tem problemas, o primeiro e mais importante é que ele gera muita informação simplesmente inútil, já que dando um "len(lista_silabas)" ele retorna que há nessa lista 20440 elementos, e um deles é, por exemplo: "xkq" que, sinceramente eu acho improvável essa silaba aparecer em alguma palavra.

E em outra classe eu uso:

    def codifica(self, palavra):

        palavra_lista = palavra
        palavra_numerica = []

        for silaba in palavra:
            palavra_numerica.append(self.lista.index(silaba))

        print(palavra_numerica)
        #aqui eu transformo o parâmetro "palavra" (que deve ser colocado com as silabas separadas) em um conjunto numérico que equivale a aquelas silabas.

    def decodifica(self, codigo):

        codigo_lista = codigo
        palavra = []

        for numero in codigo:
            palavra.append(self.lista[numero])

        print(palavra)
        #aqui faço o inverso, ele recebe números (posições na lista) e retorna as silabas equivalentes

Bem, até agora o projeto tem vários problemas e está longe de sua conclusão, compartilho aqui para caso alguém tenha alguma dica para os próximos passos. Do que consigo ver, preciso de um leitor de arquivos que separe cada palavra, separe sua silabas e me retorne o texto em código daquela tabela, para depois eu poder associar os números a símbolos e dizer que está fundado um novo idioma (ou proto idioma em código). O que acham?

3 respostas

Aqui o inicio da função que deve traduzir o texto do arquivo "texto.txt" para números equivalentes a suas silabas na tabela gerada. Depois devo achar algum jeito de selecionar cada palavra que o "Split()" isolou para poder separar suas silabas e passar isso da função codifica. (Não, ainda não sei como vou fazer isso, aceito ajuda) após passar no codifica, devo usar outra função para transformar os números em algarismos desse idioma ainda sem nome. como os números são simples de 0 a 9, imagino que só precise de 10 hieroglifos. para por exemplo Ota, vi ano, nos números da tabela são 14151, 8033, 16700, assim transformar esses números em algorismos ou algo assim. Enfim, devaneios de um adolescente brincando com Python.

def tradutor(self):
        with open('texto.txt', "r", encoding="utf-8") as arquivo:
            texto = arquivo.read()
            palavras = texto.split()
            print(palavras)
solução!

Olá, Francisco! Tudo bom?

Desculpe pela demora em obter um retorno.

Meus parabéns pela ideia de projeto, é sensacional quando conseguimos aliar duas áreas de conhecimento que estão inseridas no seu contexto de estudo.

Sobre o código, temos algumas coisas a considerar para explicar o funcionamento desse processo de tradução:

O que nós temos:

  • O código gera sim, todas as combinações possíveis com três caracteres (ex: [aaa, abc, tre, dra, pro, ...]), as sílabas de 2 caracteres (ex: [xy, ac, da, bb, ef, …]) e também os caracteres solitários de 1 dígito (ex: [a, b, x, f, …]).

O que ainda precisamos:

  • No código, nós ainda não possuímos uma função que divide as sílabas dentro de cada palavra. Para isso nós precisaríamos entender como poderíamos dividir cada palavra.

Por exemplo, a palavra “policial”. Podemos, segundo aspectos semelhantes da língua portuguesa, dividir de algumas formas, exemplo: “po-li-cial”, “po-li-ci-al”, “pol-i-ci-al”, “pol-i-cial”, etc (E isso não reflete no mau uso da língua, mas sim de casos semelhantes que ocorrem em várias palavras, e nós ainda não somos regrados pela sintaxe, estamos trabalhando no obedecimento dela). E para prosseguir com essa divisão, nós deveríamos conhecer a família dessa palavra e após isso decidir qual seria correta. Ou então, também podemos consultar um documento que já nos dá um caminho de como foi estruturada a língua.

  • A forma como estamos percorrendo o laço ainda está passando sobre aqueles valores de 1 dígito também que existem dentro de cada palavra, então existe uma sublista de valores [a, b, c, f, g, x, y, z, …] que estão com apenas 1 caractere. E nós ainda não conseguimos evoluir para uma busca maior sobre cada sílaba. Mas isso também decorre de que há realmente sílabas com 1 caractere na língua portuguesa, como é o caso dos hiatos.

Também existem outros aspectos para analisar, mas isso decorre da complexidade da língua, mas ainda assim, com certeza esse é um trabalho para executar com programação.

E esse campo de estudo é uma área muito interessante dentro do ramo de Ciência de Dados, e dá origem a uma sub-área chamada Processando de Linguagem Natural (PLN, ou do inglês, Natural Language Processing, NLP). E no Brasil, existem projetos como esse Corpus, que é um conjunto de dados que faz a catalogação de algumas palavras em português e avaliam a sua estrutura.

E aqui na Alura nós temos um artigo sobre O que é Processamento de Linguagem Natural, e também a Formação Técnicas de processamento de linguagem natural que também vai te ajudar a conhecer essa área.

Se ainda tiver alguma dúvida, estou por aqui. Ótimos estudos e grande abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Eu de verdade não achi que alguém fosse responder esse tópico hahah. Já marquei como solucionado, mas prossegui bastante em estágios se comparado a última atualização. Vou tentar não repetir o que já mostrei em outros posts, mostrando apenas as novas adições.

  • Separação de palavras: Busquei o modo mais simples para separar as palavras, conjuntos de duas letras, "alfaiate" vira "al", "fa", "ia", "te". Por dois motivos; a lista de silabas fica menor, já que estou trabalhando com conjuntos de duas letras, ignorando as silabas de três letras, mas ainda tratando de letras solitárias pois no processo de criação da lista de codificação pus um espaço vazio. O segundo motivo é que tudo fica mais fácil no geral, desde o programa adiante que separa as silabas até as codificações que mostrei em outro post.

      #Recebe uma palavra e retorna uma lista com seus elementos em pares.
      def separa(self, palavra_separar):
    
          palavra = palavra_separar[::2]
          copia_palavra = palavra_separar[1::2]
    
          palavra_separada_tupla = list(zip(palavra, copia_palavra))
          palavra_separada = []
          for conjunto in palavra_separada_tupla:
              letra_adicionar = ''
              for letra in conjunto:
                  letra_adicionar += letra
                  if len(letra_adicionar) == 2:
                      palavra_separada.append(letra_adicionar)

    Sendo especifico, transformo a palavra dada como parâmetro em duas listas, uma que percorro normalmente, mas com passo dois (pulado uma letra), e a segunda lista, começando do segundo elemento, também com passo dois, de modo que: ao pegar os elementos de mesma posição nas listas e adicioná-los como um elemento de par a uma outra lista, ela se organize como a palavra dada em parâmetro, só que, separada de 2 em 2.

  • Tradução de textos: De modo que essa função retorne uma lista para dar de parâmetro da função "codifica" já mostrada aqui. Isso faz que, palavra a palavra um texto possa ser traduzido para uma lista numérica que mais tarde associarei esses a símbolos próprios, dando finalmente a cara de idioma. Só que assim ainda está muito manual, minha última empreitada (mostrei o inicio mas ainda não é funcional) é uma função que receba um arquivo de texto, e retorne outro arquivo com todas as palavras transcritas na minha lista numérica. Isso usando diversas vezes as funções de separar e codificar. Para depois de tudo isso, fazer outra função que associa os valores de números a imagens e gera por fim os textos deste idioma sem nome.

até agora a função de tradução de texto(incompleta):

    # Tem a intenção de pegar o texto de um arquivo e retorná-lo em números.
    def traduz(self):
        with open('texto.txt', "r", encoding="utf-8") as arquivo:
            texto = arquivo.read()
            texto_separado = texto.split()
            codigo = []
            for palavra in texto_separado:
                for letra in palavra:
                    codigo.append(self.codifica(letra))
            print(codigo)

Por enquanto é um projeto adormecido, mas sempre que tiver novas funcionalidades posso compartilhar por aqui.