1

map-reduce の概念を理解しようとしており、Python 用のオープン ソース ライブラリである mincemeat.py を使用して小さなプログラムを実装することを検討しています。

マッパーとリデューサーを使用して、単語の袋の単純な単語数を取得しました。ただし、ドキュメント全体のすべての単語の tf-idf スコアを見つけることを実装したいと思います。これを達成するために、私が考えた最初のステップは、タイプの辞書を取得すること{[word,docID]->count}です。このために、私は次のコードを書きました

def mapfn(k, v):
    for line in v.splitlines():
        for word in line.split():
            l = [word.lower(), k]
            yield l, 1

ただし、プログラムを実行すると、次のエラーが発生します。

error: uncaptured python exception, closing channel <__main__.Client connected at 0x8a434ac> 
(<type 'exceptions.TypeError'>:unhashable type: 'list'
 [/usr/lib/python2.7/asyncore.py|read|83]
 [/usr/lib/python2.7/asyncore.py|handle_read_event|444] 
 [/usr/lib/python2.7/asynchat.py|handle_read|140] 
 [mincemeat.py|found_terminator|96] 
 [mincemeat.py|process_command|194] 
 [mincemeat.py|call_mapfn|171])

私が理解しているのは、mincemeat.py を使用するとマップ内のリストを生成できないということです。これは、縮小中にリストが予期されていないというエラーが表示されるためです。私は正しいですか?私が正しければ、これを達成する方法はありますか? または、ミンスミート以外のライブラリを調べる必要がありますか?

4

1 に答える 1

3

mincemeat についてはわかりませんが、リストを辞書またはセットのキーとして使用しようとしていることは明らかですが、これは不可能です。リストを生成する代わりに、代わりにタプルを生成してみてください。(つまり、 に変更[word.lower(),k](word.lower(), k)ます。

于 2013-05-25T14:14:55.990 に答える