• 简单的python协同过滤程序


    博主是自然语言处理方向的,不是推荐系统领域的,这个程序完全是为了应付大数据分析与计算的课程作业所写的一个小程序,先上程序,一共55行。不在意细节的话,55行的程序已经表现出了协同过滤的特性了。就是对每一个用户找4个最接近的用户,然后进行推荐,在选择推荐的时候是直接做的在4个用户中选择该用户item没包括的,当然这里没限制推荐数量,个人觉得如果要提高推荐准确率的画,起码,1,要对流行的item进行处理。2,将相邻的四个用户的item进行排序,从多到少的进行推荐。程序所用的数据是movielens上的(http://grouplens.org/datasets/movielens)。相似度的计算也很简单,直接用了交集和差集的比值。好吧,上程序

    #coding utf-8
    import os
    import sys
    import re
    
    f1=open("/home/alber/data_base/bigdata/movielens_train_result.txt",'r')   #读取train文件,已经处理成每一行代表一位用户的item,项之间用空格。
    f2=open("/home/alber/data_base/bigdata/movielens_train_result3.txt",'a')
    txt=f1.readlines()
    contxt=[]
    f1.close()
    userdic={}
    for line in txt:
        line_clean=" ".join(line.split())
        position=line_clean.index(",")
        ID=line_clean[0:position]
        item=line_clean[position+1:]
        userdic.setdefault(ID,item)
        if len(item)>=5:                     #对观影量少于5的用户不计入相似性计算的范围
            contxt.append(item)
    for key in userdic.keys():               #计算每位用户的4个最相似用户
        ID_num=key
        value=userdic[key]
          user_item=value.split(' ')
          Sim_user=[]
          for lines in contxt:
              lines_clean=lines.split(' ')
              intersection=list(set(lines_clean).intersection(set(user_item)))
              lenth_intersection=len(intersection)
              difference=list(set(lines_clean).difference(set(user_item)))
              lenth_difference=len(difference)
              if lenth_difference!=0:                                         
                  Similarity=float(lenth_intersection)/lenth_difference                    #交集除以差集作为相似性的判断条件
                  Sim_user.append(Similarity)
              else:
                  Sim_user.append("0")
         Sim_user_copy=Sim_user[:]
         Sim_user_copy.sort()
         Sim_best=Sim_user_copy[-4:]
         position1=Sim_user.index(Sim_best[3])
         position2=Sim_user.index(Sim_best[2])
         position3=Sim_user.index(Sim_best[1])
         position4=Sim_user.index(Sim_best[0])
         if position1!=0 and position2!=0 and position3!=0 and position4!=0:
             recommender=userdic[str(position1)]+" "+userdic[str(position2)]+" "+userdic[str(position3)]+" "+userdic[str(position4)] #将4位用户的看过的电影作为推荐  
        else:
            recommender="none"      
        reco_list=recommender.split(' ')
        recomm=[]
        for good in reco_list:
            if good not in user_item:
                recomm.append(good)
            else:
                pass
        f2.write((" ".join(recomm)+"
    "))
    f2.close()
                    
  • 相关阅读:
    Delphi 的字符及字符串[4] 字符串、字符指针与字符数组
    Delphi 的字符及字符串[5] 字符串与 Windows API
    WinAPI: FindWindow、FindWindowEx 查找窗口
    java LookAndFeel 美化 Substance使用
    持久化和对象关系映射ORM技术
    java 更换皮肤问题Cannot refer to a nonfinal variable inside an inner class defined in a different method
    java Swing可视化开发工具
    php ORM 持久层框架与简单代码实现
    生成Substance皮肤Menu项的代码
    三层架构实现
  • 原文地址:https://www.cnblogs.com/nlp-yekai/p/3770583.html
Copyright © 2020-2023  润新知