2013-03-07 43 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)