2014-10-14 2 views
0

내지도 대신 단어 수의 텍스트의 체크에 출력 상단 bigrams을 파일을 감소 변경 찾고 있어요, 그래서 두 단어와 음절 수맵리 듀스 및 파이썬 : Bigrams

이것은 내 현재 코드 접근.

지도 :

import sys 

for line in sys.stdin: 
    line = line.strip() 
    words = line.split() #bigrams = line.split() 
    for word in words: #for bigram in words 
     print '%s\t%s' % (word,1) #print ... word pair??? 

가 감소 :
mydict = dict() 
for line in sys.stdin: 
    (word,cnt) = line.strip().split('\t') #bigram and bigram count 
    mydict[word] = mydict.get(word,0) 1 

for word,cnt in mydict.items(): 
    print word,cnt      #print bigram and bigram count 

감사합니다.

bigrams를 컴퓨팅하기위한 인기있는 솔루션으로 nltk를 보았습니다. mapreduce 형식에서도 이러한 접근 방식을 사용해야합니까?

답변

0

나는 stdin 및 stdout을 사용하지 않을 것이다. 차라리 이것 multiprocessing을 던져 읽기 일부 저장 한 파일에서 줄 :이 테스트하지 않았습니다

import multiprocessing as mp 

def main(infilepath): 
    bgqIn, bgqOut = [mp.Queue() for _ in xrange(2)] 
    procs = [mp.Process(target=mapper, args=(bgqIn, bgqOut)) for _ in xrange(mp.cpu_count())] 
    for p in procs: 
     p.start() 
    with open(infilepath) as infile: 
     first = '' 
     second = '' 
     for line in infile: 
      line = line.lower() 
      for word in line.split(): 
       first = second 
       second = word 
       bigram = (first, second) 
       bgqIn.put(bigram) 
     for p in procs: 
      bgqIn.put(None) 

    rqs = [(mp.Queue() for _ in xrange(2)) for i in xrange(mp.cpu_count())] 
    rprocs = [mp.Process(target=reducer, args=(*rqs[i])) for i in xrange(mp.cpu_count())] 
    for p in rprocs: 
     p.start() 
    qmap = {} 
    for char in xrange(97,123): 
     qmap[ord(char)] = rqs[(char-97)/len(rqs)] 
    dones = 0 
    while dones != len(procs): 
     t = bgqOut.get() 
     if t is None: 
      dones += 1 
     else: 
      qmap[t[0][0]].put(t) 
    for q in rqs: 
     q.put(None) 

    answer = {} 
    for q in rqs: 
     for bg,count in iter(q.get, None): 
      if bg not in answer: 
       answer[bg] = 0 
      answer[bg] += count 

    for bg,count in answer.iteritems(): 
     print "There are", count, "occurrences of", bg 

def mapper(qIn, qOut): 
    counts = {} 
    for bg in iter(qIn.get, None): 
     if bg not in counts: 
      counts[bg] = 0 
     counts[bg] += 1 
    for k,v in counts.iteritems(): 
     qOut.put((k,v)) 
    qOut.put(None) 

def reducer(qIn, qOut): 
    counts = {} 
    for bg,count in iter(qIn.get, None): 
     if bg not in counts: 
      counts[bg] = 0 
     counts[bg] += count 
    for bg,count in counts.iteritems(): 
     qOut.put((bg,count)) 
    qOut.put(None) 

을, 그러나 당신이 시작하는해야 기본 골격이다.

관련 문제