0

mincemeat.py という map reduce の実装を使用しています。map 関数と reduce 関数が含まれています。最初に、私が達成しようとしていることを述べます。プログラミングの課題があるビッグデータのコーセラコースを行っています。問題は、paperid:::author1::author2::author3:::papertitle という形式のデータを含むファイルが何百もあるということです。

私たちはすべてのファイルを調べて、特定の著者のために、彼が最大限に使用した言葉を与えなければなりません。そのため、次のコードを書きました。

import re

import glob
import mincemeat
from collections import Counter
text_files = glob.glob('test/*')

def file_contents(file_name):
    f = open(file_name)
    try:
        return f.read()
    finally:
        f.close()

datasource = dict((file_name, file_contents(file_name)) for file_name in text_files)

def mapfn(key, value):
    for line in value.splitlines():
        wordsinsentence = line.split(":::")
        authors = wordsinsentence[1].split("::")
        # print authors
        words = str(wordsinsentence[2])
        words = re.sub(r'([^\s\w-])+', '', words)
        # re.sub(r'[^a-zA-Z0-9: ]', '', words)
        words = words.split(" ")
        for author in authors:
            for word in words:
                word = word.replace("-"," ")
                word = word.lower()
                yield author, word

def reducefn(key, value):
    return Counter(value)

s = mincemeat.Server()
s.datasource = datasource
s.mapfn = mapfn
s.reducefn = reducefn
results = s.run_server(password="changeme")
# print results

i = open('outfile','w')
i.write(str(results))
i.close()

私の問題は、すべての著者について、reduce関数が著者名と彼のタイトルで使用したすべての単語を受け取る必要があることです。だから私は次のような出力を期待していました

{authorname: Counter({'word1':countofword1,'word2':countofword2,'word3':countofword3,..}). 

しかし、私が得るのは

authorname: (authorname, Counter({'word1': countofword1,'word2':countofword2}))

誰かがなぜそのようなことが起こっているのか教えてもらえますか? 質問を解決するのに助けは必要ありません。なぜそのようなことが起こっているのかを知るために助けが必要です!

4

2 に答える 2

1

コードを実行しましたが、期待どおりに動作していることがわかります。出力は {authorname : Counter({'word1':countofword1,'word2':countofword2,'word3':countofword3,..}) のようになります。

それは言った。Coursera 倫理規定に違反しているため、ここからコードを削除してください。

于 2013-05-22T13:58:47.887 に答える
0

カウンターの前に reducefn の値のデータ構造を確認してください。

def reducefn(key, value):

    print(value)

    return Counter(value)
于 2012-10-05T00:01:06.270 に答える