我正在尝试理解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])
我理解的是,在使用mincemeat.py时我们无法在map中生成列表,因为错误表明在减少时不会出现列表。我对么?如果我是对的,有什么办法可以做到这一点吗?或者,我是否需要查看除百果馅之外的任何其他库?
答案 0 :(得分:3)
我不知道百里香,但很明显,它试图将列表用作字典或集合的键,这是不可能的。而不是产生一个列表,而是尝试产生一个元组。 (换句话说,将[word.lower(),k]
更改为(word.lower(), k)
。