MapReduce 基礎演算法【單詞共現演算法】
阿新 • • 發佈:2019-01-11
基本設計
設有一個英文語句:
- 設共現視窗定義為連續出現的兩個單詞,如下圖給出上句英文的共現矩陣。
單詞共現演算法實現(虛擬碼)
Map端虛擬碼如下:
class Mapper
method Map(dociddid, doc d)
for all word w 屬於 d
for all word u 屬於 Window(w)
//發射出現計數 1
Emit (pair (w, u), 1)
Reduce 端虛擬碼如下:
class Reducer
method Reduce(pair p; countlist [c1, c2,..])
s = 0
for all count c in countlist [c1, c2, ...]
s = s+ c
Emit(pair p, count s)
- 上述Mapper虛擬碼中使用了一個window定義,表示如果單詞w的視窗u 屬於w的視窗內,則認為是(u,w)的一次出現。這裡的視窗Windows可以根據不同的應用需求有不同的定義,比例,可以定義為一個固定大小的視窗,或者是前者相連出現、在同義句中、在同一段落中出現的單詞等。
- 例如,如果視窗中的單詞為[w1, w2, w3],我們發射((w1,w2),1)和((w1,w3),1)出去然後視窗向後移動一個單詞。REduce階段則對發來的相同鍵的值進行簡單的求和即可。這裡單詞順序有無關係需要看具體的情況而定。另外,在實際實現中我們需要傳入Map的資料時以一個文字為單位的,這裡需要實現一個以便一個文字唄拆分被整個傳入到一個Map節點。
例如,
在Map階段,一個Map節點接受到如圖所示的一個文件的內容,
視窗大小為7
,那麼首先視窗先覆蓋了,然後,該結點將鍵值對,,,,發射出去。隨後視窗向後滑動一格,與上面相似,這時將,,,,,,發射出去。最後再向後滑動一一個單詞至文件的末尾,與上面相似,傳送相應的鍵值對出去。當視窗尾部已經到達文件尾部時,滑動視窗則通過將視窗頭部向後“縮排”來進行,此過程一直進行到視窗大小為2停止。
單詞共現演算法實現中的細節問題
- 發射出去的單詞對需要自定義以個類,該類需要實現介面。需要重寫自定義類WordPair的hashCode()方法,使得相同的主鍵都被髮送到相同的節點去。另外,我們還需要重寫和equals()方法使得相同的