/////////////////////////
// requete bibliographique
////////////////////////
//
// 12 documents, 20 mots clés (numérotés de 1 à 20)
//
// mots 1 à 4: chômage, impôts, dépression, commerce
// 5 à 7: économie,marché,production
// 8- 10  liquidation, emploi, redressement
//11- 13 indemnisation  prix  bénéfices
//14- 16  bassin, faille, dérive
//17- 20 drainage, vallée, érosion  volcan
// 
//////////////
n=20;m=12;
//
//////////////
//matrice mots/documents
//
A=zeros(n,m)
A(1:4,1)=1;
A(5:7,2)=1
A(4,3)=1
A(6,3)=1
A(7,3)=1
A(7:10,4)=1
A(11,5)=1
A(1,5)=1
A([8;5],5)=1
A([4;6;12;9],6)=1
A([13;11;1],7)=1
A(14:16,8)=1
A([8;17],9)=1
A([14;17;18],10)=1
A([3;17;18],11)=1
A([14;17;20],12)=1
///////////////////////
// requete
//
//
//q=zeros(n,1);q(3)=1;q(4)=1; 
// requete 1: dépression, commerce
q=zeros(n,1);q(9)=1;      
// requete 2: emploi
//
///////////////////////
//
//decomposition SVD de la matrice
//
[U,D,V]=svd(A)
/////////////////////
// redution de rang
//
k=evstr(x_dialog('rang réduit','12'));
Uk=U(:,1:k)
Vk=V(:,1:k)
Sigk=D(1:k,1:k)
//
////////////////////
// calcul des vecteurs de score (exact et approché)
//
s=zeros(m,1);
for j=1:m
  v=zeros(m,1);v(j)=1  
  s(j)=q'*A(:,j)/norm(q)/norm(A(:,j))//vecteur de score exact
  //
  sb(j)=abs((Uk'*q)'*Sigk*Vk'*v)/norm(Uk'*q)/norm(Sigk*Vk'*v) 
  // vecteur de score approché
end
/////////////////////
//
// affichage des documents avec score >0.3
//
[a,b]=find(s>0.3);
disp('documents pertinents (score exact):');disp(a)
// 
// résultat avec score approché
//
[a,b]=find(sb>0.3);
disp('documents pertinents (score approché):');disp(a)
//
figure(1)
clf()
plot((1:m)',s,'b*-')
plot((1:m)',sb,'r*-')
xtitle('score exact vs score approché','documents','score')
