A tabela gr-homofonos.csv atualmente apresenta na sua coluna "grau" um valor arbitrário, um score... Idealmente poderíamos utiliza-lo para outros fins, sendo o mais importante a conversão para fuzzy set, ou seja, tendo a coluna como realmente "grau de pertinência". Basta estabelecer uma convenção mais ampla:
grau |
grau_norm |
semântica |
4 |
100% |
Homófono consensual, abrangência nacional |
3 |
75% |
Homófono regionalmente, ou sem maior consenso |
1 |
25% |
Homófono apenas em contexto de ruído (ex. telefone) |
Nesta nova escala o "score 1" passa a ter um significado mais claro, de "praticamente não-membro", e todos os valores normalizados (grau_norm
) são obtidos diretamente do grau, pela função grau/grau_max
.
Os valores de grau 2 e 0 não são usados. O valor 2 resulta em 50%, ou seja, crossover point, que é indesejado na presente semântica. O valor zero é atribuído a qualquer coisa que seja não-membro, portanto "100% não-homófono".
Exemplos e operações
-
Seleção do fuzzy set dos homófonos de um canônico c. SELECT * FROM gr_homofonos WHERE canonico=c
-
Cardinalidade escalar do mesmo fuzzy set, expressa em percentual: SELECT round(100.0*sum(grau_norm)) FROM gr_homofonos WHERE canonico=c
.
-
Interseção entre dois conjuntos: dois canônicos diferentes que eventualmente partilham, em certo grau, as mesmas homófonas. Por questão de consistência deve-se obrigar que os elementos das interseções de pares nunca tenham membros com grau de pertinência superior a 50%. Não podem ser totais (100%) pois senão descaracterizariam os canônicos. Mesmo sendo parciais, como num dos conjuntos a pertinência é de 75%, pode-se impor que no outro seja seu complemento, portanto 25% < 50%.
-
...
Como se tratam de convenções, os valores grau_norm_max
de qualquer conjunto fuzzy podem ser armazenados em cache, ou seja, no dataset.meta.info
, dispensando queries complementares de agrupamento com consulta ao MAX(grau_norm).
Antes de apelar para bibliotecas sofisticadas, criar no schema do framework um kit simples de funções fuzzy-set, por sem convenção do resgate de cache:
-
dataset.f2jf(dataset_id,fuzzy_field)
transforma coluna desejada (se normalizada ou com normalização definida) em uma representação JSONb para repesenta-lo como fuzzy-set. Usar jsonb_object(elementos,graus_norm)
para gerar o objeto. Pode-se acrescentar um valor controlado (ex. "MAX") para usar como referência de normalização quando forem graus inteiros.
-
dataset.fsc(float[])
obtém a "fuzzy scalar cardinality" da array de graus normalizados (float) ... idem para argumento JSONb obtido da representação acima.
-
dataset.feq(JSONb, JSONb)
, "fuzzy equals" de dois membros para inferir igualdade.
-
dataset.fintersec(JSONb, JSONb)
e dataset.funion(JSONb, JSONb)
para interseção e união...
-
... e só.
Referências e links úteis