繁体   English   中英

Apache Flink - 预测处理

[英]Apache Flink - Prediction Handling

我目前正在使用 Apache Flink 的 SVM-Class 来预测一些文本数据。

class 提供了一个预测函数,它将 DataSet[Vector] 作为输入并给我一个 DataSet[Prediction] 作为结果。 到目前为止,一切都很好。

我的问题是,我没有预测属于哪个文本的上下文,并且我无法在 predict() 函数中插入文本以便之后拥有它。

代码:

val tweets: DataSet[(SparseVector, String)] =
        source.flatMap(new SelectEnglishTweetWithCreatedAtFlatMapper)
                .map(tweet => (featureVectorService.transform(tweet._2))

    model.predict(tweets).print


result example:
(SparseVector((462,8.73165920153676), (10844,8.508515650222549), (15656,2.931052542245018)),-1.0)

有没有办法将其他数据保留在预测旁边以将所有内容放在一起? 因为没有上下文,预测对我没有帮助。

或者也许有一种方法可以只预测一个向量而不是数据集,我可以在上面的 map function 中调用 function。

SVM预测器期望作为输入的子类型Vector 因此有两种方法可以解决这个问题:

  1. 创建一个包含推文文本作为标签的Vector子类型。 然后它将通过预测器循环。 这种方法的优点是不需要额外的操作。 但是,需要定义新的类和实用程序来用标签表示不同的向量类型:
val env = ExecutionEnvironment.getExecutionEnvironment

val input = env.fromElements("foobar", "barfo", "test")

val vectorizedInput = input.map(word => {
  val value = word.chars().sum()
  new DenseVectorWithTag(Array(value), word)
})

val svm = SVM().setBlocks(env.getParallelism)

val weights = env.fromElements(DenseVector(1.0))

svm.weightsOption = Option(weights) // skipping the training here

val predictionResult: DataSet[(DenseVectorWithTag, Double)] = svm.predict(vectorizedInput)

class DenseVectorWithTag(override val data: Array[Double], tag: String)
  extends DenseVector(data) {
  override def toString: String = "(" + super.toString + ", " + tag + ")"
}
  1. 将预测DataSettweets的矢量化表示上的输入数据DataSet连接起来。 这种方法的优点是我们不需要引入新的类。 我们为此付出的代价是额外的连接操作,这可能很昂贵:
val input = env.fromElements("foobar", "barfo", "test")

val vectorizedInput = input.map(word => {
  val value = word.chars().sum()
  (DenseVector(value), word)
})

val svm = SVM().setBlocks(env.getParallelism)

val weights = env.fromElements(DenseVector(1.0))

svm.weightsOption = Option(weights) // skipping the training here

val predictionResult = svm.predict(vectorizedInput.map(a => a._1))
val inputWithPrediction: DataSet[(String, Double)] = vectorizedInput
  .join(predictionResult)
  .where(0)
  .equalTo(0)
  .apply((t, p) => (t._2, p._2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM