mapreduce词频统计并排序的代码
时间: 2024-05-11 17:17:24 浏览: 87
以下是一个简单的 MapReduce 代码,用于计算文本中每个单词的出现次数并按照出现次数进行排序。
Mapper:
```python
import re
def mapper(key, value):
words = re.findall('\w+', value.lower())
for word in words:
yield word, 1
```
Reducer:
```python
def reducer(key, values):
yield sum(values), key
```
排序:
```python
def sort(count, word):
yield None, (count, word)
def top_n_reducer(key, values):
for count, word in sorted(values, reverse=True)[:N]:
yield count, word
```
完整代码:
```python
import re
N = 10
def mapper(key, value):
words = re.findall('\w+', value.lower())
for word in words:
yield word, 1
def reducer(key, values):
yield sum(values), key
def sort(count, word):
yield None, (count, word)
def top_n_reducer(key, values):
for count, word in sorted(values, reverse=True)[:N]:
yield count, word
if __name__ == '__main__':
input_data = ['big data', 'data science', 'machine learning', 'deep learning', 'big data']
mapped_data = [mapper(None, d) for d in input_data]
shuffled_data = sorted([item for sublist in mapped_data for item in sublist])
reduced_data = [reducer(key, group) for key, group in itertools.groupby(shuffled_data, lambda x: x[0])]
sorted_data = [sort(count, word) for count, word in reduced_data]
top_n_data = [top_n_reducer(key, group) for key, group in itertools.groupby(sorted_data, lambda x: x[0])]
for count, word in itertools.chain(*top_n_data):
print('%s: %i' % (word, count))
```
在这个例子中,我们定义了一个 `N` 变量,表示我们只想要统计前 `N` 个最常出现的单词。然后,我们定义了一个 `mapper` 函数,它将每个单词映射到一个 `(word, 1)` 键值对。接下来,我们定义了一个 `reducer` 函数,它将每个单词的出现次数相加。最后,我们定义了一个 `sort` 函数,它对 `(count, word)` 键值对进行排序,并定义了一个 `top_n_reducer` 函数,它只返回前 `N` 个最常出现的单词。
在 `main` 函数中,我们首先定义了一些输入数据。然后,我们使用 `mapped_data` 变量将每个输入数据中的单词映射到键值对。接下来,我们使用 `shuffled_data` 变量将所有键值对按键进行排序。然后,我们使用 `reduced_data` 变量将所有具有相同键的键值对合并到一起。接下来,我们使用 `sorted_data` 变量对所有 `(count, word)` 键值对进行排序。最后,我们使用 `top_n_data` 变量返回前 `N` 个最常出现的单词,并将它们打印出来。
阅读全文