Как совместить два элемента объекта - PullRequest
0 голосов
/ 27 июня 2019

Я хочу объединить два отдельных результата в один результат. Мой первый результат - это itemcore из первого алгоритма:

PredictedResult(List(ItemScore(140849,0.6259532295250041,0.0,0.0,0.0)),List())

Мой второй результат - оценка правила по второму алгоритму:

PredictedResult(List(),List(Rule(Set(140855),List(ItemScore(368788,0.0,1.3516984090509725E-5,0.1111111111111111,38.59207094418362)))))

Вы видите, что первый результат имеет пустой список. Этот список заполняется во втором результате. Это также относится к количеству предметов, только наоборот.

Класс обслуживания принимает только один из двух результатов, но не комбинируется.

Serving.scala:

package org.template

import org.apache.predictionio.controller.LServing

class Serving
  extends LServing[Query, PredictedResult] {

  override
  def serve(query: Query,
    predictedResults: Seq[PredictedResult]): PredictedResult = {
    println(predictedResults(0))
    println(predictedResults(1))

    // Returning
    predictedResults(0)

    }
}

Engine.json:

    package org.template

import org.apache.predictionio.controller.EngineFactory
import org.apache.predictionio.controller.Engine

// Query most similar (top num) items to the given
case class Query(items: Set[String], num: Int) extends Serializable

case class PredictedResult(itemScores: List[ItemScore], rules: List[Rule])

case class Rule(cond: Set[String], itemScores: List[ItemScore])
  extends Serializable 

case class ItemScore(item: String, score: Double, support: Double, confidence: Double, lift: Double) extends Serializable with
Ordered[ItemScore] {
  def compare(that: ItemScore) = this.score.compare(that.score)
}

Когда я нажимаю на запрос, теперь я получаю только один результат:

{"itemScores":[{"item":"140849","score":0.6259532295250041,"support":0.0,"confidence":0.0,"lift":0.0}],"rules":[]}

Ожидаемый результат (ItemScore из алгоритма1 в сочетании с Правилом из алгоритма2):

PredictedResult(List(ItemScore(140849,0.6259532295250041,0.0,0.0,0.0)),List(Rule(Set(140855),List(ItemScore(368788,0.0,1.3516984090509725E-5,0.1111111111111111,38.59207094418362)))))

1 Ответ

3 голосов
/ 27 июня 2019

Попробуйте объединение списков ++ примерно так

case class ItemScore(i: Int)
case class Rule(s: String, itemScores: List[ItemScore])
case class PredictedResult(itemScores: List[ItemScore], rules: List[Rule])

val pr1 = PredictedResult(List(ItemScore(1)), Nil)
val pr2 = PredictedResult(Nil, List(Rule("rule1", List(ItemScore(2)))))

PredictedResult(pr1.itemScores ++ pr2.itemScores, pr1.rules ++ pr2.rules)

, который выводит

res0: PredictedResult = PredictedResult(List(ItemScore(1)),List(Rule(rule1,List(ItemScore(2)))))
...