Bir Metin Sınıflandırma Programı Oluşturun: Bir NLP Eğitimi
Yayınlanan: 2022-03-11Derin öğrenme, makine öğrenimi iş akışlarının önemli bir parçası haline gelen bir teknolojidir. Paralel bilgi işlem gücündeki ve destekleyici araçlardaki iyileştirmelerden yararlanarak, bir zamanlar pratik olmayan karmaşık ve derin sinir ağları şimdi uygulanabilir hale geliyor.
Tensorflow, Torch ve Deeplearning4j gibi güçlü ve erişilebilir kütüphanelerin ortaya çıkması, büyük teknoloji şirketlerinin akademi ve araştırma departmanlarının ötesindeki kullanıcılara da geliştirme olanağı sağladı. Büyüyen yaygınlığının bir kanıtı olarak, Huawei ve Apple gibi şirketler artık derin öğrenme uygulamalarını güçlendirmek için en yeni cihazlarına özel, derin öğrenme için optimize edilmiş işlemciler ekliyor.
Derin öğrenme, gücünü birçok alanda kanıtlamıştır. En önemlisi, Google'ın AlphaGo'su, bir zamanlar akıllara durgunluk veren karmaşıklığı, insan oyunculara karşı rekabetinde bilgisayarlara neredeyse aşılmaz bir engel olarak görülen bir oyun olan Go oyununda insan oyuncuları yenebildi. Sony'nin Flow Machines projesi, geçmişin ünlü müzisyenlerinin tarzında müzik besteleyebilen bir sinir ağı geliştirdi. Apple tarafından geliştirilen bir güvenlik özelliği olan FaceID, kullanıcının yüzünü tanımak ve zaman içinde kullanıcının yüzündeki değişiklikleri izlemek için derin öğrenmeyi kullanır.
Bu yazıda derin öğrenmeyi en sevdiğim iki konuya uygulayacağız: doğal dil işleme ve şarap. Uzmanlar tarafından doğal dildeki şarap incelemelerini anlamak için bir model oluşturacağız ve inceledikleri şarabın çeşitliliğini çıkaracağız.
NLP için Derin Öğrenme
Derin öğrenme, bir cümlenin altında yatan karmaşık yapıyı ve çeşitli kelimelerin anlamsal yakınlığını öğrenmek için çok uygun olduğu için, doğal dil işlemede (NLP) yaygın olarak kullanılmıştır. Örneğin, duygu analizi için mevcut en son teknoloji, olumsuzlamalar ve karışık duygular gibi modellenmesi zor dilbilimsel kavramları yakalamak için derin öğrenmeyi kullanır.
Derin öğrenmenin diğer NLP algoritmalarına göre birçok avantajı vardır:
- Esnek modeller: Derin öğrenme modelleri, diğer ML modellerinden çok daha esnektir. Gerektiğinde katman ekleyip çıkararak farklı yapılarla kolayca deney yapabiliriz. Derin öğrenme modelleri, esnek çıktılara sahip modeller oluşturmaya da olanak tanır. Esneklik, karmaşık dil yapılarını anlamak için çok uygun modeller geliştirmenin anahtarıdır. Çeviriler, sohbet robotları ve metinden konuşmaya uygulamaları gibi NLP uygulamaları geliştirmek için de gereklidir.
- Daha az alan bilgisi gerekir: İyi bir derin öğrenme modeli geliştirmek için kesinlikle bir miktar alan bilgisi ve sezgiye ihtiyaç duyulurken, derin öğrenme algoritmalarının özellik hiyerarşilerini kendi başına öğrenme yeteneği, bir geliştiricinin o kadar derinlemesine bilgiye ihtiyaç duymadığı anlamına gelir. derin öğrenme NLP algoritmaları geliştirmek için problem alanı. Doğal dil kadar karmaşık bir problem uzayı için bu çok hoş bir avantajdır.
- Daha kolay sürekli öğrenme: Yeni veriler geldikçe derin öğrenme algoritmalarının eğitilmesi kolaydır. Bazı makine öğrenimi algoritmaları, güncelleme için tüm veri kümesinin model aracılığıyla gönderilmesini gerektirir, bu da canlı, büyük veri kümeleri için bir sorun teşkil eder.
Bugünün Sorunu
Bugün, inceleme metnine dayanarak incelenmekte olan şarabın çeşitliliğini belirlemek için bir derin öğrenme algoritması oluşturacağız. https://www.kaggle.com/zynicide/wine-reviews adresinde Kaggle kullanıcısı zackthoutt tarafından sağlanan şarap dergisi veri setini kullanacağız.
Kavramsal olarak soru şu ki, şöyle bir şarap incelemesi alabilir miyiz…
Aromalar arasında tropikal meyve, süpürge, kükürt ve kuru ot bulunur. Damak aşırı derecede etkileyici değil, canlı asitliğin yanı sıra olgunlaşmamış elma, narenciye ve kuru adaçayı sunuyor.
…ve bunun beyaz bir karışımla ilgili olduğunun farkında mısınız? Bazı şarap meraklıları, elma, narenciye ve belirgin bir asitlik gibi beyaz şarapların belirgin işaretlerini tanıyabilir, ancak sinir ağımızı bu sinyalleri tanımak için eğitebilir miyiz? Ek olarak, beyaz karışım incelemesi ile pinot grigio incelemesi arasındaki ince farkları tanımak için sinir ağımızı eğitebilir miyiz?
Benzer Algoritmalar
Bugün üzerinde çalıştığımız problem aslında bir NLP sınıflandırma problemidir. NLP'deki çeşitli problemlere uygulanmış birkaç NLP sınıflandırma algoritması vardır. Örneğin, çeşitli spam algılama algoritmalarında saf Bayes kullanılmış ve sağlık kurumlarında ilerleme notları gibi metinleri sınıflandırmak için destek vektör makineleri (SVM) kullanılmıştır. Derin öğrenme modelimize temel teşkil etmesi için bu algoritmaların basit bir versiyonunu uygulamak ilginç olurdu.
Naif bayanlar
NLP için saf Bayes'in popüler bir uygulaması, metnin TF-IDF kullanılarak ön işlenmesini ve ardından çok terimli saf Bayes'in önceden işlenmiş çıktılar üzerinde çalıştırılmasını içerir. Bu, algoritmanın bir belgedeki en belirgin kelimeler üzerinde çalışmasına izin verir. Naive Bayes'i aşağıdaki gibi uygulayabiliriz:
import numpy as np from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfTransformer df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() varietal_list = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = np.array(varietal_list) count_vect = CountVectorizer() x_train_counts = count_vect.fit_transform(description_list) tfidf_transformer = TfidfTransformer() x_train_tfidf = tfidf_transformer.fit_transform(x_train_counts) train_x, test_x, train_y, test_y = train_test_split(x_train_tfidf, varietal_list, test_size=0.3) clf = MultinomialNB().fit(train_x, train_y) y_score = clf.predict(test_x) n_right = 0 for i in range(len(y_score)): if y_score[i] == test_y[i]: n_right += 1 print("Accuracy: %.2f%%" % ((n_right/float(len(test_y)) * 100)))
Yukarıdaki kodu çalıştırın ve aşağıdakine benzer bir şey görmelisiniz: %73.56

10 sınıfa baktığımızı düşünürsek, bu oldukça iyi bir sonuç.
Ayrıca destek vektör makinesini kullanabilir ve nasıl olacağını görebiliriz. Nasıl performans gösterdiğini görmek için sınıflandırıcı tanımını şununla değiştirin:
clf = SVC(kernel='linear').fit(train_x, train_y)
Bunu çalıştırın ve aşağıdaki çıktıyı görmelisiniz:
Doğruluk: %80.66
Çok perişan da değil.
Bakalım bu sonuçları geçebilecek veya en azından eşleştirebilecek bir derin öğrenme modeli oluşturabilecek miyiz? Bunu başarabilirsek, derin öğrenme modelimizin en azından alan uzmanlığı tarafından bilgilendirilmiş popüler makine öğrenimi modellerinin sonuçlarını çoğaltmada etkili olduğunun harika bir göstergesi olacaktır.
Modeli Oluşturma
Bugün, modelimizi oluşturmak için Keras'ı Tensorflow ile kullanacağız. Keras, Tensorflow API'nin nispeten düşük seviyeli arayüzüne kıyasla derin öğrenme modelleri oluşturmayı çok kolaylaştıran bir Python kitaplığıdır. Yoğun katmanlara ek olarak, kelimelerin altında yatan anlamsal bilgileri ve verilerdeki olası yapısal kalıpları öğrenmek için gömme ve evrişimli katmanları da kullanacağız.
Veri temizleme
İlk olarak, verileri sinir ağımız tarafından kolayca işlenebilecek ve anlaşılabilecek şekilde yeniden yapılandırmamız gerekecek. Bunu, kelimeleri benzersiz tanımlayıcı sayılarla değiştirerek yapabiliriz. Bir gömme vektörü ile birleştirildiğinde, kelimeleri hem esnek hem de anlamsal olarak duyarlı bir şekilde temsil edebiliyoruz.
Uygulamada, bu ön işleme konusunda biraz daha akıllı olmak isteyeceğiz. Sık kullanılan sözcüklere odaklanmak ve ayrıca en sık kullanılan sözcükleri (örneğin, the, this, a) filtrelemek mantıklı olacaktır.
Bu işlevi Defaultdict ve NLTK kullanarak uygulayabiliriz. Aşağıdaki kodu ayrı bir Python modülüne yazın. Onu lib/get_top_x_words.py
içine yerleştirdim.
from nltk import word_tokenize from collections import defaultdict def count_top_x_words(corpus, top_x, skip_top_n): count = defaultdict(lambda: 0) for c in corpus: for w in word_tokenize(c): count[w] += 1 count_tuples = sorted([(w, c) for w, c in count.items()], key=lambda x: x[1], reverse=True) return [i[0] for i in count_tuples[skip_top_n: skip_top_n + top_x]] def replace_top_x_words_with_vectors(corpus, top_x): topx_dict = {top_x[i]: i for i in range(len(top_x))} return [ [topx_dict[w] for w in word_tokenize(s) if w in topx_dict] for s in corpus ], topx_dict def filter_to_top_x(corpus, n_top, skip_n_top=0): top_x = count_top_x_words(corpus, n_top, skip_n_top) return replace_top_x_words_with_vectors(corpus, top_x)
Artık modeli oluşturmaya hazırız. Uygulamamız için yararlı olabilecek tüm derin öğrenme özelliklerinden yararlanmak için bir gömme katmanı, evrişim katmanı ve yoğun bir katman istiyoruz. Keras ile modeli çok basit bir şekilde oluşturabiliriz:
from keras.models import Sequential from keras.layers import Dense, Conv1D, Flatten from keras.layers.embeddings import Embedding from keras.preprocessing import sequence from keras.utils import to_categorical import pandas as pd from collections import Counter from sklearn.model_selection import train_test_split from lib.get_top_xwords import filter_to_top_x df = pd.read_csv('data/wine_data.csv') counter = Counter(df['variety'].tolist()) top_10_varieties = {i[0]: idx for idx, i in enumerate(counter.most_common(10))} df = df[df['variety'].map(lambda x: x in top_10_varieties)] description_list = df['description'].tolist() mapped_list, word_list = filter_to_top_x(description_list, 2500, 10) varietal_list_o = [top_10_varieties[i] for i in df['variety'].tolist()] varietal_list = to_categorical(varietal_list_o) max_review_length = 150 mapped_list = sequence.pad_sequences(mapped_list, maxlen=max_review_length) train_x, test_x, train_y, test_y = train_test_split(mapped_list, varietal_list, test_size=0.3) max_review_length = 150 embedding_vector_length = 64 model = Sequential() model.add(Embedding(2500, embedding_vector_length, input_length=max_review_length)) model.add(Conv1D(50, 5)) model.add(Flatten()) model.add(Dense(100, activation='relu')) model.add(Dense(max(varietal_list_o) + 1, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) model.fit(train_x, train_y, epochs=3, batch_size=64) y_score = model.predict(test_x) y_score = [[1 if i == max(sc) else 0 for i in sc] for sc in y_score] n_right = 0 for i in range(len(y_score)): if all(y_score[i][j] == test_y[i][j] for j in range(len(y_score[i]))): n_right += 1 print("Accuracy: %.2f%%" % ((n_right/float(len(test_y)) * 100)))
Kodu çalıştırın ve aşağıdaki çıktıyı görmelisiniz.
Doğruluk: %77.20
Saf Bayes ve SVC için doğruluğun sırasıyla %73.56 ve %80.66 olduğunu hatırlayın. Dolayısıyla sinir ağımız, oradaki daha yaygın metin sınıflandırma yöntemlerinin bazılarına karşı çok fazla kendini tutuyor.
Çözüm
Bugün, şarap incelemelerini analiz etmek için bir sınıflandırma derin öğrenme modeli oluşturmayı ele aldık.
Diğer makine öğrenimi algoritmalarından bazılarıyla rekabet edebilecek ve onlardan daha iyi performans gösterebilecek bir model oluşturabildiğimizi gördük. Daha karmaşık veri kümelerini analiz eden ve daha karmaşık çıktılar üreten uygulamalar oluşturmak için bu bilgileri kullanmak için ilham alacağınızı umuyoruz!
Not: Bu yazı için kullandığım kodu GitHub'da bulabilirsiniz.
Toptal Mühendislik Blogunda Daha Fazla Okuma:
- Daha Derin Bir Anlam: Python'da Konu Modelleme
- E-posta Duyarlılık Analizi Botu Nasıl Oluşturulur: Bir NLP Eğitimi