-
Notifications
You must be signed in to change notification settings - Fork 0
/
map-reduce04.py
74 lines (52 loc) · 2.16 KB
/
map-reduce04.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import string
from concurrent.futures import ThreadPoolExecutor
from collections import defaultdict
import requests
def get_text(url):
try:
response = requests.get(url)
response.raise_for_status() # Перевірка на помилки HTTP
return response.text
except requests.RequestException as e:
return None
# Функція для видалення знаків пунктуації
def remove_punctuation(text):
return text.translate(str.maketrans("", "", string.punctuation))
def map_function(word):
return word, 1
def shuffle_function(mapped_values):
shuffled = defaultdict(list)
for key, value in mapped_values:
shuffled[key].append(value)
return shuffled.items()
def reduce_function(key_values):
key, values = key_values
return key, sum(values)
# Виконання MapReduce
def map_reduce(text, search_words=None):
# Видалення знаків пунктуації
text = remove_punctuation(text)
words = text.split()
# Якщо задано список слів для пошуку, враховувати тільки ці слова
if search_words:
words = [word for word in words if word in search_words]
# Паралельний Маппінг
with ThreadPoolExecutor() as executor:
mapped_values = list(executor.map(map_function, words))
# Крок 2: Shuffle
shuffled_values = shuffle_function(mapped_values)
# Паралельна Редукція
with ThreadPoolExecutor() as executor:
reduced_values = list(executor.map(reduce_function, shuffled_values))
return dict(reduced_values)
if __name__ == "__main__":
# Вхідний текст для обробки
url = "https://gutenberg.net.au/ebooks01/0100021.txt"
text = get_text(url)
if text:
# Виконання MapReduce на вхідному тексті
search_words = ["war", "peace", "love"]
result = map_reduce(text, search_words)
print("Результат підрахунку слів:", result)
else:
print("Помилка: Не вдалося отримати вхідний текст.")