Analizator sentymentów, sztuczna inteligencja

Original article was published by Karol Wieliczko on Artificial Intelligence on Medium


Analizator sentymentów, sztuczna inteligencja

Czyli jak zrobić, aby maszyna rozumiała potoczny język polski.

Pokrótce opiszę jak napisać analizator sentymentów, oraz jak dzięki temu wszczepić elementy sztucznej inteligencji, oraz nauczyć program podejmowania samodzielnych decyzji.

Aby zacząć przygodę z machine learning potrzebujemy narzędzi takich jak poprawnie skonfigurowane środowisko języka Python, oraz zainstalowane narzędzie Jupyter Notebook. Nic więcej.

Aha!, potrzebujemy również danych.

Pisząc ten program często uświadamiałem sobie skąd nagłe zainteresowanie świata danymi i dlaczego przycisk “Lubię to” czy emotki są tak ważne. Jeśli doczytasz ten wpis do końca, również stanie się do dla Ciebie jasne.

W naszych rozważaniach postaramy się skorelować dwie, nierozerwalne dane — treść napisaną językiem potocznym i ocenę końcową, czyli liczbę gwiazdek jaką zdecydował się wystawić firmie lub produktowi internauta.

Dla nas, osób czytających opnie na portalach, to sprawa prosta
i nierozerwalna. Postarajmy się, aby maszyna również zauważyła
tę zależność.

Nasz program składać się będzie z czterech modułów głównych:

  • Scrappera — czyli programu hurtowo pobierającego wpisy z portalu internetowego służącego do wystawiania opinii na temat firm i produktów,
  • Modułu przetwarzającego dane — czyli kilku funkcji usuwających bezwartościowe słowa, powielone wpisy, oraz wpisy niepełne,
  • Klasyfikatora — i tu jest właśnie sedno sprawy!,
  • Interfejsu www — czyli formularza internetowego wzbogaconego o kilka graficznych i dźwiękowych bajerów.

Rozpocznijmy od Scrappera

Większość operacji dziać będzie się w głównej klasie main, oraz w jej metodzie run. Okresowo sięgać będziemy również do innych klas, w których przechowujemy różne, przydatne metody pogrupowane “temetycznie”.

Na początek utwórzmy obiekt klasy http_connect_class

http_request_obj = http_request.http_connect_class()

i pobierzmy zawartość całej strony portalu do zmiennej soup

soup = http_request_obj.get_html(url)

W kodzie portalu, liczba gwiazdek oraz tekst recenzji, w uproszczeniu wygląda tak:

<span class='review positive'>5</span>

<div class='review_text '>
<span>Przesyłka na czas. Produkt zgodny z opisem. polecam :)</span>
</div>

lub

<span class='review negative'>1</span>

<div class='review_text '>
<span> Towar nie dotarł, zerowy kontakt. Nie polecam!</span>
</div>

Przy użyciu biblioteki BeautifulSoup parsujemy kod i budujemy listy zawierające ocenę oraz tekst opisu:

rating_star_list = soup.findAll('span', {'class': re.compile("^review*")})text_review_list = soup.findAll("div", {"class": "review_text"})

Z uwagi na to, że użyliśmy wyrażenia regularnego “^review*” zapisujemy do listy zarówno tagi ’review negative’ jak i ’review positive’.

Teraz powołujemy nową instancję klasy db_sql_lite_class,

db_obj = sqlite.db_sql_lite_class()

otwieramy podręczną bazę SQLite

conn = db_obj.open_database(db_path)

i zapisujemy przechowywane w zmiennych dane z portalu

db_obj.save_data_in_database(conn, db_path, rating_star, text_review)

A konkretnie, wykonujemy poniższe zapytanie:

sql = '''INSERT INTO reviews VALUES ('''+str(rating_star)+''',"'''+text_review+'''"); '''

Praca scrappera została wykonana a dane zostały zapisane do bazy:

Fragment bazy danych

c.d.n…