2013-03-07 98 views
0

我有二元语法句子relevantbigrams另一个原始列表的列表清单,我要检查,如果有任何的relevantbigrams的是存在于句子,然后我想返回这个句子。我正在考虑如下实现它:将列表中的每个bigrams映射到它们来自的句子,然后在键上搜索并返回值。斯卡拉地图项的值

例如:

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

所以每个列表是单独的句子的两字。第二句话中的“不是什么”匹配,所以我想返回第二句话。我打算有一张地图(“这个” - >“这个没有”,“没有” - >“这个没有”,“不是什么” - >“不是什么”)。等,并返回匹配相关两字的句子,所以在这里我回来“也不是什么”

这是我的代码:

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 
+0

所有集合类有'forall'和'exists' HOFs带一个谓词,将其应用于集合的元素,并且如果该谓词对集合中的所有元素('forall')或任何(存在')都是真的,则返回'true'。这听起来像可以帮助你。 – 2013-03-08 02:46:04

回答

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)