class pro{
String str;
int s,sx,strlong;
int[] z=new int[1000];
int[] zz=new int[1000];
int dicnumber,phnumber,wordnumber;
String[] ph=new String[500];
String[] word=new String[500];
int[] nph=new int[500];
int[] nword=new int[500];
String[] dic=new String[10000];
double[] p=new double[10000];
double[] q=new double[10000];
double point,maxpoint;
int[] mvnumber=new int[1000];
int[][] mv=new int[1000][500];
int trial,time,tm;
int[] num=new int[10000];
public static void main(String args[]){
pro test=new pro();
}
pro(){
dicnumber=0;
p[0]=1;
tm=0;
for(time=1;time<100;time++){
str="猫は犬です";
strlong=str.length();
maxpoint=-999;
for(trial=1;trial<10;trial++){
z[0]=1;
for(s=1;s<strlong;s++){
z[s]=0;
if(Math.random()>0.5)z[s]=1;
}
zz[1]=0;
sx=1;
for(s=1;s<strlong;s++){
if(z[s]==1)sx=sx+1;
if(z[s]==1)zz[sx]=s;
}
phnumber=sx;
for(s=1;s<phnumber;s++){
ph[s]=str.substring(zz[s],zz[s+1]);
}
s=phnumber;
ph[s]=str.substring(zz[s],strlong);
for(s=1;s<phnumber+1;s++){
nph[s]=0;
for(sx=1;sx<dicnumber+1;sx++){
if(ph[s].equals(dic[sx]))nph[s]=sx;
}
}
sx=nph[1];
point=fast(sx);
for(s=1;s<phnumber;s++){
point=pr(nph[s],nph[s+1])+point;
}
if(point>maxpoint)wordnumber=phnumber;
if(point>maxpoint)word=ph;
if(point>maxpoint)nword=nph;
if(point>maxpoint)maxpoint=point;
}
for(s=1;s<wordnumber+1;s++){
if(nword[s]==0)makedic(s);
}
for(s=1;s<wordnumber+1;s++){
if(nword[s]==0)nword[s]=makenword(s);
}
for(s=1;s<dicnumber+1;s++){
num[sx]=0;
}
for(s=1;s<wordnumber+1;s++){
sx=nword[s];
num[sx]=num[sx]+1;
}
for(s=1;s<dicnumber+1;s++){
q[s]=(double)num[s]/wordnumber;
}
for(s=1;s<dicnumber+1;s++){
p[s]=0.9*p[s]+0.1*q[s];
}
tm=tm+1;
if(tm>999)tm=1;
mvnumber[tm]=wordnumber;
for(s=1;s<wordnumber+1;s++){
mv[tm][s]=nword[s];
}
System.out.println(wordnumber);
System.out.println(maxpoint);
}
}
int makenword(int s){
int sxs;
sxs=0;
for(sx=1;sx<dicnumber+1;sx++){
if(word[s].equals(dic[sx]))sxs=sx;
}
return sxs;
}
void makedic(int s){
int h;
h=0;
for(sx=1;sx<dicnumber+1;sx++){
if(word[s].equals(dic[sx]))h=100;
}
if(h<50)dicnumber=dicnumber+1;
if(h<50)dic[dicnumber]=word[s];
}
double pr(int m1,int m2){
int t1,t2;
int pr1,pr2;
int h;
double px;
px=0.01;
pr1=0;
pr2=0;
for(t1=1;t1<1000;t1++){
for(t2=1;t2<mvnumber[t1];t2++){
if(mv[t1][t2]==m1)pr1=pr1+1;
}
}
for(t1=1;t1<1000;t1++){
for(t2=1;t2<mvnumber[t1];t2++){
h=0;
if(mv[t1][t2]==m1)h=h+1;
if(mv[t1][t2+1]==m2)h=h+1;
if(h==2)pr2=pr2+1;
}
}
if(pr1>0)px=pr2/pr1;
if(px<0.01)px=0.01;
return px;
}
double fast(int m1){
int t1,pr1,pr2,h;
double px;
px=0.01;
pr1=0;
pr2=0;
for(t1=1;t1<1000;t1++){
if(mvnumber[t1]>0)pr1=pr1+1;
}
for(t1=1;t1<1000;t1++){
h=0;
if(mvnumber[t1]>0)h=h+1;
if(mv[t1][1]==m1)h=h+1;
if(h==2)pr2=pr2+1;
}
if(pr1>0)px=pr2/pr1;
if(px<0.01)px=0.01;
return px;
}
}
最終更新:2011年05月25日 07:00