Zephyrnet Logosu

LSTM ile Metin Üretimini Açıklama

Tarih:

Bu makale, Veri Bilimi Blogathon.

LSTM kullanarak Metin oluşturma hakkında uçtan uca bir kılavuz

LSTM ile Metin Oluşturma
                                                                  Kaynak: geliştirme-kağıdı

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

  1. LSTM'ye Giriş
  2. RNN neden başarısız oluyor?
  3. LSTM mimarisini ve çeşitli Gates'i anlama
  4. Metin Üretimi fikri
  5. 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:

  1. Giriş Kapısı
  2. Çıkış Kapısı
  3. Kapıyı unut
LSTM ile Metin Oluşturma
                                                                 Kaynak: iq.opengenus.org

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 tanhgiriş 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. tanhve değeri -1 ile 1 arasında değişmektedir.

LSTM ile Metin Oluşturma
                                                                Kaynak: iq.opengenus.org

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])
                                                                            Kaynak: Yazar

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])
Kaynak: Yazar

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])
                                                                                      Kaynak: Yazar

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.

                                                             Kaynak: iq.opengenus.org

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.

                                                                              kaynak: Kaggle
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()
LSTM ile Metin Oluşturma
                                                                                   Kaynak: Yazar

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_texttext.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))
                                                                        Kaynak: Yazar

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

  1. https://iq.opengenus.org/text-generation-lstm/
  2. 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.

spot_img

En Son İstihbarat

spot_img