#include "come.h"
/*
1.长度为N的字串,a字符串的长度为n,b的字符串长度为m
2.N-gram相似度计算:交集子串个数/并集子串个数
3.a的N子串个数为 n+1-N,b的子串个数为m+1-N
4.设相交子串的个数为count;
5.相似度公式为 count/(m+n+2-2*N-count)
*/
float NG::ngram()
{
int i,j,k,temp=0;
int count=0;
result=0;
int n = strlen(a);
int m = strlen(b);
if(m<N||n<N)
{
printf("\n\t !!!字符串长度不符合N\n");
return 0;
}
int **astr=new int*[(n+1-N)*sizeof(int*)];//a字符串的所有字串
for(i=0;i<n+1-N;i++)
{
astr[i]=new int[N*sizeof(int)];//N gram中字串长度为N
for(j=0;j<N;j++)
{
astr[i][j]=i+j; //将所有字串组合存起来
}
}
int **bstr=new int*[(m+1-N)*sizeof(int*)];
for(i=0;i<m+1-N;i++)
{
bstr[i]=new int[N*sizeof(int)];
for(j=0;j<N;j++)
{
bstr[i][j]=i+j;
}
}
for(i=0;i<n+1-N;i++)
{
for(j=0;j<m+1-N;j++)
{
temp=0;
for(k=0;k<N;k++)
{
//printf("\t go^……%c\n",a[astr[i][k]]);
if(a[astr[i][k]]==b[bstr[j][k]])
temp++;
}
if(temp>=N)
{
count++;
break;
}
}
}
for(i=0;i<n+1-N;i++) //空间释放
{free(astr[i]);}
for(i=0;i<m+1-N;i++)
{free(bstr[i]);}
free(astr);
free(bstr);
result=(float)count/(float)(m+n+2-2*N-count);
if(result>1)//aaa与aaaa的情况
{
result=1/result;
}
return result;//返回相似度
}