Сегодняшний блог будет очень интересным, в нем мы будем проводить извлечение обзоров Flipkart и анализ настроений, а также мы будем создавать красивое приложение Flask, чтобы показать все. Так что без каких-либо дополнительных должностей.

Прочитайте полную статью с исходным кодом здесь —https://machinelearningprojects.net/flipkart-reviews-extraction-and-sentiment-analysis/

Давай сделаем это…

Код для извлечения отзывов Flipkart и анализа настроений…

import re
import os
import nltk
import joblib
import requests
import numpy as np
from bs4 import BeautifulSoup
import urllib.request as urllib
import matplotlib.pyplot as plt
from nltk.corpus import stopwords
from wordcloud import WordCloud,STOPWORDS
from flask import Flask,render_template,request
import time

# Flipkart Reviews extraction and sentiment analysis
# nltk.download('stopwords')
# nltk.download('punkt')
# nltk.download('wordnet')

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0


def clean(x):
    x = re.sub(r'[^a-zA-Z ]', ' ', x) # replace evrything thats not an alphabet with a space
    x = re.sub(r'\s+', ' ', x) #replace multiple spaces with one space
    x = re.sub(r'READ MORE', '', x) # remove READ MORE
    x = x.lower()
    x = x.split()
    y = []
    for i in x:
        if len(i) >= 3:
            if i == 'osm':
                y.append('awesome')
            elif i == 'nyc':
                y.append('nice')
            elif i == 'thanku':
                y.append('thanks')
            elif i == 'superb':
                y.append('super')
            else:
                y.append(i)
    return ' '.join(y)


def extract_all_reviews(url, clean_reviews, org_reviews,customernames,commentheads,ratings):
    with urllib.urlopen(url) as u:
        page = u.read()
        page_html = BeautifulSoup(page, "html.parser")
    reviews = page_html.find_all('div', {'class': 't-ZTKy'})
    commentheads_ = page_html.find_all('p',{'class':'_2-N8zT'})
    customernames_ = page_html.find_all('p',{'class':'_2sc7ZR _2V5EHH'})
    ratings_ = page_html.find_all('div',{'class':['_3LWZlK _1BLPMq','_3LWZlK _32lA32 _1BLPMq','_3LWZlK _1rdVr6 _1BLPMq']})

    for review in reviews:
        x = review.get_text()
        org_reviews.append(re.sub(r'READ MORE', '', x))
        clean_reviews.append(clean(x))
    
    for cn in customernames_:
        customernames.append('~'+cn.get_text())
    
    for ch in commentheads_:
        commentheads.append(ch.get_text())
    
    ra = []
    for r in ratings_:
        try:
            if int(r.get_text()) in [1,2,3,4,5]:
                ra.append(int(r.get_text()))
            else:
                ra.append(0)
        except:
            ra.append(r.get_text())
        
    ratings += ra
    print(ratings)


@app.route('/')
def home():
    return render_template('home.html')

@app.route('/results',methods=['GET'])
def result():    
    url = request.args.get('url')

    nreviews = int(request.args.get('num'))
    clean_reviews = []
    org_reviews = []
    customernames = []
    commentheads = []
    ratings = []

    with urllib.urlopen(url) as u:
        page = u.read()
        page_html = BeautifulSoup(page, "html.parser")

    proname = page_html.find_all('span', {'class': 'B_NuCI'})[0].get_text()
    price = page_html.find_all('div', {'class': '_30jeq3 _16Jk6d'})[0].get_text()
    
    # getting the link of see all reviews button
    all_reviews_url = page_html.find_all('div', {'class': 'col JOpGWq'})[0]
    all_reviews_url = all_reviews_url.find_all('a')[-1]
    all_reviews_url = 'https://www.flipkart.com'+all_reviews_url.get('href')
    url2 = all_reviews_url+'&page=1'
    

    # start reading reviews and go to next page after all reviews are read 
    while True:
        x = len(clean_reviews)
        # extracting the reviews
        extract_all_reviews(url2, clean_reviews, org_reviews,customernames,commentheads,ratings)
        url2 = url2[:-1]+str(int(url2[-1])+1)
        if x == len(clean_reviews) or len(clean_reviews)>=nreviews:break

    org_reviews = org_reviews[:nreviews]
    clean_reviews = clean_reviews[:nreviews]
    customernames = customernames[:nreviews]
    commentheads = commentheads[:nreviews]
    ratings = ratings[:nreviews]


    # building our wordcloud and saving it
    for_wc = ' '.join(clean_reviews)
    wcstops = set(STOPWORDS)
    wc = WordCloud(width=1400,height=800,stopwords=wcstops,background_color='white').generate(for_wc)
    plt.figure(figsize=(20,10), facecolor='k', edgecolor='k')
    plt.imshow(wc, interpolation='bicubic') 
    plt.axis('off')
    plt.tight_layout()
    CleanCache(directory='static/images')
    plt.savefig('static/images/woc.png')
    plt.close()

    
    # making a dictionary of product attributes and saving all the products in a list
    d = []
    for i in range(len(org_reviews)):
        x = {}
        x['review'] = org_reviews[i]
        # x['sent'] = predictions[i]
        x['cn'] = customernames[i]
        x['ch'] = commentheads[i]
        x['stars'] = ratings[i]
        d.append(x)
    

    for i in d:
        if i['stars']!=0:
            if i['stars'] in [1,2]:
                i['sent'] = 'NEGATIVE'
            else:
                i['sent'] = 'POSITIVE'
    

    np,nn =0,0
    for i in d:
        if i['sent']=='NEGATIVE':nn+=1
        else:np+=1

    return render_template('result.html',dic=d,n=len(clean_reviews),nn=nn,np=np,proname=proname,price=price)
    
    
@app.route('/wc')
def wc():
    return render_template('wc.html')


class CleanCache:
    '''
    this class is responsible to clear any residual csv and image files
    present due to the past searches made.
    '''
    def __init__(self, directory=None):
        self.clean_path = directory
        # only proceed if directory is not empty
        if os.listdir(self.clean_path) != list():
            # iterate over the files and remove each file
            files = os.listdir(self.clean_path)
            for fileName in files:
                print(fileName)
                os.remove(os.path.join(self.clean_path,fileName))
        print("cleaned!")


if __name__ == '__main__':
    app.run(debug=True)

# this was the code for Flipkart Reviews extraction and sentiment analysis
  • Строка 1–13 — Импорт необходимых пакетов.
  • Строка 20. Объявление приложения Flask.
  • Ложь 21 — Эта строка предназначена для предотвращения кэширования. (просто скопируйте и вставьте эту строку)
  • Строка 24–43 — функция очистки текста обзора.
  • Строка 46–77. Эта функция использует веб-скраппинг для извлечения всех отзывов со страницы.
  • Строка 47–49 — открыть URL и прочитать всю страницу в формате HTML с помощью BeautifuSoup.
  • Строка 50–53 — извлечение необходимой информации, такой как комментарий, заголовок комментария, имя клиента и присвоенный рейтинг.
  • Строка 55–58 — добавление в списки оригинальных отзывов и очищенных отзывов.
  • Строка 67–74. Извлеките число, указанное в качестве рейтинга, преобразуйте его в целое число и сохраните в списке ‘ra’.
  • Строка 80. Мы используем app.route(‘/’), что означает просто домашнюю страницу нашего веб-приложения.
  • Строка 82. Покажите home.html’ на главной странице.
  • Строка 84–162 — Показать очищенные отзывы на нашей странице результатов.
  • Строка 86 — Получить URL.
  • Строка 88. Получите нет. отзывов для изучения.
  • Строка 89–93 — Инициализируйте некоторые значения.
  • Строка 95–97 — откройте URL-адрес и прочитайте весь HTML-код страницы.
  • Строка 99–100- Извлеките название продукта и его цену.
  • Строка 103. Найдите блок на странице, содержащий кнопку Все отзывы.

  • Строка 104. Из этого блока извлеките ссылку кнопки «Все отзывы».
  • Строка 105. Создайте ссылку как 'https://www.flipkart.com' + all_reviews_url.get('href'), где all_reviews.get('href') даст ссылку на эту страницу со всеми отзывами.

  • Строка 106. Просто добавьте параметр страницы к ссылке, чтобы мы могли легко выполнять разбивку на страницы, чтобы читать/извлекать все больше и больше обзоров.
  • Строка 110–115- Прочитайте номер n. отзывов.
  • Строка 113 — извлечь все отзывы с этой страницы.
  • Строка 114. Создайте ссылку на следующую страницу, просто заменив 1 на 2 или 2 на 3 и т. д..
  • Строка 117–121- Просто выньте номер n. извлеченных данных. Наши извлеченные данные содержат отзывы, имена клиентов, присвоенные ими звезды и заголовки комментариев.
  • Строка 125–134 — Создание громких слов с использованием чистых обзоров.
  • Строка 138–146. Создание списка словарей, где каждый словарь отображает полные данные об обзоре. Один словарь будет содержать комментарий, заголовок комментария, присвоенные звезды, имя заказчика.
  • Строка 149–154. Если звезды, присвоенные пользователем, равны 1 или 2, добавьте в словарь еще один атрибут, который называется «отправлено» или настроение, и пометьте его как ОТРИЦАТЕЛЬНЫЙ, иначе пометьте его как ПОЗИТИВНО.
  • Строка 157–160 — подсчет положительных и отрицательных отзывов.
  • Строка 162. Отправка этой информации на нашу HTML-страницу.
  • Строка 165–167 — Показать облако слов на (‘/wc’).

  • Строка 170–184 — простая функция для предотвращения кэширования. (нет необходимости вдаваться в подробности)
  • Строка 187–188 — запустить наше приложение.

Окончательный результат извлечения обзоров Flipkart и анализа тональности…

ПРИМЕЧАНИЕ. Обратите внимание на то, что имена классов, которые Flipkart использует для этих элементов, могут меняться со временем, поэтому, если программа выдает ошибку в этих частях, просто перейдите на страницу Flipkart, проверьте элемент и найдите новый идентификатор этого блока/элемента/ссылки.

Дайте мне знать, если у вас есть какие-либо вопросы относительно извлечения отзывов Flipkart и анализа настроений, связавшись со мной по электронной почте или в LinkedIn. Я изо всех сил старался объяснить этот код.

Это извлечение отзывов Flipkart и анализ настроений — очень интересный проект, который может иметь и другие бесконечные варианты использования. Вы можете изучить больше вариантов его использования, просто уделив ему немного времени.

Чтобы узнать больше о машинном обучении, глубоком обучении, компьютерном зрении, НЛП и проектах Flask, посетите мой блог.

https://machinelearningprojects.net/

Для дальнейшего объяснения кода и исходного кода посетите здесь

https://machinelearningprojects.net/flipkart-reviews-extraction-and-sentiment-analysis/

Итак, это все для этого блога, ребята, спасибо за то, что прочитали его, и я надеюсь, что вы возьмете что-то с собой после прочтения этого и до следующего раза 👋…