реализация функций 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

147
main.py
View File

@ -1,6 +1,57 @@
# Система анализа и модерации отзывов на товары (E-Commerce Review Engine)
def clean_text(text: str):
#словари
spam_indicators = [
"заработок в интернете", "легкие деньги", "пассивный доход",
"быстрый заработок", "миллион за неделю", "лотерея",
"вы выиграли приз", "ваш приз ждет", "выигрыш",
"без вложений", "с гарантией возврата", "инвестиции",
"как заработать", "деньги просто так", "криптовалюта без риска",
"финансовая пирамида", "реферальная программа", "партнерская программа"
]
positive_words = {"отличное качество", "высокое качество", "хорошее качество",
"качественный", "добротный", "надежный", "прочный", "долговечный",
"превосходный", "безупречный", "аккуратно сделан", "хорошая сборка",
"качественные материалы", "ничего не люфтит", "сидит плотно",
"отлично работает", "супер", "огонь", "класс", "достойный",
"не уступает бренду", "сделан на совесть"
}
negative_words = {"плохое качество", "низкое качество", "дешевый", "хлипкий",
"непрочный", "недолговечный", "брак", "некачественный", "сыпется",
"ломается", "разваливается", "плохая сборка", "криво сделано",
"зазоры", "люфтит", "скрипит", "хрупкий", "одноразовый", "дешевка",
"не соответствует заявленному", "отвратительное качество",
"ужасное качество", "худшее качество", "мусор", "шлак", "не годится"
}
delivery_words = [
"быстрая доставка", "бесплатная доставка", "доставка вовремя", "курьер вежливый",
"упаковано хорошо", "доставка день в день", "отслеживание", "пришло целым",
"забрал сам", "пункт выдачи рядом", "доставили быстро", "соблюдены сроки",
"уведомления о статусе", "sms оповещение", "забрать сегодня", "долгая доставка",
"опоздали", "повреждена упаковка", "не дозвониться", "потеряли заказ",
"не пришло уведомление", "неправильный адрес", "курьер грубый", "пункт выдачи далеко",
"ждал неделю", "разбито при доставке", "не привезли", "потеряли посылку",
"не отслеживается", "перепутали заказ", "плохая упаковка", "доставка платная",
"дорогая доставка", "не привезли вовремя", "вернули на склад"
]
price_words = [
"низкая цена", "доступная цена", "дешево", "бюджетный",
"хорошая цена", "адекватная цена", "цена качество", "скидка",
"распродажа", "акция", "выгодно", "недорого",
"дешевле чем везде", "цена огонь", "цена порадовала", "экономия",
"дешево и сердито", "спеццена", "цена кусается", "дорого",
"высокая цена", "завышенная цена", "переплата", "цена не оправдана",
"дороговато", "цены конские", "цена завышена", "не по карману",
"золотое", "слишком дорого", "цена не соответствует качеству", "дороже чем у других",
"наценка", "обдираловка", "цена выросла", "денег не стоит"
]
keywords_dict = {
"quality": list(positive_words) + list(negative_words),
"delivery": delivery_words,
"price": price_words
}
def clean_text(text: str): # чистит текст отзыва от знаков препинания
black_list = ",?:();-+=*%"
for i in range(len(black_list)):
text = text.replace(black_list[i], '')
@ -10,7 +61,7 @@ def clean_text(text: str):
return text
def extract_keywords(text: str, keywords_dict: dict):
def extract_keywords(text: str, keywords_dict: dict): # поиск категорий, упомянутых в тексте
empty_list = []
for k, v in keywords_dict.items():
for i in v:
@ -19,7 +70,7 @@ def extract_keywords(text: str, keywords_dict: dict):
return (list(set(empty_list)))
def calculate_sentiment_score(text: str, positive_words: set, negative_words: set):
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:
@ -32,19 +83,18 @@ def calculate_sentiment_score(text: str, positive_words: set, negative_words: se
return sentiment
def validate_rating(rating: int):
if -1 <= rating <= 5:
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):
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:
@ -57,7 +107,7 @@ def is_spam(text: str, spam_indicators: list):
return res
def enrich_review(review: dict, keywords_dict: dict, positive_words: set, negative_words: set):
def enrich_review(review: dict, keywords_dict: dict, positive_words: set, negative_words: set): # обогащенный словарь
upgrade_review = {
"id": review.get("id"),
"rating": review.get("rating"),
@ -69,12 +119,30 @@ def enrich_review(review: dict, keywords_dict: dict, positive_words: set, negati
return upgrade_review
def filter_valid_reviews(reviews: list):
return list
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):
return dict
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):
@ -86,71 +154,26 @@ def generate_summary_report(valid_reviews: list, all_reviews_count: int, anomali
def main():
positive_words = {"отличное качество", "высокое качество", "хорошее качество",
"качественный", "добротный", "надежный", "прочный", "долговечный",
"превосходный", "безупречный", "аккуратно сделан", "хорошая сборка",
"качественные материалы", "ничего не люфтит", "сидит плотно",
"отлично работает", "супер", "огонь", "класс", "достойный",
"не уступает бренду", "сделан на совесть"}
negative_words = {"плохое качество", "низкое качество", "дешевый", "хлипкий",
"непрочный", "недолговечный", "брак", "некачественный", "сыпется",
"ломается", "разваливается", "плохая сборка", "криво сделано",
"зазоры", "люфтит", "скрипит", "хрупкий", "одноразовый", "дешевка",
"не соответствует заявленному", "отвратительное качество",
"ужасное качество", "худшее качество", "мусор", "шлак", "не годится"}
spam_indicators = [
"заработок в интернете", "легкие деньги", "пассивный доход",
"быстрый заработок", "миллион за неделю", "лотерея",
"вы выиграли приз", "ваш приз ждет", "выигрыш",
"без вложений", "с гарантией возврата", "инвестиции",
"как заработать", "деньги просто так", "криптовалюта без риска",
"финансовая пирамида", "реферальная программа", "партнерская программа"
]
delivery_words = [
"быстрая доставка", "бесплатная доставка", "доставка вовремя", "курьер вежливый",
"упаковано хорошо", "доставка день в день", "отслеживание", "пришло целым",
"забрал сам", "пункт выдачи рядом", "доставили быстро", "соблюдены сроки",
"уведомления о статусе", "sms оповещение", "забрать сегодня", "долгая доставка",
"опоздали", "повреждена упаковка", "не дозвониться", "потеряли заказ",
"не пришло уведомление", "неправильный адрес", "курьер грубый", "пункт выдачи далеко",
"ждал неделю", "разбито при доставке", "не привезли", "потеряли посылку",
"не отслеживается", "перепутали заказ", "плохая упаковка", "доставка платная",
"дорогая доставка", "не привезли вовремя", "вернули на склад"
]
price_words = [
"низкая цена", "доступная цена", "дешево", "бюджетный",
"хорошая цена", "адекватная цена", "цена качество", "скидка",
"распродажа", "акция", "выгодно", "недорого",
"дешевле чем везде", "цена огонь", "цена порадовала", "экономия",
"дешево и сердито", "спеццена", "цена кусается", "дорого",
"высокая цена", "завышенная цена", "переплата", "цена не оправдана",
"дороговато", "цены конские", "цена завышена", "не по карману",
"золотое", "слишком дорого", "цена не соответствует качеству", "дороже чем у других",
"наценка", "обдираловка", "цена выросла", "денег не стоит"
]
keywords_dict = {
"quality": list(positive_words) + list(negative_words),
"delivery": delivery_words,
"price": price_words
}
print("\n======== Введите название файла с форматом .csv или используйте по умолчанию (Enter) ========")
name_report = input()
if not name_report:
name_report = "data.csv"
if name_report[-4:] == ".csv": #проверка на правильность ввода имени файла
try:
report = open(name_report, 'r+', encoding='cp1251') #открытие файла
report = open(name_report, 'r+', encoding='utf-8') #открытие файла
except:
print("Файл отсутствует")
else:
print("Содержимое файла:") #запись файла в список
dec_report = list()
review = list()
for i in report:
i = i.replace("\n", '') #убираем отступы в концы строки
dec_report.append(clean_text(i))
review.append(i)
report.close()
print("id rating text")
for i in dec_report:
for i in review:
print(i)
else:
print("Неверный тип файла! "