1. Duyarlılık Analizi için AI Kullanımı

John Paul Mueller, Luca Mueller tarafından

Duyarlılık analizi, yazarın metin konusuna yönelik tutumunu (olumlu, olumsuz ya da tarafsız) kullanarak yazılı bir metinden türetir. Bu tür analizler, pazarlama ve iletişimde çalışan insanlar için yararlı olduğunu kanıtlamaktadır, çünkü müşterilerin ve tüketicilerin bir ürün veya hizmet hakkında ne düşündüklerini anlamalarına ve böylece uygun şekilde hareket etmelerine (örneğin, memnun olmayan müşterileri kurtarmaya veya farklı bir satış stratejisi kullanmaya karar vermelerine) yardımcı olur. ). Herkes duyarlılık analizi yapar. Örneğin, metin okurken, insanlar doğal olarak onu yazan kişiyi hareket ettiren duyguyu belirlemeye çalışırlar. Bununla birlikte, okunacak ve anlaşılacak metin sayısı çok fazla olduğunda ve sosyal medyada ve müşteri e-postalarında olduğu gibi metin sürekli olarak biriktiğinde, duygu analizinin otomatikleştirilmesi önemlidir.

AI duygu analizi

Yaklaşan örnek, bir film incelemesinde ifade edilen tutumları sınıflandırabilen bir duyarlılık analizi algoritması oluşturan Keras ve TensorFlow kullanan RNN'lerin test çalışmasıdır. Veriler, incelemenin duyarlılığını ifade eden bir etiketin (0 = negatif, 1 = pozitif) eşlik ettiği 50.000 inceleme (tren ve test setleri arasında ikiye bölünmüş) içeren IMDb veri kümesinin bir örneğidir. IMDb filmler, TV dizileri ve video oyunları hakkında bilgi içeren büyük bir çevrimiçi veritabanıdır. Başlangıçta bir hayran kitlesi tarafından korunuyor, şimdi bir Amazon yan kuruluşu tarafından yönetiliyor. IMDb'de, insanlar favori şovları hakkında ihtiyaç duydukları bilgileri bulurlar, yorumlarını gönderebilir veya diğer ziyaretçilerin okuması için bir inceleme yazabilirler.

Keras, IMDb verileri için indirilebilir bir paketleyici sunar. Bu verileri bir tren ve test setine hazırlar, karıştırır ve düzenlersiniz. Özellikle, Keras tarafından sunulan IMDb metin verileri noktalama işaretlerinden arındırılır, küçük harfe normalize edilir ve sayısal değerlere dönüştürülür. Her sözcük, frekanstaki sıralamasını temsil eden bir sayıya kodlanır. En sık kullanılan kelimelerin sayıları düşüktür; daha az kelime daha yüksek sayılara sahiptir.

Başlangıç ​​noktası olarak, kod imdb işlevini Keras'tan alır ve Internet'ten veri almak için kullanır (yaklaşık 17,5 MB indirme). Örneğin kullandığı parametreler sadece ilk 10.000 kelimeyi kapsar ve Keras verileri belirli bir rastgele tohum kullanarak karıştırmalıdır. (Tohumun bilinmesi, shuffle'ın gerektiği gibi çoğaltılmasını mümkün kılar.) İşlev, hem metin dizilerinden hem de duygu sonucundan oluşan iki tren ve test seti döndürür.

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

Önceki kod tamamlandıktan sonra, aşağıdaki kodu kullanarak örnek sayısını kontrol edebilirsiniz:

print ("Eğitim örnekleri:% i"% len (x_train))
print ("Test örnekleri:% i"% len (x_test))

Sinir ağının eğitim ve test aşamasında kullanılabilecek vakaların sayısı sorulduktan sonra, kod her aşama için 25.000 örneğin bir yanıtını verir. (Bu veri kümesi bir dil sorunu için nispeten küçüktür; açıkça veri kümesi esas olarak gösterim amaçlıdır.) Ayrıca, kod veri kümesinin dengeli olup olmadığını belirler, yani neredeyse eşit sayıda olumlu ve olumsuz duygu örnekleri vardır.

np'yi np olarak içe aktar
print (np.unique (y_train, return_counts = Doğru))

Sonuç, dizi ([12500, 12500]), veri kümesinin pozitif ve negatif sonuçlar arasında eşit olarak bölündüğünü doğrular. Yanıt sınıfları arasındaki böyle bir denge sadece veri kümesinin gösterici doğasından kaynaklanmaktadır. Gerçek dünyada, nadiren dengeli veri kümeleri bulursunuz. Bir sonraki adım, veri kümesinde kullanılan kod ile gerçek kelimeler arasında dönüştürme yapabilen bazı Python sözlükleri oluşturur. Aslında, bu örnekte kullanılan veri kümesi önceden işlenmiştir ve kelimelerin kendisini değil, kelimeleri temsil eden sayı dizilerini sağlar. (Keras'ta bulduğunuz LSTM ve GRU algoritmaları sayı dizilerini sayı olarak bekler.)

word_to_id = {w: i ​​+ 3 w için, imdb.get_word_index () içindeki öğeler ()}
id_to_word = {0: '', 1: '', 2: ''}
id_to_word.update ({i + 3: w için w, imdb.get_word_index (). items ()} içinde)
def convert_to_text (sıra):
return '' .join (s> = 3 ise sırayla s için [id_to_word [s])
baskı (convert_to_text (x_train [8]))

Önceki kod snippet'i, iki dönüştürme sözlüğü (kelimelerden sayısal kodlara ve tersi) tanımlar ve veri kümesi örneklerini okunabilir metne çeviren bir işlev tanımlar. Örnek olarak, kod dokuzuncu örneği yazdırır: “bu film, olduğu gibi korkunç bir tren enkazı gibiydi…”. Bu alıntıdan, bu film için duyguların olumlu olmadığını kolayca tahmin edebilirsiniz. Kötü, enkaz ve korkunç gibi kelimeler güçlü bir olumsuz duygu taşır ve bu da doğru duyguyu tahmin etmeyi kolaylaştırır.

Bu örnekte, sayısal dizileri alır ve bunları kelimelere dönüştürürsünüz, ancak tam tersi yaygındır. Genellikle, kelimelerden oluşan ifadeler alır ve bir RNN katmanına beslemek için bunları tamsayı dizilerine dönüştürürsünüz. Keras, bunu sizin için yapabilen özel bir işlev olan Tokenizer sunar. Kelimelerin egzersiz verilerinden tamsayılara nasıl eşleneceğini öğrenmek için fit_on_text yöntemlerini ve metni bir sekansa dönüştürmek için texts_to_matrix yöntemlerini kullanır.

Bununla birlikte, diğer ifadelerde, duygu analizi için böyle açıklayıcı kelimeler bulamayabilirsiniz. Duygu daha ince veya dolaylı bir şekilde ifade edilir ve düşüncenin metinde erken anlaşılması mümkün olmayabilir, çünkü söylemlerde ve kelimelerde ortaya çıkması söylemde çok daha sonra ortaya çıkabilir. Bu nedenle, ifadenin ne kadarını analiz etmek istediğinize de karar vermeniz gerekir.

Geleneksel olarak, metnin ilk bölümünü alır ve tüm incelemenin temsilcisi olarak kullanırsınız. Bazen mantıklı olmak için birkaç başlangıç ​​kelimesine (örneğin ilk 50 kelimeye) ihtiyacınız vardır; bazen daha fazlasına ihtiyacınız olur. Özellikle uzun metinler yönelimlerini erken ortaya çıkarmaz. Bu nedenle birlikte çalıştığınız metin türünü anlamak ve derin öğrenmeyi kullanarak kaç kelimeyi analiz edeceğinize karar vermek size kalmıştır. Bu örnek, yeterli olması gereken sadece ilk 200 kelimeyi ele almaktadır.

Kodun, sayı 3 ile başlayan kelimelere kod vermeye başladığını ve böylece 0 ile 2 arasındaki kodları bırakmaya başladığını fark ettiniz. İfadenin başlangıcını bildirme, diziyi düzeltmek için boş boşlukları doldurma gibi özel etiketler için düşük sayılar kullanılır belirli bir uzunlukta ve yeterince sık olmadığı için hariç tutulan kelimeleri işaretleme. Bu örnek yalnızca en sık kullanılan 10.000 kelimeyi alır. Başlangıç, bitiş ve dikkate değer durumları belirtmek için etiketleri kullanmak, özellikle makine çevirisi için RNN'lerle çalışan bir numaradır.

keras.preprocessing.sequence içe aktarma pad_sequences
max_pad = 200
x_train = pad_sequences (x_train,
enbüyük = max_pad)
x_test = pad_sequences (x_test,
enbüyük = max_pad)
baskı (x_train [0])

Keras'tan max_pad 200 olarak ayarlanmış pad_sequences işlevini kullanarak, kod her incelemenin ilk iki yüz sözcüğünü alır. İncelemenin iki yüzden az kelime içermesi durumunda, gereken sayıda dizi öğesine ulaşmak için diziden önce gerektiği kadar çok sıfır değeri. Dizileri belirli bir uzunluğa kesmek ve boşlukları sıfır değerlerle doldurmak, derin öğrenme algoritmaları gibi RNN'leri kullanırken önemli bir işleme etkinliği olan giriş dolgusu olarak adlandırılır. Şimdi kod mimariyi tasarlıyor:

keras.models ithal Sıralı
keras.layers içe aktarma Çift Yönlü, Yoğun, Bırakma
keras.layers ithalat GlobalMaxPool1D, LSTM
keras.layers.embeddings ithalat Yerleştirme
embedding_vector_length = 32
model = Sıralı ()
model.add (Gömme (top_words,
embedding_vector_length,
input_length = max_pad))
model.add (Çift Yönlü (LSTM (64, return_sequences = True))))
model.add (GlobalMaxPool1D ())
model.add (Yoğun (16, etkinleştirme = "relu"))
model.add (Yoğun (1, etkinleştirme = "sigmoid"))
model.compile (kaybı = 'binary_crossentropy',
iyileştirici = 'Adam',
metrikleri = [ 'doğruluk'])
Baskı (model.summary ())

Önceki kod snippet'i, Keras'tan doğal dil işleme için birkaç özel katman kullandığı derin öğrenme modelinin şeklini tanımlar. Örnek ayrıca, farklı sinir katmanları kullanarak mimaride neler olduğunu belirlemek için modelin bir özetini (model.summary () komutu) gerektirmiştir.

Sayısal sekansları yoğun bir kelime katışmasına dönüştüren Katıştırma katmanına sahipsiniz. Bu tür kelime gömme, bir RNN katmanı tarafından öğrenilmek için daha uygundur. Keras, mutlaka ağın ilk katmanı olmak zorunda kalmadan iki görevi gerçekleştirebilen bir Gömme katmanı sağlar:

  • Sıra girişine önceden girilmiş kelime gömme (Word2vec veya GloVe gibi) uygulama. Gömmeyi içeren matrisi parametre ağırlıklarına geçirmeniz yeterlidir. Aldığı girdilere dayanarak sıfırdan gömme kelimesi oluşturma.

Bu ikinci durumda, Gömme yalnızca şunları bilmelidir:

  • input_dim: Verilerden beklenen kelime dağarcığının boyutu output_dim: Üretilecek gömme alanının boyutu (boyutlar olarak adlandırılır) input_length: Beklenecek sekans boyutu

Parametreleri belirledikten sonra, Gömme, egzersiz sırasında dizileri yoğun bir matrise dönüştürmek için daha iyi ağırlıklar bulur. Yoğun matris boyutu, dizilerin uzunluğu ve gömmenin boyutu ile verilir.

Keras tarafından sağlanan Gömme katmanını kullanırsanız, işlevin yalnızca istenen gömme boyutuna göre kelime büyüklüğünde bir ağırlık matrisi sağladığını hatırlamanız gerekir. Kelimeleri matrisin sütunlarıyla eşler ve ardından matris ağırlıklarını sağlanan örneklere ayarlar. Standart olmayan dil problemleri için pratik olmasına rağmen, bu çözüm, daha önce tartışılan ve farklı bir şekilde ve milyonlarca örnek üzerinde eğitilmiş kelime düğünlerine benzemez.

Örnek, 64 hücreli LSTM katmanı olan Çift Yönlü sarma kullanır. Çift yönlü normal bir LSTM katmanını iki katına dönüştürerek dönüştürür: İlk tarafta, sağladığınız normal girdi sırasını uygular; ikincisinde, dizinin tersini geçer. Bu yaklaşımı kullanırsınız, çünkü bazen kelimeleri farklı bir sırayla kullanırsınız ve çift yönlü bir katman oluşturmak, sıradan bağımsız olarak herhangi bir kelime kalıbını yakalar. Keras uygulaması gerçekten basittir: Sadece çift yönlü olarak oluşturmak istediğiniz katman üzerinde bir işlev olarak uygularsınız.

Çift yönlü LSTM dizileri döndürecek şekilde ayarlanmıştır (return_sequences = True); yani her hücre için, dizinin her bir öğesini gördükten sonra sağlanan sonucu döndürür. Her sekans için sonuçlar 200 x 128'lik bir çıkış matrisidir, burada 200 sekans elemanlarının sayısı ve 128 katmanda kullanılan LSTM hücrelerinin sayısıdır. Bu teknik, RNN'nin her bir LSTM hücresinin son sonucunu almasını önler. Metnin duyarlılığıyla ilgili ipuçları, gömülü kelimeler sırasında herhangi bir yerde görünebilir.

Kısacası, her hücrenin son sonucunu değil, bunun en iyi sonucunu almak önemlidir. Bu nedenle kod, her bir LSTM hücresi tarafından sağlanan her bir sonuç dizisini kontrol etmek ve sadece maksimum sonucu korumak için aşağıdaki katman olan GlobalMaxPool1D'ye dayanır. Bu, örneğin, her bir LSTM hücresinden en güçlü sinyali almasını sağlamalıdır;

Sinir sinyalleri filtrelendikten sonra, örnekte her bir LSTM hücresi için bir tane olmak üzere 128 çıkışlık bir katman vardır. Kod, ReLU aktivasyonu ile art arda yoğun bir 16 nöron tabakası kullanarak sinyalleri azaltır ve karıştırır (böylece sadece pozitif sinyallerin geçmesini sağlar). Mimari, sonuçları 0–1 aralığına sıkıştıracak ve olasılıklara benzetecek sigmoid aktivasyonunu kullanan bir son düğümle sona erer.

Mimariyi tanımladıktan sonra, artık duygu analizi yapmak için ağı eğitebilirsiniz. Üç çağ (kalıpları öğrenmesi için verileri ağ üzerinden üç kez geçirerek) yeterli olacaktır. Kod, her seferinde 256 yorumluk gruplar kullanır, bu da ağın, geri yayılımı kullanarak ağırlıklarını güncellemeden önce her seferinde yeterli kelime ve duyguları görmesini sağlar. Son olarak, kod doğrulama verilerinin (eğitim verilerinin bir parçası olmayan) sağladığı sonuçlara odaklanır. Doğrulama verilerinden iyi bir sonuç almak, sinir ağının girişi doğru şekilde işlediği anlamına gelir. Kod, her çağ bittikten hemen sonra doğrulama verilerini raporlar.

geçmiş = model.fit (x_train, y_train,
validation_data = (x_test, y_test),
dönem = 3, batch_size = 256)

Sonuçları almak biraz zaman alır, ancak bir GPU kullanıyorsanız, bir fincan kahve içmek için harcadığınız sürede tamamlanır. Bu noktada, yine doğrulama verilerini kullanarak sonuçları değerlendirebilirsiniz. (Sonuçların, eğitim sırasında kodun bildirdiklerinden herhangi bir sürpriz veya farklılığı olmamalıdır.)

kayıp, metrik = model.evaluate (x_test, y_test, ayrıntılı = 0)
print ("Test hassasiyeti:% 0.3f"% metrik)

Derin sinir ağından gelen doğru cevapların yüzdesi olan son doğruluk, yüzde 85-86 civarında bir değer olacaktır. Sinir ağınızı kurarken randomizasyon nedeniyle deneyi her çalıştırdığınızda sonuç biraz değişecektir. Üzerinde çalıştığınız verilerin küçük boyutu göz önüne alındığında, bu normaldir. Doğru şanslı ağırlıklarla başlarsanız, bu kadar kısa bir egzersiz seansında öğrenme daha kolay olacaktır.

Sonunda, ağınız bir film incelemesinde ifade edilen hissenin yaklaşık yüzde 85'ini doğru bir şekilde tahmin edebilen bir duygu analizörüdür. Daha fazla eğitim verisi ve daha karmaşık sinir mimarileri göz önüne alındığında, daha da etkileyici sonuçlar elde edebilirsiniz. Pazarlamada, benzer bir araç, metin okuma ve işlem yapma gerektiren birçok işlemi otomatikleştirmek için kullanılır. Yine, böyle bir ağı, sesi dinleyen ve metne dönüştüren sinir ağı ile birleştirebilirsiniz. (Bu, şimdi Alexa, Siri, Google Voice ve diğer birçok kişisel asistanı destekleyen RNN'lerin başka bir uygulamasıdır.) Geçiş, uygulamanın bir müşterinin telefon görüşmesi gibi ses ifadelerinde bile duyguyu anlamasına izin verir.