1. Programowanie Big DataData Science Korzystanie z AI do analizy sentymentów

John Paul Mueller, Luca Mueller

Analiza sentymentalna obliczeniowo wywodzi się z tekstu pisanego przy użyciu stosunku pisarza (pozytywnego, negatywnego lub neutralnego) do tematu tekstu. Ten rodzaj analizy okazuje się przydatny dla osób zajmujących się marketingiem i komunikacją, ponieważ pomaga im zrozumieć, co klienci i konsumenci myślą o produkcie lub usłudze, a tym samym działa odpowiednio (na przykład, próbując odzyskać niezadowolonych klientów lub decydując się na inną strategię sprzedaży) ). Każdy wykonuje analizę nastrojów. Na przykład podczas czytania tekstu ludzie naturalnie starają się określić nastroje, które poruszyły osobę, która go napisała. Jednak gdy liczba tekstów do przeczytania i zrozumienia jest zbyt duża, a tekst stale się gromadzi, tak jak w mediach społecznościowych i e-mailach od klientów, automatyzacja analizy nastrojów jest ważna.

Analiza nastrojów AI

Nadchodzącym przykładem jest uruchomienie RNN przy użyciu Keras i TensorFlow, które buduje algorytm analizy sentymentów zdolny do klasyfikacji postaw wyrażonych w przeglądzie filmu. Dane są próbką zestawu danych IMDb, który zawiera 50 000 recenzji (podzielonych na pół między zestawem pociągu a zestawem testowym) filmów, którym towarzyszy etykieta wyrażająca sentyment do recenzji (0 = negatywna, 1 = pozytywna). IMDb to duża internetowa baza danych zawierająca informacje o filmach, serialach telewizyjnych i grach wideo. Pierwotnie utrzymywany przez fanów, teraz jest prowadzony przez spółkę zależną Amazon. Na IMDb ludzie znajdują potrzebne informacje o swoim ulubionym programie, a także zamieszczają komentarze lub piszą recenzję, aby inni odwiedzający mogli je przeczytać.

Keras oferuje opakowanie do pobierania danych IMDb. Przygotowujesz, tasujesz i porządkujesz te dane w pociągu i zestawie testowym. W szczególności dane tekstowe IMDb oferowane przez Keras są oczyszczone z interpunkcji, znormalizowane do małych liter i przekształcone w wartości liczbowe. Każde słowo jest zakodowane w liczbie reprezentującej jego ranking częstotliwości. Najczęściej słowa mają niskie liczby; rzadziej występujące słowa mają wyższe liczby.

Na początek kod importuje funkcję imdb z Keras i używa jej do pobierania danych z Internetu (około 17,5 MB pobrania). Parametry używane w tym przykładzie obejmują tylko 10 000 pierwszych słów, a Keras powinien przetasować dane przy użyciu określonego losowego ziarna. (Znajomość materiału siewnego umożliwia odtworzenie tasowania w razie potrzeby.) Funkcja zwraca dwa zestawy pociągów i testów, oba wykonane z sekwencji tekstowych i wyniku sentymentu.

z keras.datasets import imdb
top_words = 10000
((x_train, y_train),
(x_test, y_test)) = imdb.load_data (num_words = top_words,
ziarno = 21)

Po zakończeniu poprzedniego kodu możesz sprawdzić liczbę przykładów, używając następującego kodu:

print („Przykłady szkoleń:% i”% len (x_train))
print („Przykłady testowe:% i”% len (x_test))

Po zapytaniu o liczbę przypadków dostępnych do wykorzystania w fazie szkolenia i testowania sieci neuronowej kod generuje odpowiedź 25 000 przykładów dla każdej fazy. (Ten zestaw danych jest stosunkowo niewielki ze względu na problem językowy; oczywiście zestaw danych służy głównie do celów demonstracyjnych.) Ponadto kod określa, czy zestaw danych jest zrównoważony, co oznacza, że ​​ma prawie taką samą liczbę pozytywnych i negatywnych przykładów sentymentów.

zaimportuj numpy jako np
print (np.unique (y_train, return_counts = True))

Wynik, tablica ([12500, 12500]), potwierdza, że ​​zestaw danych jest równomiernie podzielony między pozytywne i negatywne wyniki. Taka równowaga między klasami odpowiedzi wynika wyłącznie z demonstracyjnego charakteru zestawu danych. W prawdziwym świecie rzadko można znaleźć zrównoważone zestawy danych. Następny krok tworzy niektóre słowniki Pythona, które można konwertować między kodem użytym w zestawie danych a prawdziwymi słowami. W rzeczywistości zestaw danych użyty w tym przykładzie jest wstępnie przetwarzany i zawiera sekwencje liczb reprezentujących słowa, a nie same słowa. (Algorytmy LSTM i GRU znajdujące się w Keras oczekują ciągów liczb jako liczb).

word_to_id = {w: i ​​+ 3 dla w, i w imdb.get_word_index (). items ()}
id_to_word = {0: '' 1: '', 2: ''}
id_to_word.update ({i + 3: w dla w, i w imdb.get_word_index (). items ()})
def przekonwertować na tekst (sekwencja):
return '' .join ([id_to_word [s] dla s w sekwencji, jeśli s> = 3])
print (konwersja_tekstu (x_train [8]))

Poprzedni fragment kodu definiuje dwa słowniki konwersji (od słów do kodów numerycznych i odwrotnie) oraz funkcję, która tłumaczy przykłady zestawu danych na czytelny tekst. Na przykład kod drukuje dziewiąty przykład: „ten film był jak zły wrak pociągu, tak samo okropny jak…”. Na podstawie tego fragmentu można łatwo przewidzieć, że sentyment do tego filmu nie jest pozytywny. Słowa takie jak „zły”, „wrak” i „okropny” wyrażają silne negatywne odczucia, a to ułatwia odgadnięcie właściwego sentymentu.

W tym przykładzie otrzymujesz sekwencje liczbowe i zamieniasz je z powrotem w słowa, ale odwrotność jest powszechna. Zwykle otrzymujesz wyrażenia złożone ze słów i zamieniasz je w ciąg liczb całkowitych, aby zasilić warstwę RNN. Keras oferuje specjalną funkcję, Tokenizer, która może to zrobić za Ciebie. Wykorzystuje metody fit_on_text, aby dowiedzieć się, jak mapować słowa na liczby całkowite na podstawie danych treningowych i text_to_matrix, aby przekształcić tekst w sekwencję.

Jednak w innych frazach możesz nie znaleźć tak odkrywczych słów do analizy nastrojów. Uczucie wyrażane jest w sposób bardziej subtelny lub pośredni, a zrozumienie sentymentu na początku tekstu może nie być możliwe, ponieważ ujawnianie fraz i słów może pojawić się znacznie później w dyskursie. Z tego powodu musisz także zdecydować, jaką część frazy chcesz przeanalizować.

Konwencjonalnie bierzesz początkową część tekstu i używasz go jako reprezentatywnego dla całej recenzji. Czasami potrzebujesz tylko kilku początkowych słów - na przykład pierwszych 50 słów - aby uzyskać sens; czasami potrzebujesz więcej. Szczególnie długie teksty nie ujawniają swojej orientacji wcześniej. Dlatego od Ciebie zależy zrozumienie rodzaju tekstu, z którym pracujesz, i określenie liczby słów do analizy za pomocą głębokiego uczenia. Ten przykład uwzględnia tylko pierwsze 200 słów, które powinny wystarczyć.

Zauważyłeś, że kod zaczyna nadawać kod słowom rozpoczynającym się od cyfry 3, pozostawiając w ten sposób kody od 0 do 2. Niższe liczby są używane do specjalnych znaczników, takich jak sygnalizowanie początku frazy, wypełnianie pustych spacji w celu ustalenia sekwencji na określoną długość i zaznaczając słowa, które są wykluczone, ponieważ nie są wystarczająco częste. Ten przykład zawiera tylko najczęściej 10 000 słów. Używanie znaczników do wskazywania początku, końca i ważnych sytuacji to sztuczka, która działa z RNN, szczególnie w tłumaczeniu maszynowym.

z keras.preprocessing.sequence import pad_sequences
max_pad = 200
x_train = pad_sequences (x_train,
maxlen = max_pad)
x_test = pad_sequences (x_test,
maxlen = max_pad)
print (x_train [0])

Używając funkcji pad_sequences z Keras z ustawieniem max_pad na 200, kod pobiera pierwsze dwieście słów każdej recenzji. W przypadku, gdy recenzja zawiera mniej niż dwieście słów, tyle sekwencji zerowych, ile potrzeba, poprzedza sekwencję, aby osiągnąć wymaganą liczbę elementów sekwencji. Przycinanie sekwencji do określonej długości i wypełnianie pustych przestrzeni zerowymi nazywane jest wypełnianiem wejściowym, ważnym działaniem przetwarzania przy użyciu RNN, takich jak algorytmy głębokiego uczenia. Teraz kod projektuje architekturę:

z keras.models import Sequential
z keras.layers importuj Dwukierunkowe, Gęste, Zrzut
z keras.layers importuj GlobalMaxPool1D, LSTM
z keras.layers.embeddings import Osadzanie
embedding_vector_length = 32
model = Sekwencyjny ()
model.add (Osadzanie (top_words,
embedding_vector_length,
input_length = max_pad))
model.add (Dwukierunkowy (LSTM (64; return_sequences = True)))
model.add (GlobalMaxPool1D ())
model.add (Gęsty (16, aktywacja = „relu”))
model.add (Gęsty (1, aktywacja = „sigmoid”))
model.compile (loss = 'binary_crossentropy',
optymalizator = „Adam”,
metryki = [„dokładność”])
print (model.summary ())

Poprzedni fragment kodu określa kształt modelu głębokiego uczenia się, w którym wykorzystuje on kilka wyspecjalizowanych warstw do przetwarzania języka naturalnego z Keras. Przykład wymagał również podsumowania modelu (polecenie model.summary ()) w celu ustalenia, co dzieje się z architekturą przy użyciu różnych warstw neuronowych.

Masz warstwę Osadzanie, która przekształca sekwencje liczbowe w gęstą czcionkę. Ten rodzaj osadzania słów jest bardziej odpowiedni do nauki przez warstwę RNN. Keras zapewnia warstwę Osadzania, która oprócz konieczności bycia pierwszą warstwą sieci, może realizować dwa zadania:

  • Stosowanie osadzonego wstępnie wyszkolonego słowa (takiego jak Word2vec lub GloVe) do wprowadzania sekwencji. Wystarczy przekazać macierz zawierającą osadzanie do jej wag parametrów. Tworzenie słowa osadzającego od zera na podstawie otrzymywanych danych wejściowych.

W tym drugim przypadku Osadzanie musi tylko wiedzieć:

  • input_dim: Rozmiar słownictwa oczekiwany od danych output_dim: Rozmiar przestrzeni do osadzenia, która zostanie utworzona (tak zwane wymiary) długość_wejściowa: oczekiwany rozmiar sekwencji

Po określeniu parametrów Osadzanie znajdzie lepsze ciężary, aby przekształcić sekwencje w gęstą matrycę podczas treningu. Gęsty rozmiar matrycy wynika z długości sekwencji i wymiarów osadzania.

Jeśli korzystasz z warstwy Osadzanie dostarczonej przez Keras, musisz pamiętać, że funkcja zapewnia tylko macierz wagową wielkości słownictwa według wymiaru pożądanego osadzenia. Odwzorowuje słowa na kolumny macierzy, a następnie dostosowuje wagi macierzy do podanych przykładów. To rozwiązanie, chociaż praktyczne w przypadku niestandardowych problemów językowych, nie jest analogiczne do omówionego wcześniej osadzania słów, które są szkolone w inny sposób i na milionach przykładów.

W tym przykładzie zastosowano zawijanie dwukierunkowe - warstwę LSTM złożoną z 64 komórek. Dwukierunkowa przekształca normalną warstwę LSTM, podwajając ją: Z pierwszej strony stosuje normalną sekwencję danych wejściowych; po drugie, przekazuje odwrotność sekwencji. Stosujesz to podejście, ponieważ czasami używasz słów w różnej kolejności dopasowywania, a zbudowanie warstwy dwukierunkowej spowoduje przechwycenie dowolnego wzorca słowa, bez względu na kolejność. Implementacja Keras jest naprawdę prosta: po prostu zastosujesz ją jako funkcję na warstwie, którą chcesz renderować dwukierunkowo.

Dwukierunkowy LSTM jest ustawiony na zwracanie sekwencji (return_sequences = True); to znaczy dla każdej komórki zwraca wynik uzyskany po obejrzeniu każdego elementu sekwencji. Wyniki dla każdej sekwencji to macierz wyjściowa o wymiarach 200 x 128, gdzie 200 to liczba elementów sekwencji, a 128 to liczba komórek LSTM zastosowanych w warstwie. Ta technika zapobiega pobieraniu przez RNN ostatniego wyniku z każdej komórki LSTM. Wskazówki dotyczące sentymentu tekstu mogą faktycznie pojawić się w dowolnym miejscu w sekwencji osadzonych słów.

Krótko mówiąc, ważne jest, aby nie brać ostatniego wyniku z każdej komórki, a raczej najlepszy wynik. Kod opiera się zatem na następnej warstwie, GlobalMaxPool1D, w celu sprawdzenia każdej sekwencji wyników dostarczonych przez każdą komórkę LSTM i zachowania tylko maksymalnego wyniku. To powinno zapewnić, że przykład wybierze najsilniejszy sygnał z każdej komórki LSTM, która, miejmy nadzieję, specjalizuje się w szkoleniu w zakresie wybierania pewnych znaczących sygnałów.

Po filtrowaniu sygnałów neuronowych przykład ma warstwę 128 wyjść, po jednym dla każdej komórki LSTM. Kod redukuje i miksuje sygnały, stosując kolejną gęstą warstwę 16 neuronów z aktywacją ReLU (dzięki czemu przechodzą tylko pozytywne sygnały). Architektura kończy się końcowym węzłem używającym aktywacji sigmoidalnej, która wyciska wyniki do zakresu 0–1 i sprawia, że ​​wyglądają jak prawdopodobieństwa.

Po zdefiniowaniu architektury możesz teraz wyszkolić sieć w celu przeprowadzenia analizy nastrojów. Wystarczą trzy epoki (trzykrotne przesłanie danych przez sieć, aby nauczyła się wzorców). Kod za każdym razem używa partii 256 recenzji, co pozwala sieci zobaczyć za każdym razem wystarczającą różnorodność słów i sentymentów, zanim zaktualizuje swoje wagi za pomocą propagacji wstecznej. Na koniec kod koncentruje się na wynikach dostarczonych przez dane walidacyjne (które nie są częścią danych szkoleniowych). Uzyskanie dobrego wyniku z danych walidacyjnych oznacza, że ​​sieć neuronowa poprawnie przetwarza dane wejściowe. Kod raportuje dane dotyczące sprawdzania poprawności tuż po zakończeniu każdej epoki.

history = model.fit (x_train, y_train,
validation_data = (x_test, y_test),
epoki = 3, rozmiar partii = 256)

Uzyskanie wyników zajmuje trochę czasu, ale jeśli używasz procesora graficznego, zakończy się ono w momencie, w którym wypijesz filiżankę kawy. W tym momencie możesz ocenić wyniki, ponownie używając danych walidacyjnych. (Wyniki nie powinny mieć żadnych niespodzianek ani różnic w stosunku do tego, co kod zgłosił podczas szkolenia).

loss, metric = model.evaluate (x_test, y_test, verbose = 0)
wydruk („Dokładność testu:% 0,3f”% metryka)

Ostateczna dokładność, która jest procentem poprawnych odpowiedzi z głębokiej sieci neuronowej, wyniesie około 85–86 procent. Wynik zmieni się nieznacznie za każdym razem, gdy przeprowadzasz eksperyment z powodu randomizacji podczas budowania sieci neuronowej. Jest to całkowicie normalne, biorąc pod uwagę niewielki rozmiar danych, z którymi pracujesz. Jeśli zaczniesz od odpowiednich szczęśliwych ciężarów, nauka będzie łatwiejsza podczas tak krótkiej sesji treningowej.

W końcu twoja sieć jest analizatorem sentymentów, który może poprawnie odgadnąć sentyment wyrażony w recenzji filmu przez około 85 procent czasu. Biorąc pod uwagę jeszcze więcej danych szkoleniowych i bardziej wyrafinowane architektury neuronowe, możesz uzyskać wyniki, które są jeszcze bardziej imponujące. W marketingu podobne narzędzie służy do automatyzacji wielu procesów wymagających czytania tekstu i podejmowania działań. Ponownie, możesz połączyć taką sieć z siecią neuronową, która słucha głosu i zamienia go w tekst. (Jest to kolejna aplikacja RNN, zasilająca teraz Alexę, Siri, Google Voice i wielu innych osobistych asystentów). Przejście umożliwia aplikacji zrozumienie sentymentu nawet w przypadku wyrażeń głosowych, takich jak telefon od klienta.

Zobacz też

Jak wypełnić swój Fantasy Football RosterObjawy i środki zaradcze na Keto Flu Przepis na deser: kremowy mus z ciasta na ciasto Przepis na śniadanie w stylu: Awokado Tosty w chmurze Przepis na jeden posiłek z potrawką: Stek z polędwicy z chrupiącym jarmużem Przepis na zakąskę Przepis: Chrupiące pieczone krążki cebuli Przepis na keto: Kalafior Mash i brązowe masło Przerwa na karmę KittiWydobywanie kryptowaluty i algorytmy dowodu stawkiJak chronić prywatność komputera MacBook Poznaj zamiennik dla iTunes: Nowe aplikacje muzyczne i telewizyjne w macOS Catalina Co nowego w macOS Catalina Szybkie porady dotyczące konfiguracji macOS Catalina i rejestracji MacBookMacBook dla manekinów Ściągawka Różnice między MacBookiem Air i MacBookiem ProHow, aby przełączać się między Konta na komputerze Mac Przetestuj mikrofon na komputerze z systemem Windows Jak przywrócić pliki z historii plików w systemie Windows 10 Mapowanie dysku sieciowego na komputerze z systemem Windows 10Jak sprawdzić przewody hamulcowe Jak skoczyć Uruchom samochód Jak stwierdzić, czy Twój pojazd wymaga dostrajania Jak rozwiązywać problemy z katalizatorami Jak często należy wymieniać olej? Jak sprawdzić poziom oleju w pojeździe Jak wypłukać układ chłodzenia pojazdu Jak rozwiązać problem z przegrzaniem silnika Jak Jak zmienić oponę Jak zainstalować świecę zapłonową Jak usunąć stare świece zapłonowe Jak sprawdzić hamulce tarczowe Jak zmienić płyn hamulcowy Jak sprawdzić główny cylinder układu hamulcowego Jak sprawdzić płyn hamulcowy pojazdu Dlaczego jest przegrzanie mojego samochodu i co mogę zrobić? Up Your Vehicle Jak sprawdzić linie hamulcowe