我正在尝试理解map-reduce的概念,并考虑使用mincemeat.py (python的开源库)实现小程序。
我已经使用mapper和reducer获得了一个单词包的简单单词计数。但是,我想实现查找文档中所有单词的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])
我所理解的是,当使用mincemeatpy时,我们不能在map中产生列表,因为错误说列表在减少时不是预期的。我说的对吗?如果我是对的,有没有办法做到这一点?或者,除了mincemate,我还需要查看其他库吗?
我不知道mincemeat,但很明显,它试图使用列表作为字典或集合的键,这是不可能的。不要生成一个列表,而是尝试生成一个元组。(即将[word.lower(),k]
改为(word.lower(), k)
)