Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
// Copyright (c) 2008 Pedro Quaresma, Coimbra, Portugal
// Versão 1.0
// Cálculo do Índice de Coincidência Mútuo
// (Mg(yi))~\cite{Stinson2006}
%{
#include
/*
Codificação: (A,65)-(Z,90); (a,97)-(z,122); (À,-64)-(Ã,-61);
(Ç,-57)-(Ê,-54); (Ì,-52)-(Î,-50); (Ò,-46)-(Õ,-43);
(Ù,-39)-(Ú,-38); (Ü,-36); (à,-32)-(ã,-29); (ç,-25)-(ê,-22);
(ì,-20)-(î,-18); (ó,-13)-(õ,-11); (ù,-7)-(ú,-6); (ü,-4);
os índices do vector vão coincidir com os valores da codificação
dos caracteres, que no caso dos caracteres acentuados é ajustada
de forma a não haver conflitos, 122+1+64 = 187,
122 - valor numérico de "z" (o maior positivo)
+1 - a próxima posição
+64 - o valor (mais negativo) de "À"
isto dado não se
poderem considerar índices negativos. O gasto de memória que
esta solução implica não é (muito) significativo.
A solução tem de passar por adoptar os novos tipos de "wide chars"
ou algo do género.
*/
#define MAXCOD 187
%}
int i;
double conta_palavra=0;
int conta_letra=0;
int vec[MAXCOD];
char ch;
double frequenciaRelativa;
double d1;
double d2;
letras [a-z]|"á"|"à"|"ã"|"â"|"ç"|"é"|"è"|"ê"|"í"|"ì"|"ó"|"ò"|"õ"|"ô"|"ú"|"ù"|"ü"
%%
{letras} { // 122+1-4=119 ('z'+1-'ü'), isto para obter uma gama contínua
if(yytext[0]<0) {
i =-1*yytext[0]+119;
vec[i]++;
conta_letra++;
}
else {
i = yytext[0];
vec[i]++;
conta_letra++;
}
}
.|\n
%%
main(int argc, char *argv[]) {
// interface linha de comando
// media
char *ficheiroEntrada,*ficheiroSaida, *ficheiroFrequencias;
double somaFis=0,total_letras=0,indiceCM[MAXCOD];
float freq[MAXCOD], pi;
int vecAjustado[MAXCOD];
char auxC;
int aux,g;
float auxV;
FILE *fsai, *ffreq, *fopen();
if (argc<=3) { // valores de entrada insuficientes (3+1)
printf("\nUtilização: indiceCoincidenciaMutua nome_ficheiro_frequencias nome_ficheiro_entrada nome_ficheiro_saída\n\n");
return;
}
// obtêm os argumentos da linha de comando
ficheiroFrequencias=argv[1];
ficheiroEntrada=argv[2];
ficheiroSaida=argv[3];
printf ("\nFicheiro a Processar: %s\nFicheiro com resultados: %s\n\n",ficheiroEntrada,ficheiroSaida);
if ((ffreq = fopen(ficheiroFrequencias,"r")) == NULL) {
printf("Não foi possível abrir o ficheiro %s\n",ficheiroFrequencias);
}
else if ((yyin = fopen(ficheiroEntrada,"r")) == NULL) {
printf("Não foi possível abrir o ficheiro %s\n",ficheiroEntrada);
}
else if ((fsai = fopen(ficheiroSaida,"w")) == NULL) {
printf("Não foi possível abrir para escrita o ficheiro %s\n",ficheiroSaida);
}
else {
/*
Ler o ficheiro com os valores das frequências. Para se poder
fazer a multiplicação com os valores de frequência encontrados
vai-se usar o mesmo princípio de arrumação dos valores, o índice
do vector é o valor numérico (ASCII+correcções) do próprio
caracter.
*/
// Inicializar o vector freq e vecAjustado
for (i=0; i < MAXCOD; i++) {
freq[i]=0;
vecAjustado[i]=0;
}
// os índices vão ser definidos como uma gama contínua a começar
// em zero.
i=0;
while (!feof(ffreq)) {
fscanf(ffreq,"%c%f\n",&auxC,&auxV);
freq[i]=auxV;
i++;
}
// processar o ficheiro de entrada
yylex();
// Contar o número total de letras lidas
for (i=0; i < MAXCOD; i++)
if(vec[i] != 0) {
total_letras = total_letras+vec[i];
}
// Tenho de ajustar os vectores dos valores para estarem numa gama
// continua a começar no zero.
// a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z, (26)
// ü,ú,ù,õ,ô,ó,ò,í,ì,ê,é,è,ç,ã,â,á,à
// gama a-z
for (i=0; i<=25; i++) {
vecAjustado[i]=vec[i+97]; // n-97
//printf("%d,%c,%d\n",i,i+97,vecAjustado[i]);
}
// 123=119-(-4), -4='ü')
for (i=26; i<=26; i++) {
vecAjustado[i]=vec[i+98]; // 26+97=123
//printf("%d,%c,%d\n",i,-(i+97)+119,vecAjustado[i]);
}
// 125=119-(-6), -6='ú', ... ù
for (i=27; i<=28; i++) {
vecAjustado[i]=vec[i+99]; // 27+98=125, ...
//printf("%d,%c,%d\n",i,-(i+98)+119,vecAjustado[i]);
}
// 130=119-(-11), -11='õ',...ô,ó,ò
for (i=29; i<=32; i++) {
vecAjustado[i]=vec[i+102]; // 29+101=130, ...
//printf("%d,%c,%d\n",i,-(i+101)+119,vecAjustado[i]);
}
// 138=119-(-19)='í',... ì
for (i=33; i<=34; i++) {
vecAjustado[i]=vec[i+105]; // 33+105=138, ...
//printf("%d,%c,%d\n",i,-(i+105)+119,vecAjustado[i]);
}
// 141=119-(-22)='ê',... é,è,ç
for (i=35; i<=38; i++) {
vecAjustado[i]=vec[i+106]; // 35+106=141, ...
//printf("%d,%c,%d\n",i,-(i+106)+119,vecAjustado[i]);
}
// 148=119-(-29)='ã',... â,á,à
for (i=39; i<=42; i++) {
vecAjustado[i]=vec[i+106]; // 39+109=148, ...
//printf("%d,%c,%d\n",i,-(i+109)+119,vecAjustado[i]);
}
for (g=0; g <= 42; g++) {
somaFis=0;
for (i=0; i <= 42; i++) {
pi=freq[i]/100;
somaFis=somaFis+(vecAjustado[(i+g) % 43]*pi/total_letras);
}
// escreve o índice de coincidência Mútua
indiceCM[g] = somaFis;
fprintf(fsai,"Índice de Coincidência Mútuo[%d]: %0.6f\n",g,indiceCM[g]);
}
}
}