реализация функций filter_valid_reviews и calculate_average_rating_by_topic

This commit is contained in:
Максим Гетман 2026-04-27 10:59:11 +03:00
parent d2873ab899
commit 14e59aaabc

227
main.py
View File

@ -1,103 +1,6 @@
# Система анализа и модерации отзывов на товары (E-Commerce Review Engine) # Система анализа и модерации отзывов на товары (E-Commerce Review Engine)
def clean_text(text: str): #словари
black_list = ",?:();-+=*%"
for i in range(len(black_list)):
text = text.replace(black_list[i], '')
text = text.lower()
for i in range(len(text)):
text = text.replace(' ', ' ')
return text
def extract_keywords(text: str, keywords_dict: dict):
empty_list = []
for k, v in keywords_dict.items():
for i in v:
if i in text:
empty_list.append(k)
return (list(set(empty_list)))
def calculate_sentiment_score(text: str, positive_words: set, negative_words: set):
pos_count = 0
neg_count = 0
for i in positive_words:
if i in text:
pos_count += 1
for i in negative_words:
if i in text:
neg_count += 1
sentiment = (pos_count - neg_count) / (pos_count + neg_count)
return sentiment
def validate_rating(rating: int):
if -1 <= rating <= 5:
res = True
else:
res = False
return res
def is_spam(text: str, spam_indicators: list):
res = False
caps_count = 0
for i in spam_indicators:
print(i)
if i in text:
res = True
if res == False:
for i in range(len(text)):
if text[i].isupper():
caps_count += 1
if caps_count > len(text) / 2:
res = True
break
return res
def enrich_review(review: dict, keywords_dict: dict, positive_words: set, negative_words: set):
upgrade_review = {
"id": review.get("id"),
"rating": review.get("rating"),
"text": review.get("text"),
"clean_txt": clean_text(review.get("text")),
"sentiment": calculate_sentiment_score(review.get("text"), positive_words, negative_words),
"topics": extract_keywords(review.get("text"), keywords_dict)
}
return upgrade_review
def filter_valid_reviews(reviews: list):
return list
def calculate_average_rating_by_topic(reviews: list):
return dict
def detect_anomalies(reviews: list, sentiment_threshold: float = 0.5):
return list
def generate_summary_report(valid_reviews: list, all_reviews_count: int, anomalies: list):
return dict
def main():
positive_words = {"отличное качество", "высокое качество", "хорошее качество",
"качественный", "добротный", "надежный", "прочный", "долговечный",
"превосходный", "безупречный", "аккуратно сделан", "хорошая сборка",
"качественные материалы", "ничего не люфтит", "сидит плотно",
"отлично работает", "супер", "огонь", "класс", "достойный",
"не уступает бренду", "сделан на совесть"}
negative_words = {"плохое качество", "низкое качество", "дешевый", "хлипкий",
"непрочный", "недолговечный", "брак", "некачественный", "сыпется",
"ломается", "разваливается", "плохая сборка", "криво сделано",
"зазоры", "люфтит", "скрипит", "хрупкий", "одноразовый", "дешевка",
"не соответствует заявленному", "отвратительное качество",
"ужасное качество", "худшее качество", "мусор", "шлак", "не годится"}
spam_indicators = [ spam_indicators = [
"заработок в интернете", "легкие деньги", "пассивный доход", "заработок в интернете", "легкие деньги", "пассивный доход",
"быстрый заработок", "миллион за неделю", "лотерея", "быстрый заработок", "миллион за неделю", "лотерея",
@ -106,6 +9,20 @@ def main():
"как заработать", "деньги просто так", "криптовалюта без риска", "как заработать", "деньги просто так", "криптовалюта без риска",
"финансовая пирамида", "реферальная программа", "партнерская программа" "финансовая пирамида", "реферальная программа", "партнерская программа"
] ]
positive_words = {"отличное качество", "высокое качество", "хорошее качество",
"качественный", "добротный", "надежный", "прочный", "долговечный",
"превосходный", "безупречный", "аккуратно сделан", "хорошая сборка",
"качественные материалы", "ничего не люфтит", "сидит плотно",
"отлично работает", "супер", "огонь", "класс", "достойный",
"не уступает бренду", "сделан на совесть"
}
negative_words = {"плохое качество", "низкое качество", "дешевый", "хлипкий",
"непрочный", "недолговечный", "брак", "некачественный", "сыпется",
"ломается", "разваливается", "плохая сборка", "криво сделано",
"зазоры", "люфтит", "скрипит", "хрупкий", "одноразовый", "дешевка",
"не соответствует заявленному", "отвратительное качество",
"ужасное качество", "худшее качество", "мусор", "шлак", "не годится"
}
delivery_words = [ delivery_words = [
"быстрая доставка", "бесплатная доставка", "доставка вовремя", "курьер вежливый", "быстрая доставка", "бесплатная доставка", "доставка вовремя", "курьер вежливый",
"упаковано хорошо", "доставка день в день", "отслеживание", "пришло целым", "упаковано хорошо", "доставка день в день", "отслеживание", "пришло целым",
@ -133,24 +50,130 @@ def main():
"delivery": delivery_words, "delivery": delivery_words,
"price": price_words "price": price_words
} }
def clean_text(text: str): # чистит текст отзыва от знаков препинания
black_list = ",?:();-+=*%"
for i in range(len(black_list)):
text = text.replace(black_list[i], '')
text = text.lower()
for i in range(len(text)):
text = text.replace(' ', ' ')
return text
def extract_keywords(text: str, keywords_dict: dict): # поиск категорий, упомянутых в тексте
empty_list = []
for k, v in keywords_dict.items():
for i in v:
if i in text:
empty_list.append(k)
return (list(set(empty_list)))
def calculate_sentiment_score(text: str, positive_words: set, negative_words: set): # тональность текста [-1: 1]
pos_count = 0
neg_count = 0
for i in positive_words:
if i in text:
pos_count += 1
for i in negative_words:
if i in text:
neg_count += 1
sentiment = (pos_count - neg_count) / (pos_count + neg_count)
return sentiment
def validate_rating(rating: int): # проверка рейтинга в [1: 5]
if 1 <= rating <= 5:
res = True
else:
res = False
return res
def is_spam(text: str, spam_indicators: list): # проверяет сырой текст на спам
res = False
caps_count = 0
for i in spam_indicators:
if i in text:
res = True
if res == False:
for i in range(len(text)):
if text[i].isupper():
caps_count += 1
if caps_count > len(text) / 2:
res = True
break
return res
def enrich_review(review: dict, keywords_dict: dict, positive_words: set, negative_words: set): # обогащенный словарь
upgrade_review = {
"id": review.get("id"),
"rating": review.get("rating"),
"text": review.get("text"),
"clean_txt": clean_text(review.get("text")),
"sentiment": calculate_sentiment_score(review.get("text"), positive_words, negative_words),
"topics": extract_keywords(review.get("text"), keywords_dict)
}
return upgrade_review
def filter_valid_reviews(reviews: list): # фильтрует отзывы
valid_base = []
for i in range(len(reviews)):
if validate_rating(reviews[i].get('rating')) and not (
is_spam(reviews[i].get("text"), spam_indicators)) and not (reviews[i].get('clean_txt') == ''):
valid_base.append(reviews[i])
return valid_base
def calculate_average_rating_by_topic(reviews: list):
avg = dict()
for i in reviews:
for j in i.get("topics"):
avg[j] = None
for i in avg:
srz = {'summ': 0, 'lens': 0}
for j in range(len(reviews)):
print(reviews[j])
if i in reviews[j].get('topics'):
print(i, reviews[j].get("rating"))
srz['summ'] += reviews[j].get("rating")
srz['lens'] += 1
avg[i] = srz.get("summ") / srz.get("lens")
return avg
def detect_anomalies(reviews: list, sentiment_threshold: float = 0.5):
return list
def generate_summary_report(valid_reviews: list, all_reviews_count: int, anomalies: list):
return dict
def main():
print("\n======== Введите название файла с форматом .csv или используйте по умолчанию (Enter) ========") print("\n======== Введите название файла с форматом .csv или используйте по умолчанию (Enter) ========")
name_report = input() name_report = input()
if not name_report: if not name_report:
name_report = "data.csv" name_report = "data.csv"
if name_report[-4:] == ".csv": #проверка на правильность ввода имени файла if name_report[-4:] == ".csv": #проверка на правильность ввода имени файла
try: try:
report = open(name_report, 'r+', encoding='cp1251') #открытие файла report = open(name_report, 'r+', encoding='utf-8') #открытие файла
except: except:
print("Файл отсутствует") print("Файл отсутствует")
else: else:
print("Содержимое файла:") #запись файла в список print("Содержимое файла:") #запись файла в список
dec_report = list() review = list()
for i in report: for i in report:
i = i.replace("\n", '') #убираем отступы в концы строки i = i.replace("\n", '') #убираем отступы в концы строки
dec_report.append(clean_text(i)) review.append(i)
report.close() report.close()
print("id rating text") print("id rating text")
for i in dec_report: for i in review:
print(i) print(i)
else: else:
print("Неверный тип файла! " print("Неверный тип файла! "