реализация функций filter_valid_reviews и calculate_average_rating_by_topic
This commit is contained in:
parent
d2873ab899
commit
14e59aaabc
227
main.py
227
main.py
@ -1,103 +1,6 @@
|
||||
# Система анализа и модерации отзывов на товары (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 = [
|
||||
"заработок в интернете", "легкие деньги", "пассивный доход",
|
||||
"быстрый заработок", "миллион за неделю", "лотерея",
|
||||
@ -106,6 +9,20 @@ def main():
|
||||
"как заработать", "деньги просто так", "криптовалюта без риска",
|
||||
"финансовая пирамида", "реферальная программа", "партнерская программа"
|
||||
]
|
||||
positive_words = {"отличное качество", "высокое качество", "хорошее качество",
|
||||
"качественный", "добротный", "надежный", "прочный", "долговечный",
|
||||
"превосходный", "безупречный", "аккуратно сделан", "хорошая сборка",
|
||||
"качественные материалы", "ничего не люфтит", "сидит плотно",
|
||||
"отлично работает", "супер", "огонь", "класс", "достойный",
|
||||
"не уступает бренду", "сделан на совесть"
|
||||
}
|
||||
negative_words = {"плохое качество", "низкое качество", "дешевый", "хлипкий",
|
||||
"непрочный", "недолговечный", "брак", "некачественный", "сыпется",
|
||||
"ломается", "разваливается", "плохая сборка", "криво сделано",
|
||||
"зазоры", "люфтит", "скрипит", "хрупкий", "одноразовый", "дешевка",
|
||||
"не соответствует заявленному", "отвратительное качество",
|
||||
"ужасное качество", "худшее качество", "мусор", "шлак", "не годится"
|
||||
}
|
||||
delivery_words = [
|
||||
"быстрая доставка", "бесплатная доставка", "доставка вовремя", "курьер вежливый",
|
||||
"упаковано хорошо", "доставка день в день", "отслеживание", "пришло целым",
|
||||
@ -133,24 +50,130 @@ def main():
|
||||
"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], '')
|
||||
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) ========")
|
||||
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("Неверный тип файла! "
|
||||
|
||||
Loading…
Reference in New Issue
Block a user