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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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():
|
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Программа завершена!")
|
print("\nПрограмма завершена!")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user