Bu makale, Veri Bilimi Blogathon.
LSTM kullanarak Metin oluşturma hakkında uçtan uca bir kılavuz
Hey millet!
Bu yazımızda uçtan uca örneklerle LSTM kullanarak metin oluşturma hakkında konuşacağız. LSTM ile ilgili kavramlara da hızlı bir revizyon olarak bakacağız.
Gelecek nesilde, bir dizinin belirli bir kelimesinin bir sonraki karakterini tahmin ediyoruz. Metin verileri, bir sözcük dizisi veya bir bireysel veri dizisi olarak görülebilir. Dizi tahmini için RNN/LSTM/GRU gibi derin öğrenme modelleri kullandık.
Daha önce RNN fikri üzerine çok detaylı bir yazı yazmıştım, ardından RNN'nin neden pratik olmadığını tartıştım ve RNN ve GRU'yu örneklerle açıkladım. buna başvurabilirsin Link.
İçindekiler
- LSTM'ye Giriş
- RNN neden başarısız oluyor?
- LSTM mimarisini ve çeşitli Gates'i anlama
- Metin Üretimi fikri
- LSTM kullanarak Metin Üretiminin Uygulanması
Giriş
Metin oluşturma, AI tabanlı araçların çok önemli bir özelliği olarak kabul edilebilir. İnsanlara karşı daha etkileşimli hale gelmesi beklenen makinelerde çok işe yarar. akıllı hoparlörler, ev asistanları gibi akıllı araçlar bazı biçimlerde metin oluşturmayı kullanır.
Metin Oluşturma örneklerini kullanın
- Arama motorları
- Chatbots
- Metin özetleme
- Soru cevaplama
RNN Metin Üretimi için Neden Pratik Değil?
RNN'nin kaybolan ve patlayan gradyanlarla ilgili büyük bir sorunu var. bu nedenle RNN daha uzun sıralı bilgileri tutamaz ve Metin oluşturma görevinde özellikle uzun bir veri dizisini ezberleyebilen bir modele ihtiyacımız var. bu amaçla LSTM devreye girdi.
LSTM (Uzun Kısa Süreli Bellek)
Bildiğimiz gibi RNN sıralı verileri uzun süre tutamaz/ezberleyemez ve önceki girdileri unutmaya başlar ve yeni girdi gelir. Bu sorunu gidermek için LSTM çeşitli kapılarla tasarlanmıştır.
LSTM, farklı türde kapılar kullanarak kısa süreli bellek öğrenme problemini çözer.
RNN'ye yeni bir girdi geldiğinde, gelen girdinin önemli olup olmadığına karar vermeden mevcut bilgiyi değiştirir, LSTM durumunda ise sadece önemli girdilerin mevcut bilgiyi değiştirmesine izin vermek için kullanılabilir.
LSTM'de kapılar, hangi verilerin yok sayılacağına ve eğitim için neyin ileri sürüleceğine karar verir. LSTM'de 3 kapı vardır:
- Giriş Kapısı
- Çıkış Kapısı
- Kapıyı unut
Kapıyı unut
Bu kapı, ilgili bilgilerin seçilmesinden ve alakasız bilgilerin atılmasından sorumludur. ilgili bilgiler seçildikten sonra giriş kapısından geçirilir.
İlk olarak, mevcut durumdan ve önceki gizli durumdan gelen bilgiler aktivasyon fonksiyonundan geçirilir. burada sigmoid aktivasyon fonksiyonu olacak. Sigmoid aktivasyon fonksiyonu dönüş değeri 0 ile 1.a arasında 0'a yakın bir değer, mevcut bilginin yok sayılması gerektiği anlamına gelir, aksi takdirde giriş kapısından geçirilmelidir.
Giriş Kapısı
Bu kapı, aktivasyon fonksiyonu sigmoid kullanılarak modele bilgi eklemekten sorumludur. Aktivasyon fonksiyonunu kullanma tanh
giriş kapısından geçen bir dizi bilgi oluşturur. bilgi dizisi -1 ile 1 arasında değişen değerler içerir ve a sigmoid
işlev filtreleyin ve modele hangi bilgilerin eklenmesi gerektiğini ve hangi bilgilerin atılması gerektiğini koruyun.
Çıkış Kapısı
Çıkış Kapısı, bir sonraki zaman adımında taşınan hücre durumları ile birlikte bir sonraki gizli durumları oluşturmaktan sorumludur. Aktivasyon fonksiyonunu kullanarak gizli bir durum yaratır. tanh
ve değeri -1 ile 1 arasında değişmektedir.
Metin Üretimi Fikri
Metin oluşturma, sürekli bir sonraki kelime tahminleri dizisinden başka bir şey değildir. Metin verilerinin bir kelime dizisi olduğunu zaten bildiğimiz için, bu dizileri kullanarak bir sonraki kelimeyi tahmin edebiliriz.
Metin Oluşturma Uygulaması
Metin oluşturma için listelenen çeşitli adımlar vardır: -
- Gerekli kitaplıkları yükleyin
- Metin verilerini yükleyin
- Gerekirse metin temizleme gerçekleştirin
- Eğitim için veri hazırlama
- LSTM modelini tanımlayın ve eğitin
- Tahmin
Gerekli kütüphaneler yükleniyor
- veri işleme için kütüphaneler
pandaları pd olarak içe aktar numpy'yi np içe aktarma dizesi olarak içe aktar, işletim sistemi içe aktarma uyarıları uyarıları.filterwarnings("ignore") Warnings.simplefilter(action='ignore', Category=FutureWarning)
- derin öğrenme kitaplıkları yükleme
# yeniden üretilebilirlik için tohumları ayarlayın tensorflow'dan set_random_seed'i numpy.random'dan içe aktar tohum set_random_seed(2) tohum(1) # LSTM oluşturmak için keras modülü keras.preprocessing.sequence'den pad_sequences'i keras.layers'dan içe aktar Embedding, LSTM, Dense, Dropout keras.preprocessing.text'ten içe Tokenizer'ı keras.callbacks'ten içe aktar keras.models'den EarlyStopping'i içe aktar Sıralı içe aktar keras.utils'i ku olarak
Veri Kümesini Yükleme
Kullanacağız Newyork'un zaman yorumları Kaggle'da mevcut veri seti. yapabilirsin indir veya bu veri kümesini kullanarak yeni bir Kaggle not defteri bile oluşturabilirsiniz.
Veri seti çeşitli makaleler ve yorumlar içermektedir. Amacımız, tüm makaleleri manşet olarak yüklemek ve bir liste halinde birleştirmek.
# Tüm başlıklar liste olarak yükleniyor curr_dir = '../input/' all_headlines = [] os.listdir(curr_dir) içindeki dosya adı için: dosya adında 'Makaleler' varsa: article_df = pd.read_csv(curr_dir + dosyaadı) all_headlines.extend(list(article_df.headline. değerler)) kırılma
all_headlines = [all_headlines if satırda satır satır!= "Bilinmeyen"] print(all_headlines[:10])
Toplam 829 başlığımız var ve bu başlıkları metin oluşturmak için kullanacağız.
Veri Seti Hazırlama
Veri Kümesi Hazırlama için ilk görevimiz, noktalama işaretlerini, küçük harfleri vb. kaldırmayı içeren metin verilerini temizlemek olacaktır.
Veri temizleme
Bir seferde tek bir başlık alan ve temizlenen başlığı döndüren bir fonksiyon tanımladık. Yinelemeyi kullanarak her bir başlığı geçtik ve temizlenmiş veri külliyatının bir listesini yaptık.
def clean_text(txt): txt = "".join(t, string.punctuation'da değilse kalay txt için.lower() txt = txt.encode("utf8").decode("ascii",'ignore') txt'yi döndür
bütünce = [tüm_başlıklarda x için temiz_metin(x)] print(derlem[:10])
Eğitim için n-gram Dizisi oluşturma
NLP dil modelinde sıralı giriş verileri gerekir ve giriş kelimesi/belirteç sayısal olmalıdır. Burada, modelimizi bir sonraki kelime tahmini için eğitmek için n-gramlar üretiyoruz.
tokenizer = Tokenizer() def get_sequence_of_tokens(corpus): ## tokenization tokenizer.fit_on_texts(corpus) total_words = len(tokenizer.word_index) + 1 ## verileri bir simge dizisine dönüştür input_sequences = [] derlemdeki satır için: token_list = tokenizer .texts_to_sequences([line])[0] i in range(1, len(token_list)): n_gram_sequence = token_list[:i+1] input_sequences.append(n_gram_sequence) return input_sequences, total_words
inp_sequences, total_words = get_sequence_of_tokens(corpus) print(inp_sequences[:10])
gördüğün gibi inp_sequence
sonraki kelime tahminini eğitmek için gerekli olan bir n-gram dizisidir. 829 başlığımız vardı ve n-gram konseptini kullanarak şimdi 4544 satırımız var.
ilişkilendirebilirsiniz inp_sequences
Her adımda eğitim için Seed dizisine bir jeton eklediğimizi açıkça görebileceğiniz bu resim ile.
Dizileri Doldurma
The inp_sequence
Biz sadece eğitim için uygun olmayan değişken dizi uzunluğuna sahip olduk, dolgu kullanarak her diziyi aynı uzunlukta yapıyoruz.
def create_padded_sequences(input_sequences): max_sequence_len = max([input_sequences'teki x için [len(x)]) input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')), öngörücüler, etiket :-1],input_sequences[:,-1] label = ku.to_categorical(label, num_classes=total_words) dönüş tahmin edicileri, label, max_sequence_len
tahminciler, etiket, max_sequence_len = create_padded_sequences(inp_sequences)
predictors
: bunlar, bir sonraki kelimeyi tahmin etmek için girdi olarak kullanılacak belirteçlerdir.label:
tahmin edilecek bir sonraki kelimedir.max_sequence_len:
dizi uzunluğudur.pad_sequence:
Keras tarafından sağlanan bir dizi belirteci belirli bir uzunlukta doldurmak için kullanılır.- Bu durumda,
max_sequence_len
17.
Model Oluşturma
Şimdiye kadar verileri eğitim için hazırladık. şimdi bu adımda, alacak bir LSTM modeli oluşturacağız. predictors
X girişi olarak ve labels
y girişi olarak
Keras'taki Katmanlar hakkında hızlı bir hatırlatma: -
- Giriş Katmanı: Bu, giriş sırasını almaktan sorumludur.
- LSTM Katmanı: LSTM birimlerini kullanarak çıktıyı hesaplar ve gizli ve hücre durumlarını döndürür. Bizim durumumuzda katmana daha sonra ince ayar yapılabilecek 100 birim ekledik.
- Bırakma Katmanı: Bu katman, aşırı takmayı önlediği anlamına gelen düzenlemeden sorumludur. bu, LSTM katmanındaki bazı nöronların aktivasyonlarını kapatarak yapılır.
- Çıktı Katmanı: Bu, tahminimizin olasılığını hesaplar.
def create_model(max_sequence_len, total_words): input_len = max_sequence_len - 1 model = Sıralı() # ----------Girdi Gömme Katmanı Ekle model.add(Gömme(toplam_kelimeler, 10, girdi_uzunluk=girdi_len)) # - ---------Gizli Katman 1 Ekle - LSTM Katmanı model.add(LSTM(100)) model.add(Dropout(0.1)) # ----------Çıktı Katmanı modelini ekleyin. add(Dense(total_words, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer='adam') dönüş modeli
model = create_model(max_sequence_len, total_words) model.summary()
Modelin eğitimi
Model mimarisini oluşturduktan sonra, modelimizi kullanarak modeli eğitebiliriz. predictors
(X_tren) ve label
(y_train).100 dönem yeterli olmalıdır.
model.fit(yordayıcılar, etiket, dönemler=100, ayrıntılı=5)
Metin Oluşturma (Tahmin)
Korku !!
Model mimarimizi eğittik ve artık metin oluşturmaya hazır. Girilen kelimelere dayanarak bir sonraki kelimeyi tahmin etmek için bir fonksiyon yazmamız gerekiyor. Ayrıca diziyi belirtmeliyiz ve aynı sequence_length
eğitim için sağladık ve ardından tahmin edilen her kelimeyi bir dize olarak ekleyeceğiz.
def create_text(seed_text, next_words, model, max_sequence_len): aralıktaki _ için(next_words): token_list = tokenizer.texts_to_sequences([seed_text])[0] token_list = pad_sequences([token_list], maxlen=max_sequence_len-1 pre') tahmin edilen = model.predict_classes(token_list, verbose=0) output_word = "" kelime için, indeks tokenizer.word_index.items(): if indeks == tahmin edilen: output_word = kelime sonu seed_text += " "+output_word return tohum_metin.title()
seed_text
: metin üretimi için iletilecek olan ilk kelimelerdir.predict_classes:
tahmin edilen kelime için belirteç kimliğini döndürür.predicted
: Tahmini kelime için simge kimliği ve bu, sözlük kullanılarak tekrar bir kelimeye dönüştürülecektokenizer.word_index .items()
.next_words
Tahmin edilmesini istediğimiz sonraki kelimelerin sayısıdır.
Tahmin
işlevi çağırmak generate_text
text.generate_text işlevi üretecek, ilk kelimeleri ve tahmin edilecek kelime sayısını, model adını ve dizi uzunluğunu alır.
print (generate_text("india and pakistan", 3, model, max_sequence_len)) print (generate_text("president trump", 3, model, max_sequence_len)) print (generate_text("birleşik devletler", 4, model, max_sequence_len)) print (generate_text("donald trump", 2, model, max_sequence_len)) print (generate_text("new york", 3, model, max_sequence_len)) print (generate_text("bilim ve teknoloji", 5, model, max_sequence_len))
Sonuç
Bu yazımızda LSTM modelini mimarisi ile tartıştık ve ardından metin oluşturma Fikrini tartıştık ve LSTM modelini kullanarak metin oluşturmayı gerçekleştirdik.
Eğitimli modelimiz mükemmel bir şekilde çalıştı ancak modeli şu şekilde geliştirebilirsiniz:-
- Eğitim almak için daha fazla veri ekleme
- Model mimarisinde ince ayar, yani (birim sayısı, katman sayısı, vb.).
- (dönemler, birimler, öğrenme hızı, etkinleştirme işlevi vb.)
Okuduğunuz için teşekkürler !!
bana vurmaktan çekinmeyin Linkedin benim için herhangi bir öneriniz veya sorunuz varsa.
Referanslar
- https://iq.opengenus.org/text-generation-lstm/
- https://www.kaggle.com/shivamb/beginners-guide-to-text-generation-using-lstms
Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır.