获取Array [Boolean]代替scala

时间:2018-03-31 07:57:38

标签: scala

当我执行此代码时,我必须得到Array[Int]由1和0组成。但我得到的输出是Array[Boolean],由true和false组成。 这为进一步执行带来了麻烦。我想得到0和1只应该做什么?

val reviewSenti = extracted_reviews.map(reviewText => {
  val reviewWordsSentiment = reviewText.getString(0).split(" ").map(word => {

    var senti: Int = 0;

    if (AFINN.lookup(word.toLowerCase()).length > 0) {

      senti = AFINN.lookup(word.toLowerCase())(0)

    };

    senti;

  });

  val reviewSentiment = reviewWordsSentiment.sum

  (reviewSentiment)

  if (reviewSentiment >= 3){
    reviewSentiment == 1;
  }
  else {
    reviewSentiment == 0;
  }
})

reviewSenti: Array[Boolean] = Array(false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, ...

2 个答案:

答案 0 :(得分:2)

尝试将1和另一个设为0if (reviewSentiment >= 3) 1 else 0。这可能会对你有所帮助。

就像

一样

{{1}}

答案 1 :(得分:1)

不确定代码的某些上下文。所以我在某些假设中可能是错的。在代码的第一部分中,您可能希望避免双重调用AFINN.lookup(word.toLowerCase()),所以基本上您可以使用以下内容进行映射:

  val afinnLookup = AFINN.lookup(word.toLowerCase())

  if (afinnLookup.length > 0)
    afinnLookup(0)
  else
    0

然后我再次确定你从AFFIN得到什么,但你可以使用模式匹配来避免查看长度并使用if:

affinLookup match {
  case head :: tail ⇒ head
  case _ ⇒ 0
}

或者您甚至可以使用headOption执行此操作:然后您将返回Option[Int],但之后它可能会遵循库的意图,即没有亲和力或类似的东西。基本上它可以简短:

val reviewWordsSentiment = reviewText.getString(0).split(" ").map(
    word => AFINN.lookup(word.toLowerCase()).headOption)

这会返回你Option [Int]这可能会或可能不会让你复杂化。如果你决定走这条路,这是一个非常好的指南: http://danielwestheide.com/blog/2012/12/19/the-neophytes-guide-to-scala-part-5-the-option-type.html

或者您可以在headOption之后使用fold(0){identity}getOrElse(0)来避免选项[Int]:

val reviewWordsSentiment = reviewText.getString(0).split(" ").map(
    word => AFINN.lookup(word.toLowerCase()).headOption.getOrElse(0))

这样您就可以稍后执行sum,甚至可以跳过为它分配一个最终可能需要的值。

if (reviewWordsSentiment.sum >= 3) 1 else 0

对于您提供的代码和问题,这是一个相对较多的假设。我希望这有助于或提供一些指导方针。