diff --git a/main.py b/main.py index 5965b7e..dec0e83 100644 --- a/main.py +++ b/main.py @@ -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("Неверный тип файла! "