Scala将项列表映射到值

时间:2013-03-07 23:16:11

标签: list scala map

我有一个 bigrams 的句子列表和另一个 relatedbigrams 的原始列表,我想查看是否有任何 relatedbigrams 在句子中出现然后我想返回句子。我正在考虑按如下方式实现它:将列表中的每个bigrams映射到它们来自的句子然后在键上搜索并返回值。

示例:

relevantbigrams = (This is, is not, not what)
bigrams List(list(This of, of no, no the),list(not what, what is))

所以每个列表都是单独句子的二元组。这里“不是什么”从第二句开始匹配,所以我想回到第二句。我打算有一张Map地图(“This of” - >“This of no the”,“no no” - >“这不是”,“不是什么” - >“不是什么” )。返回与相关二元组相匹配的句子,所以在这里我返回“不是什么”

这是我的代码:

val bigram = usableTweets.map(x =>Tokenize(x).sliding(2).flatMap{case Vector(x,y) => List(x+" "+y)}.map(z => z, x))
for(i<- 0 to relevantbigram.length)
    if(bigram.contains(relevantbigram(i)))) bigram.get(relevantbigram(i))
    else useableTweets.head

1 个答案:

答案 0 :(得分:1)

您收到订单或flatMapmap错误的方式:

val bigramMap = usableTweets.flatMap { x => 
    x.split(" ").sliding(2).
      map(bg => bg.mkString(" ") -> x)
} toMap

然后你可以像这样进行搜索:

relevantbigrams collect { rb if theMap contains rb => bigramMap(rb) }

val found = 
  for { 
    rb <- relevantbigrams
    sentence <- theMap get rb
  } yield sentence

两者都应该为您提供一个列表,但是如果您的搜索没有找到任何内容,则从您的代码中看起来您希望默认为第一句:

found.headOption.getOrElse(usableTweets.head)