Aliteração, dígrafos, fonemas..

A aliteração foi a figura de linguagem escolhida para iniciar as implementações.
Uma novidade técnica é que foi agregado ao GitHub o Codacy para fazer a validação do código-fonte e validar se precisa ser melhorado ou não, garantindo a qualidade do código. A cada commit efetuado é verificado se o código pode ser refinado ou não.

Em relação a figura de linguagem aliteração, na postagem anterior foi dada uma definição para ela, a qual segue abaixo:

“Aliteração é uma figura de linguagem que consiste na repetição de sons de consoantes iguais ou semelhantes. Ocorre geralmente, no início das palavras, que compõem versos ou frases, mas pode estar também no meio ou no fim.” [1]

Como ela é uma repetição de sons, deverão ser analisadas as unidades mínimas de som de cada palavra, ou seja, os fonemas. Geralmente uma letra está associada a um som, mas não é sempre assim que acontece, existem vezes que na língua portuguesa uma letra se refere a um som, e outras vezes, variando de acordo com as letras ao seu redor, o som para representar essa mesma letra muda. Como é o caso da letra C, que pode ter o som do fonema /k/, como nas palavras: casa, carta e correio, como também pode ter som do fonema /s/ como em cebola, cínico e centrado.

“Fonema e Letra representam respetivamente sons (fala) e sinais gráficos (escrita).
Os fonemas são as unidades sonoras que compõem o discurso ou a fala e são representados entre barras oblíquas.
As letras, por sua vez, são os sinais gráficos que tornam possível a escrita.” [2]

a – letra
/a/ – representação do som da letra a (fonema de a)

c – letra
casa (com fonema /k/)
cebola (com fonema /s/)

Visto que para cada letra pode haver mais de um som, vê-se necessário fazer duas outras atividades: um mapeamento das regras que levam a decidir qual som deve-se utilizar para uma letra específica quando for encontrada numa palavra; e listar os fonemas utilizados na língua portuguesa com quais letras que estão relacionadas a cada um deles.

/s/ – fonema
cenoura (com a letra c)
sensível (coma  letra s)
excêntrico (com o dígrafo xc)

Além de uma letra poder ter mais de um som, acontece também de um som (fonema) poder ser representado por mais de uma letra, e ainda a situação dos dígrafos, que são duas letras juntas que se referenciam a um som apenas, como é o caso de CH em chave,
chapéu, RR em carroça, carreta, QU em queijo, queratina, etc.

“Os dígrafos ocorrem quando duas letras são usadas para representar um único fonema, ou seja, uma única emissão de som.” [3]

Tendo em vista que a aliteração se baseia  nos sons de cada palavra (e na repetição desses sons), e que cada letra ou um conjunto de letras representa um fonema, para se ter os fonemas a se comparar na análise de um verso é preciso primeiro transcrever a palavra de sua forma escrita, para a forma fonética. Para isso vou usar a notação entre barras oblíquas: /símbolo/.
Existem outras formas de representar o alfabeto fonético, mas por uma questão técnica e de praticidade (algumas letras são do alfabeto grego, como lambda, épsilon, e etc, e seu código não é facilmente reproduzível pelo teclado, apesar de existir na codificação UTF-8).

Mais abaixo está uma listagem dos fonemas da língua portuguesa com palavras de exemplo. São 12 fonemas vocálicos e 19 fonemas consonantais, além do som das semi-vogais. Toda vez que for escrito o símbolo /s/, não estarei me referindo a letra S, mas sim ao som representado. Esse mesmo som pode ocorrer também com a letras C, como em cebola e cenoura e com o dígrafo XC, como em excelente e excepcional.

vogais
/a/ – pá, para, paraquedas, jaca, metade
/ã/ – cama, anta, divã, tanto, santo, rã
/é/ (letra grega Epsilon minúsculo) – ferro, festa, café, leve
/e/ – medo, dedo, desastre, depois, treme, pelo
/~e/ – vento, tempo,  sento, alimento, instrumento, dentro
/i/ – ilha, idiota, inegável
/~i/ – instrumento, pingo, índio, instalar
/ó/ (símbolo é o c ao contrário) – avó, pó, sola, morte, corte, solo, óleo
/ô/ – avô, soma, moradia, morto, boca, cone
/õ/ – conta, põe, trompa, tronco, tombo
/u/ – fuga, fumaça, rumo, gula
/~u/ – unha, punho, fundo, muito

semi-vogais
/y/ – pai, mãe, cai
/w/ – mau, cão, viu, meu, céu, água, mágoa

consoantes
/b/ – bola, bato, bêbado, barco
/d/ – dado, dardo, distante, adido
/f/ – faca, alfafa, farelo
/g/ – gute, gato, artigo
/g/ – guilhotina
/j/ – jiboia, jabuticaba, janela, jeito
/k/ – casa, campo, cópia, covarde, cura, cnidário, cancro
/k/ – quando, quase, quociente, quotidiano, frequente
/k/ – queijo, arqueiro, aquele, quiabo, quitanda
/l/ – falar, calar, lamber, lima, listra
/lh/ (letra grega Lambda minúscula) – lhama, ilha, olhar, telha, molhado
/m/ – maca, monstro, misto, muito
/n/ – nada, nata, notívago, noite
/ñ/ ou /nh/ –  enfadonho, aranha, manha, ninho
/p/ – pato, parto, pacto, porta
/r/ – barato, arara, caroço, barato
/R/ – raiz, rato, repolho, ronco
/R/ – carroça, derrapagem, carro
/s/ – seta
/s/ – cebola, cético, centro, cínico
/s/ – espesso, essa, esse
/s/ – excesso, excelente, excedente
/s/ – açúcar, aço, faço, apareça
/s/ – desça, cresça
/s/ – auxílio, sintaxe
/s/ – asceta
/t/ – tato, torto, também
/v/ – velha, veia
/x/ – xícara, xarope, xereta
/x/ – chuva, chumbo, chave
/z/ – azeite, zênite, zebra, zinco, azar
/z/ – casa, asilo
/z/ – exato, existência

Exemplos de transcrição dos fonemas de algumas palavra
casa – /k/ /a/ /z/ /a/
exatidão
– /e/ /z/ /a/ /t/ /i/ /d/ /ã/ /w/
excelente – /e/ /s/ /e/ /l/ /~e/ /t/ /e/
cebola – /s/ /e/ /b/ /o/ /l/ /a/
jiboia – /j/ /i/ /b/ /o/ /y/ /a/
gelo – /j/ /e/ /l/ /o/
queixo – /k/ /e/ /y/ /x/ /o/

Referências
[1] http://www.figuradelinguagem.com/aliteracao/
[2] https://www.todamateria.com.br/fonema-e-letra/
[3] http://portugues.uol.com.br/gramatica/digrafos.html
[4] https://en.wikipedia.org/wiki/Help:Entering_special_characters#Windows_-_Alt_code

Versificação e figuras de linguagem

Anteriormente foi implementado o reconhecimento da quantidade de sílabas poéticas de um verso. Para conseguir isso foi preciso primeiro realizar a separação silábica de cada palavra, depois encontrar as elisões, e então contar a quantidade de sílabas até a última sílaba tônica do verso.

“Elisão: quando em um verso uma palavra terminar por vogal átona e a palavra seguinte começar por vogal ou H (que não tem som, portanto não é fonema, mas uma simples letra) unem-se as duas sílabas numa só.” [5]

Porém algumas palavras ainda se encontram incorretas e precisam que suas regras sejam revistas no algoritmo, um trabalho que o tempo vai trazer. Contudo isso não impede um resultado positivo na escansão do verso.

“Um dos fatores mais importantes ao analisar um poema é a contagem de sílabas poéticas. A essa prática, dá-se o nome de escansão.” [1]

Qualquer palavra encontrada com problema em sua separação pode ser comunicada, e será muito bem vinda sua contribuição para a evolução do sistema. Os ajustes finos vem com o tempo, não há pressa.

A escansão do verso foi a primeira etapa do módulo de versificação do camus, em seguida será feito o reconhecimento de algumas figuras de linguagem. Foram escolhidas três figuras para iniciar esse processo de reconhecimento: a aliteração, a anáfora e a antítese.

Aliteração

“Aliteração é uma figura de linguagem que consiste na repetição de sons de consoantes iguais ou semelhantes. Ocorre geralmente, no início das palavras, que compõem versos ou frases, mas pode estar também no meio ou no fim.” [3]

Com a aliteração se focará na identificação de consoantes e encontros consonantais nas palavras que representem o mesmo som, tendo o mesmo fonema. Ela pertence ao conjunto das figuras de linguagem fonéticas, mas será feita uma análise pelas letras (sozinhas ou acompanhadas) que representem fonemas. Exemplo: as letras S, Z e X tem o mesmo fonema (de /z/) nas palavras: Casa, zero e exame. Enquanto as letras CH e X tem som de /x/ nas palavras: Chaveiro e enxame

Exemplo:

“Vozes veladas, veludosas vozes,
Volúpias dos violões, vozes veladas,
Vagam nos velhos vórtices velozes” [7]

Anáfora

“A anáfora é caracterizada pela repetição de uma ou mais palavras no início de versos, orações ou períodos. Muito utilizada na poesia e na música, a anáfora aumenta a expressividade da mensagem, enfatizando o sentido de termos repetidos consecutivamente.” [4]

Na anáfora será feita uma análise nas palavras ou expressões que se repetem na frase, de forma a seguirem um padrão na sintaxe do verso. Em resumo, palavras que ocorram repetidamente como sendo as primeiras ou últimas de cada verso ou frase.

Exemplo:

“…
E quem me ofende, humilhando, pisando,
Pensando que eu vou aturar…
Tô me guardando pra quando o carnaval chegar
E quem me vê apanhando da vida,
Duvida que eu vá revidar…
Tô me guardando pra quando o carnaval chegar
… ” [6]

Antítese

“Consiste na utilização de dois termos que contrastam entre si. Ocorre quando há uma aproximação de palavras ou expressões de sentidos opostos. O contraste que se estabelece serve, essencialmente, para dar uma ênfase aos conceitos envolvidos que não se conseguiria com a exposição isolada dos mesmos.” [2]

Com a antítese será preciso fazer uma análise utilizando o conhecimento de opostos, palavras que são antônimas ou que tenham uma ideia contrária a outra, com isso será feita uma análise com um certo grau de semântica no texto, pois utilizará de informações e conceitos externos da estrutura sintática da frase.

Exemplo:

“Os bares estão cheios de almas tão vazias” [8]

 

Essas três foram as escolhidas para iniciar esse processo, podendo abrir espaço para num momento posterior explorar outras figuras de linguagem com um tratamento semântico mais complexo, tais como o paradoxo e a metáfora.

Referências
[1] http://especialmente.com.br/arte/poesia/escansao/
[2] http://www.soportugues.com.br/secoes/estil/estil5.php
[3] http://www.figuradelinguagem.com/aliteracao/
[4] https://www.normaculta.com.br/anafora/
[5] http://www.recantodasletras.com.br/teorialiteraria/254742
[6] https://www.letras.mus.br/chico-buarque/45165/
[7] http://brasilescola.uol.com.br/biografia/joao-cruz-sousa.htm
[8] https://www.letras.mus.br/criolo/1857556/

Encoding, UTF-8, Unicode…

Contexto
Primeira postagem sobre o meu pet project, o camus {cã.mí}.
Ele é um sistema em que pretendo com o tempo ir adicionando módulos relacionados ao processamento de linguagem natural da língua portuguesa. Ver a descrição em “Hello Dave, Hello World”. Apesar do blog não ser exclusivamente sobre ele, muitas das postagens pretendo que sejam.
A primeira funcionalidade sendo implementada no camus é a versificação de um poema.

Sobre versificação:
“A versificação é o estudo de técnicas para propiciar a eufonia dos versos de um poema ou música” [1]
“Cada linha de um poema corresponde a um verso, os quais são classificados de acordo com as sílabas poéticas que apresentam.” [2]

Para realizar essa tarefa é preciso manipular palavras, frases e textos da língua portuguesa. Textos esses que podem conter caracteres em suas frases que não existam na língua inglesa, tais como cedilha, til, crase, acento circunflexo e acento agudo, que podem dar resultados inesperados caso não tratados previamente.
Nesse momento da implementação da separação silábica para fazer a versificação, os problemas mais recorrentes foram referentes ao encondig dos arquivos. Eles aconteceram desde o momento da visualização do arquivo pelo eclipse, passando pela compilação do projeto utilizando gradle, seguindo pelo commit e pull no github, com a aplicação já funcionando no heroku e devem vir ainda mais outros com o tempo.
Resolvi dar uma pesquisada sobre, e abaixo relato algumas informações encontradas apontando suas devidas referências.

ASCII
Computadores entendem apenas números, um código ASCII é uma representação numérica de um caractere, como uma letra, um número e um acento. Em 1963 o ASCII foi lançado para padronizar os caracteres utilizados nas trocas de informações entre os computadores. A ideia era que 128 caracteres (entre eles letras, pontuações, números, caracteres de controle, etc.) poderiam ser representados por um valor numérico pra cada um.  Exemplificando, tem-se que a letra ‘A’ é representada pelo número 65, que em hexadecimal equivale a 41 e em binário 01000001; a letra ‘B’ representada pelo número 66 (decimal), 42 (hexadecimal) e 01000010 (binário).
A primeira tabela ASCII descrevia 128 caracteres, depois ela foi aumentada para suportar 256 caracteres.

Criada na década de 1960 a partir do alfabeto inglês[4], não continha todos os caracteres para as outras línguas e não havia padronização, cada região montava seu próprio conjunto de caracteres e seu processo de manipulação, tornando difícil a transferência de textos de um computador para o outro, visto que o conjunto de caracteres e a forma como eles eram lidos eram diferentes. Como exemplo a palavra ‘atenção’ escrita utilizando UTF-8 e sendo lida utilizando ISO-8859-1, fica: atenção

Unicode
Para resolver esses problemas foi criado o Unicode, através do Unicode Consortium.
Ele é um conjunto de caracteres que reúne num só lugar, como um superconjunto, os caracteres necessários para escrita na maioria das línguas utilizadas nos computadores.
Para entender o Unicode é de grande importância conhecer os conceitos de Code Points e Code Space. Code points são os valores que estão no code space. Code Space é um intervalo, um conjunto de valores disponíveis para armazenar os caracteres do encoding. No ASCII estendido existem 256 code points, compreendidos entre os valores 0 até FF (hexadecimal) (code space), já o Unicode compreende 1.114.112 code points, entre os valores 0 até 10FFFF (hexadecimal) (code space). O jeito de armazenamento dos code points são diferentes para o ASCII e para o Unicode.

“Unicode codespace: A range of integers from 0 to 10FFFF. This particular range is defined for the codespace in the Unicode Standard. Other character encoding standards may use other codespaces.” [5]

UTF-8
É um codificador de caracteres (character encoding), capaz de codificar todos os caracteres possíveis definidos pelo Unicode. Utilizado para codificar texto em qualquer língua e com tamanho variável de armazenamento, manipula os code points a nível binário podendo usar de 1 a 4 bytes para codificar um code point Unicode.
Como exemplo pra representar 1 byte vou utilizar a seguinte notação: [00000001].

“UTF-8 is defined to encode codepoints in one to four bytes, depending on the number of significant bits in the numerical value of the codepoint” [6]

As codificações realizas ocupando 1 byte de espaço são para os caracteres de 0 a 127, equivalente a tabela ASCII, permitindo que a tabela Unicode seja compatível com a ASCII e um super conjunto dela.
2 bytes para caracteres entre 128 e 2047.
3 bytes para codificar caracteres entre 2048 até 65535
4 bytes para caracteres entre 65536 até 1.112.064

Utiliza os ‘high-order bits‘ para descobrir quantos bytes serão utilizados para realizar a codificação daquele determinado caractere. É a partir dele que se identifica quantos bytes serão utilizados para codificar o valor e obter o caractere desejado.

1-byte encoding:
Nas codificações com 1 byte de espaço, estão os valores entre 0 e 127, que são os mesmos da tabela ASCII. Cada byte tem o seguinte formato [00000000] (8 bits).
(X – notação para dizer que o espaço está livre)
7 bits ficam disponíveis para armazenar o valor do caractere.
[0XXXXXXX]

2-byte enconding:
Com 2 bytes de espaço, os primeiros 3 bits do primeiro byte são ‘110’ e os dois primeiros bits do segundo byte são ’10’. Isso dá 11 bits para armazenar um caractere.
[110XXXXX][10XXXXXX]

3-byte encoding:
Utilizando 3 bytes pra armazenar o caractere, os 4 primeiros bits do primeiro byte são ‘1110’, e os dois primeiros bits dos 2 bytes restantes são ’10’, dando um total de 16 bits disponíveis para representar um caractere.
[1110XXXX][10XXXXXX][10XXXXXX]

4-byte encoding:
com 4 bytes segue-se o mesmo padrão, os primeiros bits ficam ‘11110’ e os primeiros bits dos bytes seguintes ficam com ’10’.
[11110XXX][10XXXXXX][10XXXXXX][10XXXXXX]

Conclusão
Basicamente é preciso ter cuidado ao lidar com arquivos de texto, pois a representação dos caracteres muda de acordo com o encoding escolhido. Muitos problemas ocorrem por criar um arquivo utilizando um determinado encoding e depois tentar lê-lo utilizando um diferente. Viu-se a existência de code points, code spaces e a estratégia que o UTF-8 utiliza para fazer a manipulação dos valores que representam cada caractere.
Abaixo existe uma lista de links interessantes sobre o assunto e que também serviram de referência para essa postagem.

Links interessantes
Introduction to UTF-8 and Unicode
Characters, Symbols and the Unicode Miracle – Computerphile
Decode unicode – the world’s writing systems: Johannes Bergerhausen at TEDxVienna
What is Unicode? and how Encoding works? [closed]
What’s the difference between encoding and charset?
What is Unicode, UTF-8, UTF-16?
The Unicode Standard: A Technical Introduction
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
Entendendo Unicode e os Character Encodings
Glossary of Unicode Terms

Referências
[1] https://pt.wikipedia.org/wiki/Versifica%C3%A7%C3%A3o
[2] https://www.todamateria.com.br/versificacao/
[3] http://www.ascii-code.com/
[4] https://en.wikipedia.org/wiki/ASCII#Overview
[5] http://www.unicode.org/versions/Unicode9.0.0/ch03.pdf#G2212
[6] https://en.wikipedia.org/wiki/UTF-8#Description