1. ProgrammingBig DataData ScienceUIing AI naudoti jausmų analizei

John Paul Mueller, Luca Mueller

Sentimentų analizė skaičiavimo būdu išplaukia iš parašyto teksto, naudojant rašytojo požiūrį (teigiamą, neigiamą ar neutralų) į teksto temą. Tokia analizė pasirodo naudinga žmonėms, dirbantiems rinkodaros ir komunikacijos srityse, nes tai padeda jiems suprasti, ką klientai ir vartotojai mano apie produktą ar paslaugą, ir atitinkamai veikti tinkamai (pavyzdžiui, bandydami susigrąžinti nepatenkintus klientus ar nusprendę naudoti kitokią pardavimo strategiją). ). Visi atlieka sentimentų analizę. Pvz., Skaitydami tekstą žmonės natūraliai bando nustatyti nuotaikas, kurios judino jį parašiusį asmenį. Tačiau kai skaitomų ir suprantamų tekstų skaičius yra per didelis, o tekstas kaupiasi nuolat, kaip ir socialinėje žiniasklaidoje bei klientų el. Laiškuose, svarbu automatizuoti nuotaikų analizę.

AI sentimentų analizė

Būsimas pavyzdys yra RNN bandomasis važiavimas naudojant „Keras“ ir „TensorFlow“, kurie sukuria sentimentų analizės algoritmą, galintį klasifikuoti požiūrį, išreikštą filmo peržiūroje. Duomenys yra IMDb duomenų rinkinio pavyzdys, kuriame yra 50 000 filmų peržiūros (padalytos per pusę tarp traukinio ir bandymo rinkinių) kartu su etikete, išreiškiančia peržiūros jausmą (0 = neigiama, 1 = teigiama). IMDb yra didelė internetinė duomenų bazė, kurioje yra informacijos apie filmus, TV serialus ir vaizdo žaidimus. Iš pradžių ją palaikė gerbėjų bazė, dabar ją valdo „Amazon“ dukterinė įmonė. IMDb tinklalapyje žmonės randa reikiamos informacijos apie savo mėgstamą laidą, taip pat skelbia komentarus arba rašo apžvalgą, kad kiti lankytojai galėtų ją skaityti.

„Keras“ siūlo atsisiųsti IMDb duomenų paketą. Šiuos duomenis paruošiate, permaišote ir sudedate į traukinį ir bandymų rinkinį. Visų pirma, „Keras“ siūlomi IMDb tekstiniai duomenys yra išvalomi nuo skyrybos ženklų, normalizuojami mažosiomis raidėmis ir paverčiami skaitinėmis reikšmėmis. Kiekvienas žodis koduojamas į skaičių, nurodantį jo eiliškumą pagal dažnį. Dažniausiai žodžiai turi mažą skaičių; rečiau žodžiai turi didesnius skaičius.

Kaip pradinis taškas, kodas importuoja „imdb“ funkciją iš „Keras“ ir naudoja ją duomenims iš interneto nuskaityti (atsisiųsti maždaug 17.5 MB). Parametrai, kuriuos naudoja pavyzdys, apima tik 10 000 geriausių žodžių, o „Keras“ turėtų suskaidyti duomenis naudodamas konkrečią atsitiktinę sėklą. (Žinant sėklą, galima atkurti judesį pagal poreikį.) Funkcija grąžina du traukinių ir testų rinkinius, abu sudarytus iš teksto sekų ir sentimentų.

iš keras.datasets importo imdb
top_words = 10000
((x_train, y_train),
(x_test, y_test)) = imdb.load_data (num_words = top_words,
sėkla = 21)

Kai ankstesnis kodas bus užpildytas, pavyzdžių skaičių galite patikrinti naudodami šį kodą:

spausdinti („Mokymo pavyzdžiai:% i“% len (x_train))
spausdinti („Bandymo pavyzdžiai:% i“% len (x_test))

Pasiteiravus, kiek atvejų galima naudoti nervų tinklo mokymo ir bandymo fazėse, kodas pateikia 25 000 kiekvienos fazės pavyzdžių. (Šis duomenų rinkinys yra palyginti mažas kalbų problemai spręsti; aišku, duomenų rinkinys daugiausia skirtas demonstraciniams tikslams.) Be to, kodas nustato, ar duomenų rinkinys yra subalansuotas, o tai reiškia, kad jis turi beveik vienodą skaičių teigiamų ir neigiamų nuotaikų pavyzdžių.

importuoti numpy kaip np
spausdinti (np.unique (y_train, return_counts = True))

Rezultatas masyvas ([12500, 12500]) patvirtina, kad duomenų rinkinys yra tolygiai padalijamas tarp teigiamų ir neigiamų rezultatų. Tokia atsakų klasių pusiausvyra išimtinai dėl įrodomojo duomenų rinkinio pobūdžio. Realiame pasaulyje retai rasite subalansuotų duomenų rinkinių. Kitas žingsnis sukuria keletą Python žodynų, kurie gali konvertuoti tarp duomenų rinkinyje naudojamo kodo ir tikrųjų žodžių. Iš tikrųjų šiame pavyzdyje naudojamas duomenų rinkinys yra iš anksto apdorotas ir pateikia skaičių, einančių žodžius, o ne pačius žodžius, sekas. (LSTM ir GRU algoritmai, kuriuos rasite „Keras“, tikisi, kad skaičių sekos bus skaitinės.)

word_to_id = {w: i ​​+ 3 w, i imdb.get_word_index (). items ()}
id_to_word = {0: " ', 1:" ', 2: " '}
id_to_word.update ({i + 3: w w, i imdb.get_word_index (). items ()})
def convert_to_text (seka):
return '' .join ([id_to_word [s] sekoms iš eilės, jei s> = 3])
spausdinti (konvertuoti į tekstą (x_train [8]))

Ankstesnis kodo fragmentas apibrėžia du konvertavimo žodynus (nuo žodžių į skaitinius kodus ir atvirkščiai) ir funkciją, kuri duomenų rinkinio pavyzdžius paverčia skaitomu tekstu. Kaip pavyzdys, kodas atspausdina devintąjį pavyzdį: „Šis filmas buvo kaip blogo traukinio nuolaužos, toks pat siaubingas kaip ir…“. Ištraukoje galite lengvai numatyti, kad šio filmo nuotaikos nėra teigiamos. Žodžiai, tokie kaip blogas, nuolaužos ir siaubingas, sukelia stiprų neigiamą jausmą, todėl atspėti teisingą požiūrį yra lengva.

Šiame pavyzdyje jūs gaunate skaitines sekas ir paverčiate jas žodžiais, tačiau yra priešingai. Paprastai jūs gaunate frazes, sudarytas iš žodžių, ir paverčiate sveikaisiais skaičiais, kad patektų į RNN sluoksnį. „Keras“ siūlo specializuotą funkciją „Tokenizer“, kuri tai gali padaryti už jus. Jis naudoja metodus fit_on_text, kad išmoktų susieti žodžius su sveikaisiais skaičiais iš mokymo duomenų, ir text_to_matrix, paversti tekstą seka.

Tačiau kitose frazėse sentimentų analizei tokių atskleidžiančių žodžių galbūt nerasite. Jausmas išreiškiamas subtiliau ar netiesiogiai, o suprasti sentimentus anksti tekste gali būti neįmanoma, nes atskleidžiamos frazės ir žodžiai gali atsirasti daug vėliau diskurse. Dėl šios priežasties taip pat turite nuspręsti, kokią frazę norite išanalizuoti.

Paprastai jūs paimate pradinę teksto dalį ir naudojate ją kaip reprezentacinę visos apžvalgos dalį. Kartais norint gauti prasmę, jums tereikia kelių pradinių žodžių, pavyzdžiui, pirmųjų 50 žodžių; kartais reikia daugiau. Ypač ilgi tekstai per anksti neatskleidžia jų orientacijos. Taigi jūs turite suprasti teksto, su kuriuo dirbate, tipą ir nuspręsti, kiek žodžių analizuoti giliai mokantis. Šiame pavyzdyje nagrinėjami tik pirmieji 200 žodžių, kurių turėtų pakakti.

Pastebėjote, kad kodas pradeda duoti kodus žodžiams, prasidedantiems skaičiumi 3, taigi kodai lieka nuo 0 iki 2. Mažesni skaičiai naudojami specialioms žymoms, tokioms kaip signalizuoti frazės pradžią, užpildyti tuščias vietas, kad seka būtų fiksuota. tam tikru ilgiu ir pažymėdami pašalintus žodžius, nes jie nėra pakankamai dažni. Šis pavyzdys parodo tik dažniausius 10 000 žodžių. Žymų naudojimas norint nurodyti pradžios, pabaigos ir svarbias situacijas yra triukas, veikiantis su RNN, ypač mašininiam vertimui.

importuoti iš keras.preprocessing.sequence importo pad_sequences
max_pad = 200
x_train = pad_ pasekmės (x_train,
maxlen = max_pad)
x_test = pad_ sekas (x_test,
maxlen = max_pad)
spausdinti („x_train“ [0])

Naudojant „Keras“ funkciją „pad_sequences“, kai „max_pad“ yra 200, kodas užima pirmus du šimtus kiekvienos peržiūros žodžių. Jei apžvalgoje yra mažiau nei du šimtai žodžių, prieš seką reikia tiek nulio verčių, kad būtų pasiektas reikiamas sekos elementų skaičius. Pjaustymas sekomis iki tam tikro ilgio ir tuštumų užpildymas nulinėmis vertėmis yra vadinamas įvesties užpildymu, tai yra svarbi perdirbimo veikla, kai naudojami RNN, pavyzdžiui, giluminio mokymosi algoritmai. Dabar kodas projektuoja architektūrą:

iš keras.models importo Sequential
iš keras.layers importuoja „Bidirectional“, „Dense“, „Dropout“
iš keras.layers importuoja „GlobalMaxPool1D“, LSTM
iš keras.layers.embeddings importo įdėjimas
įterpimo_vektoriaus ilgis = 32
modelis = nuoseklusis ()
model.add (įterpimas (top_words,
įterpimo_vektoriaus ilgis,
įvesties_ ilgis = max_pad))
„model.add“ (dvikryptis (LSTM (64, grąžinimo pasekmės = tikra)))
„model.add“ („GlobalMaxPool1D ()“)
model.add (Tankus (16, aktyvacija = "relu"))
model.add (tankus (1, aktyvacija = "sigmoid"))
„model.compile“ (praradimas = „dvejetainė_crossentropija“,
optimizatorius = 'adam',
metrika = ['tikslumas'])
spausdinti (model.summary ())

Ankstesnis kodo fragmentas nusako giluminio mokymosi modelio formą, kai jis naudoja kelis specializuotus sluoksnius natūraliam kalbos apdorojimui iš „Keras“. Pavyzdyje taip pat reikėjo modelio suvestinės (komanda model.summary ()), kad būtų galima nustatyti, kas vyksta su architektūra, naudojant skirtingus neuroninius sluoksnius.

Jūs turite „Įterpimo“ sluoksnį, kuris skaitmenines sekas paverčia tankiu žodžių įterpimu. Šio tipo žodžių įterpimas yra labiau tinkamas išmokti RNN sluoksniui. „Keras“ teikia įterpimo sluoksnį, kuris, nebūtinai turėdamas būti pirmasis tinklo sluoksnis, gali atlikti dvi užduotis:

  • Taikant iš anksto įvestą žodžio įterpimą (pvz., Word2vec ar GloVe) sekos įvedimui. Jums tereikia perduoti matricą, kurioje yra įterpimas, į jos parametrų svorius. Sukurti žodį, įterpiantį nuo nulio, atsižvelgiant į jo gaunamas įvestis.

Šiuo antruoju atveju norint įterpti reikia žinoti:

  • input_dim: žodyno dydis, kurio tikimasi iš duomenų output_dim: bus sukurtos įdėjimo vietos dydis (vadinamieji matmenys) input_length: sekos dydis, kurio tikimasi

Kai nustatysite parametrus, įterpimas ras geresnius svorius, kad treniruotėse sekos būtų paverčiamos tankiu matrica. Tankus matricos dydis nurodomas pagal sekų ilgį ir įterpimo matmenis.

Jei naudojate „Keras“ pateiktą sluoksnių įdėjimo sluoksnį, turite atsiminti, kad funkcija pateikia tik žodyno dydžio svorio matricą pagal norimo įdėjimo matmenis. Jis susieja žodžius su matricos stulpeliais ir tada suderina matricos svorius su pateiktais pavyzdžiais. Šis sprendimas, nors ir praktiškas nestandartinėms kalbos problemoms, nėra analogiškas anksčiau aptartiems žodžių įterpimams, kurie mokomi kitaip ir pateikiami milijonams pavyzdžių.

Pavyzdyje naudojamas dvikryptis įvyniojimas - LSTM 64 ląstelių sluoksnis. Dvikryptis paverčia normalų LSTM sluoksnį padvigubindamas jį: pirmoje pusėje jis taiko įprastą jūsų pateiktą įvestų seką; antrajame jis pereina priešinga eilės seka. Jūs naudojate šį metodą, nes kartais jūs naudojate žodžius skirtingomis, tinkamiausiomis, eilėmis, ir kurdami dvikryptį sluoksnį, jūs sugausite bet kokį žodžių šabloną, nesvarbu, kokia tvarka. „Keras“ diegimas iš tikrųjų yra paprastas: jūs tiesiog pritaikote jį kaip funkciją sluoksnyje, kurį norite pateikti dviem kryptimis.

Dvikryptis LSTM yra nustatytas grąžinti sekas (return_sequences = true); tai yra, kiekvienai ląstelei grąžinamas rezultatas, pateiktas pamačius kiekvieną sekos elementą. Kiekvienos sekos rezultatas yra 200 x 128 išvesties matrica, kur 200 yra sekos elementų skaičius, o 128 yra sluoksnyje naudojamų LSTM ląstelių skaičius. Ši technika neleidžia RNN imti paskutinio kiekvienos LSTM ląstelės rezultato. Užuominos apie teksto sentimentus iš tikrųjų galėjo būti bet kurioje įterptųjų žodžių sekos vietoje.

Trumpai tariant, svarbu atsižvelgti ne į paskutinį kiekvienos ląstelės rezultatą, o į geriausią jo rezultatą. Todėl kodas priklauso nuo kito sluoksnio „GlobalMaxPool1D“, kad būtų galima patikrinti kiekvieną rezultatų seką, kurią teikia kiekviena LSTM ląstelė, ir išlaikyti tik maksimalų rezultatą. Tai turėtų užtikrinti, kad pavyzdžiu būtų paimtas stipriausias signalas iš kiekvienos LSTM ląstelės, kuri, tikimės, specializuojasi mokydama pasirinkti reikšmingus signalus.

Filtravus neuroninius signalus, pavyzdyje yra 128 išvestys, po vieną kiekvienai LSTM ląstelei. Kodas sumažina ir sumaišo signalus, naudodamas iš eilės tankų 16 neuronų sluoksnį, suaktyvindamas ReLU (taigi, praeina tik teigiami signalai). Architektūra baigiasi paskutiniu mazgu, naudojant sigmoidinį aktyvavimą, kuris išspaudžia rezultatus į 0–1 diapazoną ir privers juos atrodyti kaip tikimybes.

Apibrėžę architektūrą, dabar galite išmokyti tinklą atlikti sentimentų analizę. Pakaks trijų epochų (perduoti duomenis tris kartus per tinklą, kad jis išmoktų modelius). Kodas naudoja 256 apžvalgų grupes kiekvieną kartą, o tai leidžia tinklui kiekvieną kartą pamatyti pakankamai įvairių žodžių ir jausmų, prieš atnaujinant savo svorius naudojant atkūrimą. Galiausiai kodas sutelkiamas į rezultatus, kuriuos pateikia patvirtinimo duomenys (kurie nėra treniruočių duomenų dalis). Gavę gerą rezultatą iš patvirtinimo duomenų reiškia, kad nervinis tinklas teisingai apdoroja įvestį. Kodas praneša apie patvirtinimo duomenis iškart po kiekvienos epochos pabaigos.

history = model.fit (x_train, y_train,
patvirtinimo_duomenys = (x_test, y_test),
epochos = 3, partijos dydis = 256)

Rezultatų gavimas užtrunka, tačiau, jei naudojate GPU, jis baigsis išgėrus kavos puodelį. Šiuo metu jūs galite įvertinti rezultatus dar kartą naudodamiesi patvirtinimo duomenimis. (Rezultatuose neturėtų būti jokių netikėtumų ar skirtumų, palyginti su tuo, apie kurį pranešta mokymo metu.)

nuostolis, metrika = modelis.evaluate (x_test, y_test, verbose = 0)
spausdinti („Testo tikslumas:% 0.3f“% metrika)

Galutinis tikslumas, kuris yra teisingų giliųjų nervų tinklo atsakymų procentas, bus maždaug 85–86 procentai. Rezultatai šiek tiek pasikeis kiekvieną kartą, kai vykdysite eksperimentą, dėl atsitiktinumo, kai kuriate savo nervų tinklą. Tai visiškai normalu atsižvelgiant į mažą duomenų, su kuriais dirbate, dydį. Jei pradėsite nuo teisingų laimės svorių, išmokti bus lengviau per tokią trumpą treniruotę.

Galų gale jūsų tinklas yra sentimentų analizatorius, galintis tiksliai atspėti apie filmo peržiūrą išreikštas mintis apie 85 procentus laiko. Turėdami dar daugiau treniruočių duomenų ir sudėtingesnes neuronines architektūras, galite gauti dar įspūdingesnių rezultatų. Rinkodaroje panašus įrankis naudojamas automatizuoti daugelį procesų, kuriems reikia perskaityti tekstą ir imtis veiksmų. Vėlgi, jūs galite susieti tokį tinklą su neuroniniu tinklu, kuris klauso balso ir paverčia jį tekstu. (Tai yra dar viena RNN taikomoji programa, dabar maitinanti „Alexa“, „Siri“, „Google Voice“ ir daugelį kitų asmeninių padėjėjų.) Perėjimas suteikia programai galimybę suprasti sentimentus net ir balsine išraiška, pavyzdžiui, kliento telefono skambučiu.

Taip pat žiūrėkite

Kaip užpildyti savo fantazijos futbolo sąrašą„Keto FluKeto“ deserto recepto simptomai ir gynimo priemonės: grietinėlės sausainių tešlos putėsiai „Keto“ pusryčių receptas: avokadų skrebučio skrebučių kepimo keto patiekalų receptas su vienu patiekalu: kepsnių antienos kepsnys su traškia „KaleKeto“ užkandžio receptu: „traškūs“ keptų svogūnų žiedai „Keto“ receptas ir „Catoto“ receptas: „Catoif“ receptai.Kriptovaliutų gavyba ir bangų algoritmų įrodymasKaip apsaugoti „MacBook“ privatumą: „iTunes“ pakeitimą iš naujo: „MacOS Catalina“ naujoji muzika ir TV programos „Kas naujo su„ macOS Catalina “? Greiti patarimai, kaip nustatyti„ MacOS Catalina “ir užregistruoti„ MacBookMacBook “manekenams. „Macintosh“ paskyros „Tikrinkite„ Windows PC “mikrofoną. Kaip atkurti failus iš failų istorijos sistemoje„ Windows 10 “Tinklo disko atkūrimas„ Windows 10 “asmeniniame kompiuteryjeKaip patikrinti jūsų stabdžių linijasKaip paleisti „CarHow“? Kaip sužinoti, ar jūsų transporto priemonei reikia sureguliuoti? Kaip pašalinti katalizinius keitiklius? Kaip dažnai turėtumėte pakeisti savo alyvą? Kaip patikrinti jūsų transporto priemonės alyvos lygį? Kaip praplauti automobilio aušinimo sistemą? Kaip pašalinti perkaitimo variklį? Kaip pakeisti padangą Kaip įdiegti uždegimo žvakę Kaip pašalinti senus uždegimo žvakė Kaip patikrinti diskinius stabdžiusKaip pakeisti stabdžių skystį Kaip patikrinti pagrindinį stabdžių sistemos cilindrą Kaip patikrinti transporto priemonės stabdžių skystįKodėl mano automobilis perkaista ir ką aš galiu padaryti? Kaip saugiai lizdą palikti Kaip patikrinti jūsų stabdžių linijas