基本设计
设有一个英文语句:
wearenotwhatwewanttobebutatleastwearenotwhatweusedtobe. w e a r e n o t w h a t w e w a n t t o b e b u t a t l e a s t w e a r e n o t w h a t w e u s e d t o b e .
- 设共现窗口定义为连续出现的两个单词,如下图给出上句英文的共现矩阵。
单词共现算法实现(伪代码)
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的数据时以一个文本为单位的,这里需要实现一个 WholeFileInputFo