自己实现的一个基于用户的协同过滤算法

来源:互联网 发布:ios 免费 日程软件 编辑:程序博客网 时间:2024/04/29 04:36
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*;


import bean.News;
import bean.User;


public class Like {
public static void main(String[] args) {
List<User> list1=new ArrayList<User>();
    List<News> list2=new ArrayList<News>();
    User user1=new User();
    News news1=new News();
    try {
Class.forName("com.mysql.jdbc.Driver");
//URL指向要访问的数据库名mydata
    String url = "jdbc:mysql://localhost:3306/news?useSSL=true";
    //MySQL配置时的用户名
    String user = "root";
    //MySQL配置时的密码
    String password = "19961020";
    Connection conn = DriverManager.getConnection(url,user,password);
    Statement stmt= conn.createStatement() ;
    String sql1="select * from users";
    String sql2="select * from news";
    String sql3="select newsid from newsbelike where userid=?";
    String sql4="select count(*) as num from newsbelike where userid=?";
    ResultSet rs1= stmt.executeQuery(sql1) ;
    while(rs1.next()){
   
    user1.setUsername(rs1.getString("username"));
    user1.setId(rs1.getInt("id"));
    list1.add(user1);
}
rs1.close();
    ResultSet rs2= stmt.executeQuery(sql2) ;
   
    while(rs2.next()){
   
    news1.setTitle(rs2.getString("title"));
    news1.setNew_id(rs2.getInt("id"));
    list2.add(news1);
    }
    rs2.close();
    
int[][] likeuser=new int[list1.size()][];
    for(int i=1;i<list1.size()+1;i++){
    PreparedStatement ps1= conn.prepareStatement(sql3);
    ps1.setInt(1, i);
    ResultSet rs3= ps1.executeQuery() ;
    List<Integer> list3=new ArrayList<Integer>();
    while(rs3.next()){
    int id=rs3.getInt("newsid");
    list3.add(id);
    }
    likeuser[i-1]=new int[list3.size()];
    for(int j=0;j<list3.size();j++){
    likeuser[i-1][j]=list3.get(j);
    }
   
    }
    for(int[] is:likeuser){
    System.out.println();
    for(int i:is){
    System.out.print(i);
    System.out.print(" ");
   
   
    }
    }
    System.out.println("------------华丽的分割线-------------");
    int[][] usersame=new int[list1.size()][list1.size()];
    for(int i=0;i<list1.size();i++){
    for(int u=0;u<list1.size();u++){
    for(int j=0;j<likeuser[i].length;j++){
       for(int k=0;k<likeuser[u].length;k++){
    if(likeuser[i][j]==likeuser[u][k]){
    usersame[i][u]++;
    }
    }
    }
    }
   
    }
    for(int i=0;i<list1.size();i++){
    System.out.println();
    for(int u=0;u<list1.size();u++){
    System.out.print(usersame[i][u]);
    System.out.print(" ");
    }}
    System.out.println();
    System.out.println("------------华丽的分割线-------------");
    float[][] usersim=new float[list1.size()][list1.size()];
    for(int i=1;i<list1.size()+1;i++){
    for(int u=1;u<list1.size()+1;u++){
    PreparedStatement ps2= conn.prepareStatement(sql4);
        ps2.setInt(1, i);
        ResultSet rs4= ps2.executeQuery() ;
        int numi=0;
        while(rs4.next()){
        numi=rs4.getInt("num");
        }
    PreparedStatement ps3= conn.prepareStatement(sql4);
    ps3.setInt(1, u);
        ResultSet rs5= ps3.executeQuery() ;
        int numu=0;
        while(rs5.next()){
        numu=rs5.getInt("num");
        }
        if(numi*numu==0){
        usersim[i-1][u-1]=0;
        }else if(u==i){
        usersim[i-1][u-1]=0;
        }
        else if(usersame[i-1][u-1]==0){
        usersim[i-1][u-1]=0;
        }else{
        usersim[i-1][u-1]=(((float)usersame[i-1][u-1])/((float)Math.sqrt(numu*numi)));}
    }
    }
    for(int i=0;i<list1.size();i++){
    System.out.println();
    for(int u=0;u<list1.size();u++){
    System.out.print(usersim[i][u]);
    System.out.print(" ");
    }}
    float[] data=new float[usersim[0].length];
  
  for(int i=0;i<usersim[0].length;i++){
  data[i]=usersim[7-1][i];
  }
  float[] data1=new float[usersim[0].length];
  List<Integer> simuserid=new ArrayList<Integer>();
  System.arraycopy(data1, 0, data1, 0, data.length);
  Arrays.sort(data1);
  //System.out.println(data[data.length-1]);
  List<Integer> newidlist=new ArrayList<Integer>();
  for(int i=data1.length-1;i>(data1.length)-3;i--){
  for(int j=0;j<data.length;j++){
  if(data1[i]==data[j]){
 simuserid.add(j);
  }
  }
  }
  for(int i=0;i<simuserid.size();i++)
  {
   System.out.println(simuserid.get(i));
  }
  
  for(int i=0;i<simuserid.size();i++){
  //System.out.println(simuserid.get(i));
  PreparedStatement ps5= conn.prepareStatement(sql3);
    ps5.setInt(1, simuserid.get(i));
    ResultSet rs5= ps5.executeQuery() ;
    while(rs5.next()){
    int id=rs5.getInt("newsid");
    newidlist.add(id);
    }
  }
  List<Integer> newidlist1=new ArrayList<Integer>();
  PreparedStatement ps6= conn.prepareStatement(sql3);
  ps6.setInt(1, 7);
  ResultSet rs6= ps6.executeQuery() ;
  while(rs6.next()){
  int id=rs6.getInt("newsid");
  newidlist1.add(id);
  }
 
  /*System.out.println(newidlist.get(0));*/
  List<Integer> listTemp= new ArrayList<Integer>();  
Iterator<Integer> it=newidlist.iterator();  
while(it.hasNext()){  
 int a=it.next();  
 if(listTemp.contains(a)){  
  it.remove();  
 }  
 else{  
  listTemp.add(a);  
 }  
}  
  newidlist.removeAll(newidlist1);
}catch(Exception e){
  e.printStackTrace() ;

}
    }}
0 0
原创粉丝点击