Exemple #1
0
    def __simulateRecommendation(self, portfolio:Portfolio1Aggr, portfolioModel:pd.DataFrame, evaluatonTool:AEvalTool, testRatingsDF:DataFrame,
                                 history:AHistory, evaluation:dict, uProbOfObserv:List[float], uObservation:List[bool], userID:int,
                                 currentItemID:int, nextItemID:int):

        rItemIDs:List[int]
        rItemIDsWithResponsibility:List[tuple[int, Series[int, str]]]
        rItemIDs, rItemIDsWithResponsibility = portfolio.recommend(
            userID, portfolioModel, testRatingsDF, history, numberOfItems=self._numberOfItems)

        print(testRatingsDF)

        if not nextItemID in rItemIDs:
            return

        index:int = rItemIDs.index(nextItemID)
        probOfObserv:float = uProbOfObserv[index]
        wasObserved:bool = uObservation[index]


        if wasObserved:
            clickedItemID: int = nextItemID

            evaluatonTool.click(rItemIDsWithResponsibility, clickedItemID, probOfObserv, portfolioModel, evaluation)

            # save log of history
            history.insertRecommendations(userID, rItemIDs, uProbOfObserv, clickedItemID)

        else:
            evaluatonTool.ignore(rItemIDsWithResponsibility, portfolioModel, evaluation)

            # save log of history
            history.insertRecommendations(userID, rItemIDs, uProbOfObserv, None)
Exemple #2
0
    def __simulateRecommendation(self, portfolio:APortfolio, portfolioDesc:APortfolioDescription, portfolioModel:pd.DataFrame,
                                 evaluatonTool:AEvalTool, history:AHistory, evaluation:dict, uObservation:List[bool],
                                 currentItemID:int, nextItemIDs:List[int], userID:int):

        #print("userID: " + str(userID))
        portId:str = portfolioDesc.getPortfolioID()

        args:dict = {APortfolio.ARG_NUMBER_OF_RECOMM_ITEMS:self._numberOfRecommItems, Portfolio1Aggr.ARG_NUMBER_OF_AGGR_ITEMS:self._numberOfAggrItems}

        rItemIDs:List[int]
        rItemIDsWithResponsibility:List[tuple[int, Series[int, str]]]
        rItemIDs, rItemIDsWithResponsibility = portfolio.recommend(userID, portfolioModel, args)

        evaluatonTool.displayed(rItemIDsWithResponsibility, portfolioModel, evaluation)

        nextNoClickedItemIDs:List[int] = list(set(nextItemIDs) -set(self._clickedItems[userID]))

        candidatesToClick:List[int] = list(set(rItemIDs) & set(nextNoClickedItemIDs))
        clickedItemIDs:List[int] = []
        for candidateToClickI in candidatesToClick:
            indexI:int = rItemIDs.index(candidateToClickI)
            wasCandidateObservedI:bool = uObservation[indexI]
            if wasCandidateObservedI:
                clickedItemIDs.append(candidateToClickI)

        print("nextItemIDs: " + str(nextItemIDs))
        print("rItemIDs: " + str(rItemIDs))
        print("uObservation: " + str(uObservation))
        print("candidatesToClick: " + str(candidatesToClick))
        print("clickedItemIDs: " + str(clickedItemIDs))


        for clickedItemIdI in clickedItemIDs:
            evaluatonTool.click(rItemIDsWithResponsibility, clickedItemIdI, portfolioModel, evaluation)

            if not clickedItemIdI in self._clickedItems[userID]:
                self._clickedItems[userID].append(clickedItemIdI)

            print("clickedItems: " + str(self._clickedItems[userID]))

        # store port model time evolution to file
        self.portModelTimeEvolutionFiles[portId].write("currentItemID: " + str(currentItemID) + "\n")
        self.portModelTimeEvolutionFiles[portId].write("userID: " + str(userID) + "\n")
        self.portModelTimeEvolutionFiles[portId].write(str(portfolioModel) + "\n\n")

        # store history of recommendations to file
        self.historyOfRecommendationFiles[portfolioDesc.getPortfolioID()].write("userID: " + str(userID) + "\n")
        self.historyOfRecommendationFiles[portfolioDesc.getPortfolioID()].write("currentItemID: " + str(currentItemID) + "\n")
        self.historyOfRecommendationFiles[portfolioDesc.getPortfolioID()].write("rItemIDs: " + str(rItemIDs) + "\n")
        self.historyOfRecommendationFiles[portfolioDesc.getPortfolioID()].write("uObservation: " + str(uObservation) + "\n")
        self.historyOfRecommendationFiles[portfolioDesc.getPortfolioID()].write("clickedItemIDs: " + str(clickedItemIDs) + "\n\n")

        # save log of history
        history.insertRecomAndClickedItemIDs(userID, rItemIDs, clickedItemIDs)

        # delete log of history
        history.deletePreviousRecomOfUser(userID, self._repetitionOfRecommendation * self._numberOfRecommItems)
    def runPenalization(self, userID:int, methodsResultDict:dict, history:AHistory):

        def getItemIDs(methIdI:str):
            recommI:Series = methodsResultDict[methIdI]
            itemIDsI:List[int] = recommI.index
            return itemIDsI

        itemsInRecomendationsLL:List[List[int]] = map(getItemIDs, methodsResultDict)
        itemsInRecomendations:List[int] = list(itertools.chain.from_iterable(itemsInRecomendationsLL))

        itemIdsToRemove:List[int] = []
        for itemIdI in itemsInRecomendations:
            valueOfIgnoringI:float = history.getIgnoringValue(userID, itemIdI, limit=self._lengthOfHistory)
            #print("valueOfIgnoringI: " + str(valueOfIgnoringI))
            if valueOfIgnoringI >= self._borderNegFeedback:
                itemIdsToRemove.append(itemIdI)

        #print("itemIdsToRemove: " + str(itemIdsToRemove))

        methodsResultNewDict:dict = {}
        for methIdI in methodsResultDict.keys():
            ratingsI:Series = methodsResultDict[methIdI]
            ratingsNewI:Series = ratingsI.drop(list(set(ratingsI.keys()) & set(itemIdsToRemove)))
            methodsResultNewDict[methIdI] = ratingsNewI

        return methodsResultNewDict
Exemple #4
0
    def runPenalization(self, userID: int, methodsResultDict: dict,
                        history: AHistory):

        if type(userID) is not int and type(userID) is not np.int64:
            raise ValueError("Type of userID isn't int.")
        if type(methodsResultDict) is not dict:
            raise ValueError("Type of methodsResultDict isn't dict.")
        if not isinstance(history, AHistory):
            raise ValueError("Type of history isn't AHistory.")

        itemIDs: List[int] = list(
            set(
                itertools.chain(
                    *[rI.index for mI, rI in methodsResultDict.items()])))

        penalties: dict = {}
        for itemIdI in itemIDs:
            prevRecomendations: List[
                tuple] = history.getPreviousRecomOfUserAndItem(
                    userID, itemIdI, 100)
            prevRecomendations.reverse()

            penaltyI: float = 0
            i: int = 0
            for indexJ, userIdJ, itemIdJ, positionJ, clickedJ, timestampJ in prevRecomendations:
                penaltyPositionJ: float = self._penalPositionFnc(
                    positionJ, *self._argumentsPositionList)

                penaltyHistoryJ: float = self._penalHistoryFnc(
                    i, *self._argumentsHistoryList)

                penaltyI += penaltyPositionJ * penaltyHistoryJ
                i += 1
            penalties[itemIdI] = penaltyI

        penalizedResultsDict: dict = {}

        methodIdI: str
        resulrsI: Series
        for methodIdI, resultsI in methodsResultDict.items():
            penalizedResultDictI: dict = {}

            candidateIdJ: int
            votesOfCandidateJ: int
            for candidateIdJ, votesOfCandidateJ in resultsI.items():
                #print("candidateIdJ: " + str(candidateIdJ))
                #print("votesOfCandidateJ: " + str(votesOfCandidateJ))

                penalizedResultDictI[candidateIdJ] = votesOfCandidateJ / (
                    1 + penalties.get(candidateIdJ, 0))

            penalizedResultsDict[methodIdI] = Series(penalizedResultDictI,
                                                     name="rating")

        return penalizedResultsDict
    def __getPenaltiesOfItemIDs(self, userID:int, itemIDs:List[int], history:AHistory):
        prevRecomendations:List[tuple] = history.getPreviousRecomOfUser(userID, self._lengthOfHistory)
        i:int = len(prevRecomendations)   #self._lengthOfHistory#
        #print(prevRecomendations)
        probabilities:dict = {}
        for indexJ, userIdJ, itemIdJ, positionJ, clickedJ, timestampJ in prevRecomendations:
            actProbability = probabilities.get(itemIdJ, 1) #init with one
            
            prob_implicit_rejection:float = self._penalPositionFnc(positionJ, *self._argumentsPositionList)
            prob_stable_pref:float = self._penalHistoryFnc(i, *self._argumentsHistoryList)
            prob_couldBeRelevant = (1-(prob_implicit_rejection * prob_stable_pref)  )

            probabilities[itemIdJ]  =  actProbability*prob_couldBeRelevant
            
            i = i-1
        print(probabilities)
        return probabilities
        
        
        """
Exemple #6
0
    def __getPenaltiesOfItemIDs(self, userID:int, itemIDs:List[int], history:AHistory):

        penalties:dict = {}
        for itemIdI in itemIDs:
            prevRecomendations:List[tuple] = history.getPreviousRecomOfUserAndItem(userID, itemIdI, self._lengthOfHistory)
            prevRecomendations.reverse()

            penaltyI: float = 0
            i:int = 0
            #print(prevRecomendations)
            for indexJ, userIdJ, itemIdJ, positionJ, clickedJ, timestampJ in prevRecomendations:
                penaltyPositionJ:float = self._penalPositionFnc(positionJ, *self._argumentsPositionList)

                penaltyHistoryJ:float = self._penalHistoryFnc(i, *self._argumentsHistoryList)

                penaltyI += penaltyPositionJ * penaltyHistoryJ
                i += 1
            penalties[itemIdI] = penaltyI

        return penalties
    def runOneMethodPenalization(self, userID:int, methodsResultSrs:Series, history:AHistory):

        itemIdsToRemove:List[int] = []
        for itemIdI in methodsResultSrs.index:
            #print(itemIdI)
            valueOfIgnoringI:float = history.getIgnoringValue(userID, itemIdI, limit=self._lengthOfHistory)
            #print("valueOfIgnoringI: " + str(valueOfIgnoringI))
            if valueOfIgnoringI >= self._borderNegFeedback:
                itemIdsToRemove.append(itemIdI)

        print("borderNegFeedback " + str(self._borderNegFeedback))
        print(itemIdsToRemove)

        newMethodsResultSrs:Series = methodsResultSrs.drop(itemIdsToRemove)
        #print(newMethodsResultSrs)
        #print(normalize(newMethodsResultSrs.values[:,np.newaxis], axis=0).ravel())

        normalizedNewMethodsResultSrs:Series = Series(
            normalize(newMethodsResultSrs.values[:, np.newaxis], axis=0).ravel(),
            index=newMethodsResultSrs.index)

        return normalizedNewMethodsResultSrs
    def simulateRecommendation(
            self, portfolio: APortfolio, portfolioDesc: APortfolioDescription,
            portfolioModel: DataFrame, evaluatonTool: AEvalTool,
            history: AHistory, evaluationDict: Dict[str, object],
            currentDFIndex: int, counterI: int, counterMax: int,
            testRatingsDF: DataFrame, uObservation: List[bool], userID: int,
            sessionID: int, windowOfItemIDsI: List[int],
            currentPageType: object):

        from datasets.slantour.events import Events  #class
        COL_ITEMID: str = self._ratingClass.getColNameItemID()
        currentItemID: int = testRatingsDF.loc[currentDFIndex][COL_ITEMID]

        print("userID: " + str(userID))
        portId: str = portfolioDesc.getPortfolioID()

        args: Dict[str, object] = {
            APortfolio.ARG_NUMBER_OF_RECOMM_ITEMS: self._numberOfRecommItems,
            Portfolio1Aggr.ARG_NUMBER_OF_AGGR_ITEMS: self._numberOfAggrItems,
            EvalToolContext.ARG_PAGE_TYPE: currentPageType,
            EvalToolContext.ARG_ITEM_ID: currentItemID,
            EvalToolContext.ARG_SENIORITY: sessionID
        }

        rItemIDs: List[int]
        rItemIDsWithResponsibility: List[tuple[int, Series[int, str]]]
        rItemIDs, rItemIDsWithResponsibility = portfolio.recommend(
            userID, portfolioModel,
            args | {self.ARG_STATUS: counterI / counterMax})

        evaluatonTool.displayed(
            userID, rItemIDsWithResponsibility, portfolioModel,
            args | {self.ARG_STATUS: counterI / counterMax})

        candidatesToClick: List[int] = [
            itemIDI for itemIDI, observedI in zip(
                rItemIDs, uObservation[:len(rItemIDs)]) if observedI
        ]
        clickedItemIDs: List[int] = list(
            set(candidatesToClick) & set(windowOfItemIDsI))
        clickedNewItemIDs: List[int] = [
            itemIdI for itemIdI in clickedItemIDs
            if itemIdI not in self._clickedItems[userID]
        ]

        print("windowOfItemIDsI: " + str(windowOfItemIDsI))
        print("rItemIDs: " + str(rItemIDs))
        print("uObservation: " + str(uObservation))
        print("candidatesToClick: " + str(candidatesToClick))
        print("clickedItemIDs: " + str(clickedItemIDs))
        print("clickedNewItemIDs: " + str(clickedNewItemIDs))
        print("historyOfClickedItems: " + str(self._clickedItems[userID]))

        for clickedNewItemIdI in clickedNewItemIDs:
            evaluationDict[AEvalTool.CLICKS] = evaluationDict.get(
                AEvalTool.CLICKS, 0) + 1

            evaluatonTool.click(
                userID, rItemIDsWithResponsibility, clickedNewItemIdI,
                portfolioModel,
                args | {self.ARG_STATUS: counterI / counterMax})

            self._clickedItems[userID].append(clickedNewItemIdI)

        # store port model time evolution to file
        self.portModelTimeEvolutionFiles[portId].write(
            str(counterI) + " / " + str(counterMax) + "\n")
        self.portModelTimeEvolutionFiles[portId].write("currentItemID: " +
                                                       str(currentItemID) +
                                                       "\n")
        self.portModelTimeEvolutionFiles[portId].write("userID: " +
                                                       str(userID) + "\n")
        self.portModelTimeEvolutionFiles[portId].write(
            str(portfolioModel.to_json()) + "\n\n")

        # store history of recommendations to file
        self.historyOfRecommendationFiles[
            portfolioDesc.getPortfolioID()].write("userID: " + str(userID) +
                                                  "\n")
        self.historyOfRecommendationFiles[
            portfolioDesc.getPortfolioID()].write("currentItemID: " +
                                                  str(currentItemID) + "\n")
        self.historyOfRecommendationFiles[
            portfolioDesc.getPortfolioID()].write("rItemIDs: " +
                                                  str(rItemIDs) + "\n")
        self.historyOfRecommendationFiles[
            portfolioDesc.getPortfolioID()].write("uObservation: " +
                                                  str(uObservation) + "\n")
        self.historyOfRecommendationFiles[
            portfolioDesc.getPortfolioID()].write("clickedItemIDs: " +
                                                  str(clickedItemIDs) + "\n\n")
        self.historyOfRecommendationFiles[portfolioDesc.getPortfolioID(
        )].write("clickedNewItemIDs: " + str(clickedNewItemIDs) + "\n\n")

        # save log of history
        history.insertRecomAndClickedItemIDs(userID, rItemIDs, clickedItemIDs)

        # delete log of history
        lengthOfHistory: int = 10 * self._recomRepetitionCount * self._numberOfAggrItems
        #print("lengthOfHistory: " + str(lengthOfHistory))
        history.deletePreviousRecomOfUser(userID, lengthOfHistory)