strategy.py 4.37 KB
#!/usr/bin/python

#  AppRecommender - A GNU/Linux application recommender
#
#  Copyright (C) 2010  Tassia Camoes <tassia@gmail.com>
#
#  This program is free software: you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation, either version 3 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program.  If not, see <http://www.gnu.org/licenses/>.

import os, re
import xapian
from data import *
from recommender import *

class ReputationHeuristic:
    """
    Abstraction for diferent reputation heuristics.
    """

class BugsHeuristic(ReputationHeuristic):
    """
    Reputation heuristic based on quantity of open bugs.
    """

class RCBugsHeuristic(ReputationHeuristic):
    """
    Reputation heuristic based on quantity of RC bugs.
    """

class PopularityHeuristic(ReputationHeuristic):
    """
    Reputation heuristic based on popularity of packages.
    """


class PkgMatchDecider(xapian.MatchDecider):
    """
    Extends xapian.MatchDecider to disconsider installed packages.
    """

    def __init__(self, installed_pkgs):
        xapian.MatchDecider.__init__(self)
        self.installed_pkgs = installed_pkgs

    def __call__(self, doc):
        return doc.get_data() not in self.installed_pkgs


class RecommendationStrategy:
    """
    Abstraction for diferent recommendation strategy.
    """

class ItemReputationStrategy(RecommendationStrategy):
    """
    Recommendation strategy based on items reputation.
    """
    def run(self,items_list,heuristic):
        """
        Perform recommendation strategy.
        """
        return RecomendationResult()

class ContentBasedStrategy(RecommendationStrategy):
    """
    Content-based recommendation strategy.
    """
    def run(self,recommender,user):
        """
        Perform recommendation strategy.
        """
        profile = user.debtags_tag_profile(recommender.items_repository.debtags_db,50)
        qp = xapian.QueryParser()
        query = qp.parse_query(profile)
        enquire = xapian.Enquire(recommender.items_repository)
        enquire.set_query(query)

        try:
            mset = enquire.get_mset(0, 20, None, PkgMatchDecider(user.items()))
        except xapian.DatabaseError as error:
            logging.critical(error.get_msg())
            exit(1)

        item_score = {}
        for m in mset:
            item_score[m.document.get_data()] = m.rank
        return RecommendationResult(item_score,20)

class AxiContentBasedStrategy(RecommendationStrategy):
    """
    Content-based recommendation strategy based on Apt-xapian-index.
    """
    def run(self,recommender,user):
        """
        Perform recommendation strategy.
        """
        profile = user.axi_tag_profile(recommender.items_repository,50)
        query = xapian.Query(xapian.Query.OP_OR,profile)
        enquire = xapian.Enquire(recommender.items_repository)
        enquire.set_query(query)

        try:
            mset = enquire.get_mset(0, 20, None, PkgMatchDecider(user.items()))
        except xapian.DatabaseError as error:
            logging.critical(error.get_msg())
            exit(1)

        item_score = {}
        for m in mset:
            item_score[m.document.get_data()] = m.rank
        return RecommendationResult(item_score,20)

class ColaborativeStrategy(RecommendationStrategy):
    """
    Colaborative recommendation strategy.
    """
    def run(self,user,users_repository,similarity_measure):
        """
        Perform recommendation strategy.
        """
        return RecomendationResult()

class KnowledgeBasedStrategy(RecommendationStrategy):
    """
    Knowledge-based recommendation strategy.
    """
    def run(self,user,knowledge_repository):
        """
        Perform recommendation strategy.
        """
        return RecomendationResult()

class DemographicStrategy(RecommendationStrategy):
    """
    Recommendation strategy based on demographic data.
    """
    def run(self,user,items_repository):
        """
        Perform recommendation strategy.
        """
        return RecomendationResult()