First working version
This commit is contained in:
parent
3fdfba4024
commit
bb5b9ac705
10
data/data.txt
Normal file
10
data/data.txt
Normal file
@ -0,0 +1,10 @@
|
||||
Alice|5|Отличный товар, очень доволен покупкой!
|
||||
Bob|2|Качество плохое, разочарован полностью.
|
||||
Carol|4|Хороший товар, но доставка медленная.
|
||||
Dave|1|Ужасный опыт, больше не куплю.
|
||||
Emma|5|Прекрасное качество и быстрая доставка!
|
||||
Frank|3|Средний товар, ничего особенного.
|
||||
Grace|4|Довольно хороший, рекомендую.
|
||||
Henry|2|Не соответствует описанию.
|
||||
Irene|5|Очень понравилось, супер!
|
||||
Jack|1|Плохо, деньги на ветер.
|
||||
168
reviews.py
168
reviews.py
@ -1,32 +1,180 @@
|
||||
import os.path
|
||||
import string
|
||||
|
||||
|
||||
def load_reviews(filepath: str) -> list:
|
||||
return None
|
||||
reviews = []
|
||||
if not os.path.exists(filepath):
|
||||
print("Файл отзывов не найден!")
|
||||
return reviews
|
||||
with open(filepath, "r", encoding="utf-8") as file:
|
||||
for line in file:
|
||||
line = line.strip()
|
||||
parts = line.split("|")
|
||||
username, rating, text = parts
|
||||
reviews.append({
|
||||
"username": username.strip(),
|
||||
"rating": int(rating),
|
||||
"text": text.strip()
|
||||
})
|
||||
return reviews
|
||||
|
||||
|
||||
def filter_by_rating(reviews: list, min_rating: int, max_rating: int) -> list:
|
||||
return None
|
||||
filtered_reviews = []
|
||||
for rev in reviews:
|
||||
rating = rev["rating"]
|
||||
if min_rating <= rating <= max_rating:
|
||||
filtered_reviews.append(rev)
|
||||
return filtered_reviews
|
||||
|
||||
|
||||
def get_average_rating(reviews: list) -> float:
|
||||
return None
|
||||
if not reviews:
|
||||
return 0.0
|
||||
|
||||
total = sum(rev["rating"] for rev in reviews)
|
||||
avg = total / len(reviews)
|
||||
return round(avg, 2)
|
||||
|
||||
|
||||
def count_words_in_review(review: dict) -> int:
|
||||
return None
|
||||
text = review.get("text", "")
|
||||
words = text.split()
|
||||
return len(words)
|
||||
|
||||
|
||||
def find_longest_review(reviews: list) -> dict:
|
||||
return None
|
||||
if not reviews:
|
||||
return {}
|
||||
|
||||
return max(reviews, key=count_words_in_review)
|
||||
|
||||
|
||||
def build_word_frequency(reviews: list) -> dict:
|
||||
return None
|
||||
freq = {}
|
||||
translator = str.maketrans("", "", string.punctuation)
|
||||
|
||||
for review in reviews:
|
||||
text = review["text"].lower()
|
||||
text = text.translate(translator)
|
||||
words = text.split()
|
||||
|
||||
for word in words:
|
||||
freq[word] = freq.get(word, 0) + 1
|
||||
|
||||
return freq
|
||||
|
||||
|
||||
def get_top_words(freq_dict: dict, n: int) -> list:
|
||||
return None
|
||||
sorted_words = sorted(
|
||||
freq_dict.items(),
|
||||
key=lambda x: x[1],
|
||||
reverse=True
|
||||
)
|
||||
return sorted_words[:n]
|
||||
|
||||
|
||||
def group_reviews_by_rating(reviews: list) -> dict:
|
||||
return None
|
||||
grouped = {
|
||||
item: []
|
||||
for item in range(1, 6)
|
||||
}
|
||||
|
||||
for rev in reviews:
|
||||
rating = rev["rating"]
|
||||
grouped[rating].append(rev)
|
||||
|
||||
return grouped
|
||||
|
||||
|
||||
def format_summary(reviews: list, top_words: list, avg_rating: float) -> str:
|
||||
return None
|
||||
total_reviews = len(reviews)
|
||||
usernames = sorted({
|
||||
rev["username"]
|
||||
for rev in reviews
|
||||
})
|
||||
|
||||
report_lines = [
|
||||
"=== Отчёт по отзывам ===",
|
||||
"Общее количество отзывов: " + str(total_reviews),
|
||||
"Средний рейтинг: " + str(avg_rating),
|
||||
"",
|
||||
"Топ слов:"
|
||||
]
|
||||
|
||||
for word, count in top_words:
|
||||
report_lines.append("- " + word + ": " + str(count))
|
||||
|
||||
report_lines.append("")
|
||||
report_lines.append("Пользователи:")
|
||||
|
||||
for user in usernames:
|
||||
report_lines.append("- " + user)
|
||||
|
||||
result = "\n".join(report_lines)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def save_report(report: str, output_path: str) -> None:
|
||||
directory = os.path.dirname(output_path)
|
||||
|
||||
if directory and not os.path.exists(directory):
|
||||
os.makedirs(directory)
|
||||
|
||||
with open(output_path, "w", encoding="utf-8") as file:
|
||||
file.write(report)
|
||||
|
||||
|
||||
def main():
|
||||
filepath = "data/data.txt"
|
||||
|
||||
# Загрузка отзывов из файла
|
||||
reviews = load_reviews(filepath)
|
||||
print("Загружено отзывов:", len(reviews))
|
||||
|
||||
# Средний рейтинг
|
||||
avg_rating = get_average_rating(reviews)
|
||||
print("Средний рейтинг: " + str(avg_rating))
|
||||
|
||||
# Фильтрация по рейтингу
|
||||
positive = filter_by_rating(reviews, 4, 5)
|
||||
negative = filter_by_rating(reviews, 1, 2)
|
||||
|
||||
print("\nПоложительных отзывов:", len(positive))
|
||||
print("Отрицательных отзывов:", len(negative))
|
||||
|
||||
# Самый длинный отзыв
|
||||
longest = find_longest_review(reviews)
|
||||
if longest:
|
||||
print("\nСамый длинный отзыв:")
|
||||
print(longest['username'] + ": " + longest['text'])
|
||||
|
||||
# Топ-5 слов
|
||||
freq = build_word_frequency(reviews)
|
||||
top_words = get_top_words(freq, 5)
|
||||
|
||||
print("\nТоп-5 слов:")
|
||||
for word, count in top_words:
|
||||
print(str(word) + ": " + str(count))
|
||||
|
||||
# Группировка
|
||||
grouped = group_reviews_by_rating(reviews)
|
||||
|
||||
print("\nКоличество отзывов по рейтингам:")
|
||||
for rating in range(1, 6):
|
||||
print(str(rating) + ": " + str(len(grouped[rating])))
|
||||
|
||||
# Отчёт
|
||||
report = format_summary(reviews, top_words, avg_rating)
|
||||
print("\n" + report)
|
||||
|
||||
# Сохранение отчёта
|
||||
save_report(report, "data/report.txt")
|
||||
|
||||
print("\nПрограмма завершена!")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
main()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user