Python'un derin öğrenmeyi kullanarak metin özetlemeye yönelik kapsamlı kılavuzu (öğretici ile)

Eser sahibi: ARAVIND PAI

Çeviri: He Zhonghua

Düzeltme: Shen Libin

Bu makale hakkında 7500 kelime 15 dakika okumanız tavsiye edilir.

Bu makalede, seq2seq'in bir metin özetleme modeli ve içindeki dikkat mekanizması oluşturmak için nasıl kullanılacağı açıklanmaktadır. Tam bir model kodu oluşturmak ve yazmak için Keras'ı kullanın.

Giriş

"Tam bir rapor istemiyorum, sadece bana sonuçların bir özetini verin." Kendimi sıklıkla bu durumda buluyorum - ister üniversitede ister işyerinde. Kapsamlı bir rapor hazırladık, ancak öğretmen / müfettişin sadece özeti okumak için zamanı vardı.

Tanıdık geliyor mu? Bu konuda bazı önlemler almaya karar verdim. Raporu elle özete dönüştürmek çok zaman alıyor, değil mi? Yardımcı olması için doğal dil işleme (NLP) teknolojisine güvenebilir miyim?

Doğal Dil İşleme (NLP)

https://courses.analyticsvidhya.com/courses/natural-language-processing-nlp?utm_source=blogutm_medium=comprehensive-guide-text-summarization-using-deep-learning-python

Derin öğrenmeyi kullanarak metin özetlemenin bana gerçekten yardımcı olduğu yer burasıdır. Daha önce beni rahatsız eden sorunu çözüyor - şimdi modelimiz tüm metnin içeriğini anlayabiliyor. Belgelerin hızlı bir özetine ihtiyaç duyanlar için bu rüya gerçek oldu!

Derin öğrenme kullanarak tamamladığımız metin özetlemenin sonucu nedir? Mükemmel. Bu nedenle, bu makalede, onu oluşturmak için gereken tüm kavramları içeren derin öğrenmeyi kullanarak bir metin özetleyici oluşturma sürecini adım adım tanıtacağız. Sonra ilk metin özetleme modelimizi Python'da uygulayacağız!

Not: Bu makale, bazı derin öğrenme kavramlarının temel bir anlayışını gerektirir. Aşağıdaki makaleyi okumanızı tavsiye ederim.

  • Sıra Modellemeye Okunması Gereken Bir Giriş (kullanım örnekleriyle birlikte)

https://www.analyticsvidhya.com/blog/2018/04/sequence-modelling-an-introduction-with-practical-use-cases/?

utm_source = blogutm_medium = kapsamlı-kılavuz-metin-özetleme-derin öğrenme-python kullanarak

  • Dizi Modellemeyi Öğrenmek İçin Okunması Gereken Öğretici (deeplearning.ai Kurs # 5)

https://www.analyticsvidhya.com/blog/2019/01/sequence-models-deeplearning/?utm_source=blogutm_medium=comprehensive-guide-text-summarization-using-deep-learning-python

  • Derin Öğrenmenin Temelleri: Uzun Kısa Süreli Belleğe Giriş

https://www.analyticsvidhya.com/blog/2017/12/fundamentals-of-deep-learning-introduction-to-lstm/?utm_source=blogutm_medium=comprehensive-guide-text-summarization-using-deep-learning-python

içindekiler

1. NLP'de metin özeti nedir?

2. Sekansa (Seq2Seq) modellemeye giriş

3. Kodlayıcı (Kodlayıcı) - kod çözücü (Kod çözücü) mimarisini anlayın

4. Kodlayıcı-kod çözücü yapısının sınırlamaları

5. Dikkat mekanizmasının arkasındaki sezgi

6. Sorun ifadesini anlayın

7. Python'da metin özetleme modelini uygulamak için Keras'ı kullanın

8. Dikkat mekanizması nasıl çalışır?

Bu yazının sonunda "Dikkat mekanizması nasıl çalışır?" Kısmına ayırdım. Bu matematiksel olarak yoğun bir bölümdür ve Python kodunun nasıl çalıştığını anlamak zorunlu değildir. Bununla birlikte, size bu NLP kavramını sağlam bir şekilde anlamanızı sağlayacak çünkü baştan sona okumanızı tavsiye ederim.

Not: Bu makale içerik 7-8, 1-6 içerik içerir, lütfen bakınız: Metin Özetleme için Derin Öğrenmeyi Kullanma için Python Kapsamlı Kılavuz Bölüm 1 (öğreticiyle birlikte)
7. Python'da metin özetleme uygulamak için Keras'ı kullanın

Şimdi Jupyter defterimizi açma zamanı! Hemen uygulama ayrıntılarına girelim.

Özel dikkat katmanı

Keras, dikkat katmanını resmi olarak desteklemiyor. Bu nedenle, ya kendi dikkat katmanımızı uygularız ya da bir üçüncü taraf uygulaması kullanırız. Bu yazıda ikincisini kullanıyoruz.

1. dikkat ithali AttentionLayer

Kitaplığı içe aktar

1. numpy'yi np olarak içe aktar 2. pandaları pd olarak içe aktarın 3. yeniden içe aktar 4. bs4'ten BeautifulSoup içe aktarın 5. keras.preprocessing.text içe aktarma Tokenizer'dan 6. keras.preprocessing.sequence adresinden içe aktarma pad_sequences 7. nltk.corpus'tan içe aktarma engellenecek kelimeler 8. tensorflow.keras.layers'dan Input, LSTM, Embedding, Dense, Concatenate, TimeDistributed, Bidirectional içe aktarın 9. from tensorflow.keras.models import Model 10. tensorflow.keras.callbacks adresinden EarlyStopping içe aktarın 11. ithalat uyarıları 12. pd.set_option ("display.max_colwidth", 200) 13. warnings.filterwarnings ("yoksay")

Veri setini oku

Bu veri seti, Amazon gıda incelemelerini içerir. Bu veriler 10 yılı aşkın bir süredir ve Ekim 2012 itibariyle yaklaşık 500.000 yorumu kapsamaktadır. Bu incelemeler ürün ve kullanıcı bilgilerini, derecelendirmeleri, düz metin incelemeleri ve özetleri içerir. Ayrıca, diğer tüm Amazon kategorilerindeki yorumları da içerir.

Modelin eğitim süresini kısaltmak için 100.000 incelemeyi örnekleyeceğiz. Makinenizde güçlü bilgi işlem gücü varsa, modeli eğitmek için tüm veri kümesini de kullanabilirsiniz.

1. data = pd.read_csv ("../ input / amazon-fine-food-reviews / Reviews.csv", nrows = 100000)

Yinelenenleri ve NA değerlerini kaldırın

1. data.drop_duplicates (subset =, inplace = True) #dropping duplicates 2. data.dropna (axis = 0, inplace = True) #dropping na

Ön işlem

Model oluşturma kısmına girmeden önce, temel ön işleme adımlarını gerçekleştirmek çok önemlidir. Dağınık ve temizlenmemiş metin verilerinin kullanılması, potansiyel olarak yıkıcı bir harekettir. Bu nedenle, bu adımda, problem hedefini etkilemeyen tüm gereksiz sembolleri, karakterleri vb. Metinden sileceğiz.

Kısaltılmış biçimi genişletmek için kullandığımız sözlük budur:

1. contraction_mapping = {"ain't": "değil", "değil": "değildir", "yapamaz": "yapılamaz", "'neden": "çünkü", "olabilirdi ":" olabilir "," olamaz ":" olamaz ", 2. 3. "yapmadı": "yapmadı", "değil": "değil", "yapma": "yapma", "yoktu": "yoktu", "yok ":" yok "," yok ":" sahip değil ", 4. 5. "yapardı": "yapardı", "yapacak": "yapacak", "o": "o", "nasıldı": "nasıl yaptı", "nasıldı" ":" nasılsın "," nasıl yapacaksın ":" nasıl olacak "," nasıl ":" nasıl ", 6. 7. "Yapardım": "Yapardım", "Yapardım": "Yapardım", "Yapacağım": "Yapacağım", "Yapacağım": "Yapacağım "," Ben ":" Ben "," Ben ":" Bende "," yapardım ":" yapardım ", 8. 9. "Yapardım": "Yapardım", "Yapacağım": "Yapacağım", "Yapacağım": "Yapacağım", "Ben": "Ben "," bende ":" bende "," değil ":" değil "," olur ":" olur ", 10. 11. "olur": "olur", "olur": "olur", "olur": "olur", "olur": "olur", "hadi": "hadi", "hanımefendi": "madam", 12. 13. "olmayabilir": "olmayabilir", "olabilir": "olabilir", "olmayabilir": "olmayabilir", "olmayabilir": "olmayabilir", " olmalı ":" olmalı ", 14. 15. "olmamalı": "olmamalı", "olmamalı": "olmamalı", "gerek yok": "gerek yok", "gerek yok": "gerek yok "," o'clock ":" saatin ", 16. 17. "olmamalı": "olmamalı", "olmamalı": "olmamalı", "yapmamalı": "olmamalı", "yapmamalı": "olmamalı" , "sahip olamaz": "olmayacak", 18. 19. "yapardı": "yapardı", "yapardı": "olur", "olur": "olur", "olur": "olur "," o ":" o ", 20. 21. "olmalı": "olmalı", "olmamalı": "olmamalı", "olmamalı": "olmamalı", "öyle olmalı": "olmalı", " ":" gibi ", yirmi iki. 23. "bu": "bu", "bu": "bu", "olurdu": "olurdu", "bu": "bu", "olur" : "olurdu", yirmi dört. 25. "olurdu": "olurdu", "vardır": "vardır", "işte": "işte", "yaparlar": "yaparlar", "yaparlar ' ve ":" olurdu ", 26. 27. "yapacaklar": "yapacaklar", "olacaklar": "alacaklar", "onlar": "onlar", "sahipler": "sahipler", " sahip olmak ":" sahip olmak ", 28. 29. "değildi": "değildi", "yapardık": "yapardık", "yapardık": "yapardık", "yapacağız": "yapacağız", " ":" sahip olacağız "," biz ":" biz ", 30. 31. "elimizde": "elimizde", "değildik": "değildik", "ne olacak": "ne olacak", "ne olacak": "ne olacak", " what're ":" nedir ", 32. 33. "ne var": "ne", "ne var": "ne var", "ne zaman": "ne zaman", "ne zaman": "ne zaman var", "nerede": "nerede did "," nerede ":" nerede ", 34. 35. "nerede": "nerede", "kim olacak": "kim olacak", "kim olacak": "kim olacak", "kim": "kim", "kim ' ve ":" sahip olan ", 36. 37. "neden": "neden", "neden var": "neden var", "olacak": "olacak", "olmayacak": "olmayacak", "olmayacak ":" olmayacak ", 38. 39. "olurdu": "olurdu", "olmazdı": "olmazdı", "olmazdı": "olmazdı", "hepiniz": "hepiniz", 40. 41. "hepiniz": "hepiniz yapardınız", "hepiniz yapardınız": "hepiniz olurdu", "hepiniz": "hepiniz", "y ' hepsi var ":" hepiniz var ", 42. 43. "yapardın": "yapardın", "yapardın": "yapardın", "yapacaksın": "yapacaksın", "yapacaksın": " ", 44. 45. "sen": "sen", "sen": "sahipsin"}

Yorumları önceden işlemek ve özetler oluşturmak için iki farklı işlev tanımlamamız gerekir, çünkü metin ve özetlerde yer alan ön işleme adımları biraz farklıdır.

a) Metin temizleme

Metin ön işleme adımına nasıl devam edeceğinizi anlamak için veri kümesindeki ilk 10 yoruma bir göz atalım:

1. veriler

Çıktı:

Verilerimiz için aşağıdaki ön işleme görevlerini gerçekleştireceğiz:

  • Her şeyi küçük harfe dönüştür
  • HTML etiketlerini kaldır
  • Kısaltılmış form eşlemesi
  • Sil
  • Parantez () içindeki herhangi bir metni silin
  • Noktalama işaretlerini ve özel karakterleri ortadan kaldırın
  • Durdurma kelimelerini sil
  • Kısa kelimeleri sil

Bu işlevi tanımlayalım:

1. stop_words = set (stopwords.words ('ingilizce')) 2. def text_cleaner (metin): 3. newString = text.lower () 4. newString = BeautifulSoup (newString, "lxml"). Metin 5. newString = re.sub (r '\ (* \)', '', newString) 6. newString = re.sub ('"', '', newString) 7. newString = ".join () 8. newString = re.sub (r "'s \ b", "", newString) 9. newString = re.sub ("", "", newString) 10. jetonlar = 11. long_words = 12. i in token'lar için: 13. eğer len (i) > = 3: # kısa kelimeyi kaldırma 14. long_words.append (i) 15. return ("" .join (long_words)). Strip () 16. 17. cleaner_text = 18. verilerdeki t için: 19. cleaner_text.append (text_cleaner (t))

b) Özet temizleme

Şimdi, özet sütununun ön işleme adımlarını anlamak için ilk 10 satır yoruma bakacağız:

1. veriler

Çıktı:

Bu görevin işlevini tanımlayın:

1. def summary_cleaner (metin): 2. newString = re.sub ('"', '', metin) 3. newString = '' .join () 4. newString = re.sub (r "'s \ b", "", newString) 5. newString = re.sub ("", "", newString) 6. newString = newString.lower () 7. tokens = newString.split () 8. newString = '' 9. i in token'lar için: 10. eğer len (i) > 1: 11. newString = newString + i + '' 12. newString döndür 13. 14. # Yukarıdaki işlevi çağırın 15. cleaner_summary = 16. t verisi için: 17. cleaner_summary.append (summary_cleaner (t)) 18. 19. data = cleaner_text 20. data = cleaner_summary 21. data.replace ('', np.nan, inplace = True) 22. data.dropna (eksen = 0, inplace = True)

Özetin başına ve sonuna özel BAŞLANGIÇ ve BİTİŞ etiketleri eklemeyi unutmayın:

1. data = data.apply (lambda x: '_ START _' + x + '_END_')

Şimdi en popüler 5 yoruma ve özetlerine bir göz atalım:

1. aralıktaki i için (5): 2. yazdır ("İncele:", veri ) 3. yazdır ("Özet:", veri ) 4. yazdır ("\ n")

Çıktı:

Dizilerin dağılımını anlayın

Burada, metin uzunluklarının dağılımını tam olarak anlamak için yorumların ve özetlerin uzunluğunu analiz edeceğiz. Bu, dizinin maksimum uzunluğunu belirlememize yardımcı olacaktır:

1. matplotlib.pyplot dosyasını plt olarak içe aktarın 2. text_word_count = 3. summary_word_count = 4. 5. # Cümle uzunluklarıyla listeleri doldurun 6. verilerdeki i için: 7. text_word_count.append (len (i.split ())) 8. 9. verilerdeki i için: 10. summary_word_count.append (len (i.split ())) 11. 12. length_df = pd.DataFrame ({'metin': metin_word_count, 'özet': özet_ kelime_sayısı}) 13. length_df.hist (kutular = 30) 14. plt.show ()

Çıktı:

ilginç. Maksimum yorum uzunluğunu 80'e sabitleyebiliriz çünkü bu çoğu yorumun uzunluğu gibi görünüyor. Benzer şekilde, maksimum özet uzunluğunu 10 olarak ayarlayabiliriz:

1. max_len_text = 802. max_len_summary = 10

Modelin yapım kısmına her geçen gün biraz daha yaklaşıyoruz. Bundan önce, veri setini eğitim ve doğrulama setlerine bölmemiz gerekiyor. Veri kümesinin% 90'ını eğitim verisi olarak kullanacağız ve kalan% 10'daki performansı değerlendireceğiz (ayrılmış küme):

1. sklearn.model_selection'dan import train_test_split 2. x_tr, x_val, y_tr, y_val = train_test_split (data, data, test_size = 0.1, random_state = 0, shuffle = True)

Tokenizer'ı hazırlayın

Simgeleştirici bir kelime dağarcığı oluşturur ve kelime dizilerini tam sayı dizilerine dönüştürür. Metin ve özet için bir belirteç oluşturmaya devam edin:

  • a) Metin belirteç
b) # eğitim verileriyle ilgili incelemeler için bir belirteç hazırlayın c) x_tokenizer = Jetonlaştırıcı () d) x_tokenizer.fit_on_texts (liste (x_tr)) e) f) # metin dizilerini tam sayı dizilerine dönüştür g) x_tr = x_tokenizer.texts_to_sequences (x_tr) h) x_val = x_tokenizer.texts_to_sequences (x_val) ben) j) # maksimum uzunluğa kadar sıfır tamponlama k) x_tr = pad_sequences (x_tr, maxlen = max_len_text, padding = 'post') l) x_val = pad_sequences (x_val, maxlen = max_len_text, padding = 'post') m) n) x_voc_size = len (x_tokenizer.word_index) +1
  • b) Soyut belirteç
1. # eğitim verilerinin özeti için bir belirteç hazırlama 2. y_tokenizer = Tokenizer () 3. y_tokenizer.fit_on_texts (liste (y_tr)) 4. 5. # özet dizilerini tam sayı dizilerine dönüştür 6. y_tr = y_tokenizer.texts_to_sequences (y_tr) 7. y_val = y_tokenizer.texts_to_sequences (y_val) 8. 9. # maksimum uzunluğa kadar sıfır tamponlama 10. y_tr = pad_sequences (y_tr, maxlen = max_len_summary, padding = 'post') 11. y_val = pad_sequences (y_val, maxlen = max_len_summary, padding = 'post') 12. 13. y_voc_size = len (y_tokenizer.word_index) +1

Model oluşturma

Sonunda model yapım kısmına geldi. Ancak inşa etmeden önce, gerekli terminolojinin bazılarına aşina olmamız gerekir.

  • Dönüş Sıraları = Doğru: Dönüş dizileri parametresi True olarak ayarlandığında, LSTM her zaman adımı için gizli durumlar ve birim durumları oluşturur
  • Dönüş Durumu = Doğru: Dönüş durumu = Doğru olduğunda, LSTM yalnızca son zaman adımının gizli durumunu ve birim durumunu üretir
  • İlk Durum: LSTM'nin dahili durumunu ilk adımda başlatmak için kullanılır
  • Yığınlanmış LSTM: Yığınlanmış LSTM, üst üste yığılmış birden çok LSTM katmanına sahiptir. Bu, daha iyi bir dizi gösterimi oluşturabilir. Birden fazla LSTM katmanını bir araya getirmeyi denemenizi öneririm (bu iyi bir öğrenme yöntemidir)

Burada, kodlayıcı için 3 katmanlı yığınlanmış bir LSTM oluşturuyoruz:

1. keras'tan arka ucu K olarak içe aktarın 2. K.clear_session () 3. latent_dim = 5004. 5. # Kodlayıcı 6. encoder_inputs = Giriş (şekil = (maks_len_metin,)) 7. enc_emb = Gömme (x_voc_size, latent_dim, trainable = True) (encoder_inputs) 8. 9. #LSTM 110. encoder_lstm1 = LSTM (latent_dim, return_sequences = True, return_state = True) 11. encoder_output1, state_h1, state_c1 = encoder_lstm1 (enc_emb) 12. 13. #LSTM 214. encoder_lstm2 = LSTM (latent_dim, return_sequences = True, return_state = True) 15. encoder_output2, state_h2, state_c2 = encoder_lstm2 (encoder_output1) 16. 17. #LSTM 318. encoder_lstm3 = LSTM (latent_dim, return_state = True, return_sequences = True) 19. encoder_outputs, state_h, state_c = encoder_lstm3 (encoder_output2) 20. 21. # Kod çözücüyü kurun. 22. decoder_inputs = Giriş (şekil = (Yok,)) 23. dec_emb_layer = Gömme (y_voc_size, latent_dim, trainable = True) 24. dec_emb = dec_emb_layer (decoder_inputs) 25. 26. #LSTM kodlayıcı_statlarını başlangıç durumu olarak kullanıyor 27. decoder_lstm = LSTM (latent_dim, return_sequences = True, return_state = True) 28. decoder_outputs, decoder_fwd_state, decoder_back_state = decoder_lstm (dec_emb, initial_state =) 29. 30. # Dikkat Katmanı 31. Attention layer attn_layer = AttentionLayer (name = 'care_layer') 32. attn_out, attn_states = attn_layer () 33. 34. # Concat dikkat çıkışı ve kod çözücü LSTM çıkışı 35. decoder_concat_input = Concatenate (axis = -1, name = 'concat_layer') () 36. 37. # Yoğun katman 38. decoder_dense = TimeDistributed (Yoğun (y_voc_size, aktivasyon = 'softmax')) 39. decoder_outputs = decoder_dense (decoder_concat_input) 40. 41. # Modeli tanımlayın 42. model = Model (, decoder_outputs) 43. model.summary ()

Çıktı:

Kayıp işlevi olarak seyrek kategorik çapraz entropi kullanıyorum çünkü bir tamsayı dizisini anında tek sıcak vektörlere dönüştürüyor. Bu, herhangi bir hafıza probleminin üstesinden gelir.

1. model.compile (optimizer = 'rmsprop', loss = 'sparse_categorical_crossentropy')

Erken durma kavramını hatırlıyor musunuz? Kullanıcı tarafından belirlenen ölçüleri izleyerek sinir ağını uygun zamanda eğitmeyi durdurmak için kullanılır. Burada, doğrulama seti kaybını (val_loss) izliyorum. Doğrulama seti kayıp geri döndüğünde, modelimiz eğitimi durduracak:

1. es = Erken Durdurma (monitör = 'değer kaybı', mod = 'min', ayrıntılı = 1)

Modeli 512 parti boyutunda eğiteceğiz ve ayrılmış sette doğrulayacağız (veri setimizin% 10'u):

1. geçmiş = model.fit (, y_tr.reshape (y_tr.shape, y_tr.shape, 1), epochs = 50, callbacks =, batch_size = 512, validation_data = (, y_val.reshape (y_val.shape, y_val.shape , 1)))

Teşhis çizelgesini anlama

Şimdi, modelin zaman içinde nasıl değiştiğini anlamak için bazı teşhis grafikleri çizeceğiz:

1. matplotlib ithalat pyplotundan 2. pyplot.plot (history.history, etiket = 'tren') 3. pyplot.plot (history.history, etiket = 'test') 4. pyplot.legend () pyplot.show ()

Çıktı:

10. çağdan sonra doğrulama seti kaybının biraz arttığı sonucuna varabiliriz. Bu nedenle, bundan sonra modeli eğitmeyi bırakacağız.

Ardından, hedef ve kaynak kelime haznesindeki dizinleri kelimelere dönüştürmek için bir sözlük oluşturalım:

1. reverse_target_word_index = y_tokenizer.index_word 2. reverse_source_word_index = x_tokenizer.index_word 3. target_word_index = y_tokenizer.word_index

muhakeme

Kodlayıcı ve kod çözücünün gerekçesini ayarlayın:

1. # kodlayıcı çıkarımı 2. encoder_model = Model (inputs = encoder_inputs, outputs =) 3. 4. # kod çözücü çıkarımı 5. # Tensörlerin altında önceki zaman adımının durumları tutulur 6. decoder_state_input_h = Girdi (şekil = (latent_dim,)) 7. decoder_state_input_c = Girdi (şekil = (latent_dim,)) 8. decoder_hidden_state_input = Girdi (şekil = (max_len_text, latent_dim)) 9. 10. # Kod çözücü dizisinin düğünlerini alın 11. dec_emb2 = dec_emb_layer (decoder_inputs) 12. 13. # Sıradaki bir sonraki kelimeyi tahmin etmek için, başlangıç durumlarını önceki zaman adımındaki durumlara ayarlayın 14. decoder_outputs2, state_h2, state_c2 = decoder_lstm (dec_emb2, initial_state =) 15. 16. # dikkat çıkarımı 17. attn_out_inf, attn_states_inf = attn_layer () 18. decoder_inf_concat = Birleştir (eksen = -1, ad = 'concat') () 19. 20. # Hedef kelime dağarcığı üzerinde prob uzaklığı oluşturmak için yoğun bir softmax katmanı 21. decoder_outputs2 = decoder_dense (decoder_inf_concat) yirmi iki. 23. # Son kod çözücü modeli 24. decoder_model = Model ( 25. +, 26. +)

Aşağıda, çıkarım sürecinin gerçekleşmesi olan bir işlevi tanımlıyoruz (önceki bölümde tanıtmıştık):

1. def decode_sequence (girdi_sayı): 2. # Girişi durum vektörleri olarak kodlayın. 3. e_out, e_h, e_c = encoder_model.predict (input_seq) 4. 5. # 1 uzunluğunda boş hedef dizisi oluşturun. 6. target_seq = np.zeros ((1,1)) 7. 8. # Hedef dizinin ilk kelimesi olarak 'başlangıç' kelimesini seçin 9. target_seq = target_word_index 10. 11. stop_condition = Yanlış 12. decoded_sentence = '' 13. stop_condition değilken: 14. output_tokens, h, c = decoder_model.predict (+) 15. 16. # Bir jeton örnekleyin 17. sampled_token_index = np.argmax (output_tokens) 18. sampled_token = reverse_target_word_index 19. 20. eğer (sampled_token! = 'End'): 21. decoded_sentence + = '' + sampled_token yirmi iki. 23. # Çıkış koşulu: maksimum uzunluğa basın veya durdurma kelimesini bulun. 24. if (sampled_token == 'end' veya len (decoded_sentence.split ()) > = (max_len_summary-1)): 25. stop_condition = Doğru 26. 27. # Hedef diziyi güncelleyin (1 uzunluğunda). 28. target_seq = np.zeros ((1,1)) 29. target_seq = sampled_token_index 30. 31. # Dahili durumları güncelleyin 32. e_h, e_c = h, c 33. 34. decoded_sentence döndür

Özetlerdeki ve incelemelerdeki tamsayı dizisini bir kelime dizisine dönüştürmek için bir işlev tanımlayalım:

1. def seq2summary (input_seq): 2. newString = '' 3. input_seq içindeki i için: 4. eğer ((i! = 0 ve i! = Target_word_index) ve i! = Target_word_index): 5. newString = newString + reverse_target_word_index + '' 6. newString döndür 7. 8. def seq2text (input_seq): 9. newString = '' 10. input_seq içindeki i için: 11. eğer (i! = 0): 12. newString = newString + reverse_source_word_index + '' 13. newString döndür 1. aralıktaki i için (len (x_val)): 2. print ("Gözden Geçirme:", seq2text (x_val )) 3. print ("Orijinal özet:", seq2summary (y_val )) 4. print ("Öngörülen özet:", decode_sequence (x_val .reshape (1, maks_len_metin))) 5. yazdır ("\ n")

Model tarafından oluşturulan bazı özetler şunlardır:

Bu gerçekten havalı. Modelimiz tarafından oluşturulan özet, gerçek soyutla tam olarak eşleşmese de, hepsi aynı anlamı taşırlar. Modelimiz, metindeki bağlama dayalı olarak net bir özet oluşturabilir.

Yukarıdaki, Python'da derin öğrenme kavramlarını kullanarak metin özetlemeyi nasıl gerçekleştirdiğimizdir.

Modelin performansını nasıl daha da iyileştirebiliriz?

Öğrenmeniz burada bitmiyor! Modeli denemek için daha fazla şey yapabilirsiniz:

  • Eğitim veri seti boyutunu artırmanızı ve bir model oluşturmanızı öneririm. Eğitim veri setinin boyutu arttıkça derin öğrenme modelinin genelleme yeteneği artar.
  • İki yönden bağlamı yakalayabilen ve daha iyi bağlam vektörleri oluşturabilen iki yönlü bir LSTM uygulamaya çalışın
  • Açgözlü yöntem (argmax) yerine test sırasını çözmek için ışın arama stratejisini kullanın
  • Modelin performansını BLEU puanına göre değerlendirin
  • İşaretçi-oluşturucu ağı ve kapsama mekanizmasını uygulayın
8. Dikkat mekanizması nasıl çalışır?

Şimdi dikkat mekanizmasının iç işleyişinden bahsedelim. Makalenin başında da bahsettiğim gibi, bu matematiksel olarak yoğun bir bölüm, bu yüzden onu isteğe bağlı bir bölüm olarak ele alın. Bununla birlikte, dikkat mekanizmasının nasıl çalıştığını gerçekten anlamak için okumayı şiddetle tavsiye ederim.

Kodlayıcı, kaynak dizisindeki her zaman adımının gizli durumunu (hj) çıkarır.

Benzer şekilde, kod çözücü, hedef dizideki her zaman adımının gizli durumunu (si) çıkarır.

Kaynak kelimenin hedef kelime ile hizalandığına bağlı olarak hizalama puanı (eij) adı verilen bir puan hesaplıyoruz. Hizalama puanı, kaynak gizli durum hj ve hedef gizli durum si'den bir puan işlevi kullanılarak hesaplanır. Aşağıdaki formülle verilmiştir:

eij = skor (si, hj)

Eij, hedef zaman aşaması i ve kaynak zaman aşaması j'nin hizalama puanını temsil eder.

Kullanılan puanlama işlevinin türüne bağlı olarak, farklı dikkat mekanizması türleri vardır. Aşağıda bazı popüler dikkat mekanizmalarından bahsetmiştim:

Dikkat ağırlığını (aij) elde etmek için hizalama puanını normalleştirmek için softmax işlevini kullanıyoruz:

Katılımcı bağlam vektörünü (Ci) oluşturmak için dikkat ağırlığı aij ile kodlayıcının hj gizli durumunun çarpımının doğrusal toplamını hesaplıyoruz:

Katılan gizli vektör Si'yi üretmek için, adım i'de katılan bağlam vektörünü ve kod çözücünün hedef gizli durumunu bağlayın;

Si = birleştir ()

Daha sonra katılan gizli vektör Si'yi yoğun katmana göndererek yi'yi oluşturun;

yi = yoğun (Si)

Yukarıdaki dikkat mekanizması adımlarını anlamak için bir örnek kullanalım. Kaynak diziyi hedef dizi olarak düşünün.

  • Kodlayıcı tüm kaynak dizisini okur ve h1, h2, h3, h4 gibi her zaman adımının gizli durumunu çıkarır.

  • Kod çözücü, hedef sekans ofsetinin tamamını bir zaman adımı ile okur ve s1, s2, s3 gibi her bir zaman adımının gizli durumunu çıkarır.

Hedef zaman adımı i = 1

  • Kaynak gizli durum hi ve hedef gizli durum s1'den hizalama puanını e1j hesaplamak için puan işlevini kullanın:
e11 = puan (s1, h1) e12 = puan (s1, h2) e13 = puan (s1, h3) e14 = puan (s1, h4)
  • Hizalama puanını e1j normalleştirmek için softmax kullanmak dikkat ağırlığı a1j üretecektir:
a11 = exp (e11) / ((exp (e11) + exp (e12) + exp (e13) + exp (e14)) a12 = exp (e12) / (exp (e11) + exp (e12) + exp (e13) + exp (e14)) a13 = exp (e13) / (exp (e11) + exp (e12) + exp (e13) + exp (e14)) a14 = exp (e14) / (exp (e11) + exp (e12) + exp (e13) + exp (e14))

Katılan bağlam vektörü C1, kodlayıcının gizli durumu hj ile hizalama puanı a1j çarpımının doğrusal toplamından türetilir:

C1 = h1 * a11 + h2 * a12 + h3 * a13 + h4 * a14

  • Katılımcı gizli vektör S1'i oluşturmak için katılan içerik vektörü C1 ile hedef gizli durum s1'i bağlayın
S11 = birleştir ()
  • Daha sonra S1 gizli vektörünü y1 oluşturmak için tamamen bağlı katmana gönderin.
y1 = yoğun (S1)

Hedef zaman adımı i = 2

  • Kaynak gizli durum hi ve hedef gizli durum s2'den hizalama puanını e2j hesaplamak için verilen puan işlevini kullanın.
e21 = puan (s2, h1) e22 = puan (s2, h2) e23 = puan (s2, h3) e24 = puan (s2, h4)
  • Hizalama puanını e2j normalleştirmek için softmax kullanmak a2j dikkat ağırlığını üretecektir:
a21 = exp (e21) / (exp (e21) + exp (e22) + exp (e23) + exp (e24)) a22 = exp (e22) / (exp (e21) + exp (e22) + exp (e23) + exp (e24)) a23 = exp (e23) / (exp (e21) + exp (e22) + exp (e23) + exp (e24)) a24 = exp (e24) / (exp (e21) + exp (e22) + exp (e23) + exp (e24))
  • Katılan bağlam vektörü C2, kodlayıcının gizli durumu hi'nin ve hizalama puanı a2j'nin çarpımının doğrusal toplamından türetilir:
C2 = h1 * a21 + h2 * a22 + h3 * a23 + h4 * a24

  • Katılımcı gizli vektör S2'yi oluşturmak için katılımcı bağlam vektörü C2 ile hedef gizli durum s2'yi bağlayın
S2 = bitiştirme ()
  • Daha sonra gizli vektör S2'yi y2'yi oluşturmak için tamamen bağlı katmana gönderin

y2 = yoğun (S2)

Y3'ü oluşturmak için hedef zaman adımı i = 3 için benzer adımlar uygulayabiliriz.

Matematiğin ve teorinin bu kısmının biraz fazla olduğunu biliyorum, ancak bunu anlamak, dikkat mekanizmasının arkasındaki temel fikri kavramanıza yardımcı olacaktır. NLP'de birçok yeni gelişmeyi ortaya çıkardı ve şimdi sıra sizde!

Sonuç

Derin bir nefes alın, bu makalede çok şey ele aldık. İlk metin özetleme modelini oluşturmak için derin öğrenmeyi kullandığınız için tebrikler! Python'da Seq2Seq kullanarak kendi metin özeti oluşturucumuzu nasıl oluşturacağımızı gördük.

Bu makale hakkında herhangi bir geri bildiriminiz veya sorunuz varsa, lütfen aşağıdaki yorumlar bölümünde paylaşın, en kısa sürede cevaplayacağım. Burada oluşturduğumuz modeli denediğinizden ve model sonuçlarınızı toplulukla paylaştığınızdan emin olun!

NLP becerilerinizi öğrenmek veya geliştirmek için aşağıdaki kursları da alabilirsiniz:

  • Python kullanarak Doğal Dil İşleme (NLP)

https://courses.analyticsvidhya.com/courses/natural-language-processing-nlp?utm_source=blogutm_medium=comprehensive-guide-text-summarization-using-deep-learning-python

  • Doğal Dil İşlemeye (NLP) Giriş

https://courses.analyticsvidhya.com/courses/Intro-to-NLP?utm_source=blogutm_medium=comprehensive-guide-text-summarization-using-deep-learning-python

Bu makaleyi Analytics Vidhya'nın Android APP'sinde de okuyabilirsiniz.

Orjinal başlık:

Python'da Derin Öğrenme kullanarak Metin Özetleme için Kapsamlı Kılavuz

Orijinal bağlantı:

https://www.analyticsvidhya.com/blog/2019/06/comprehensive-guide-text-summarization-using-deep-learning-python/

Editör: Wang Jing redaksiyon: Lin Yilin

Çevirmen Profili

Ve Çin, Almanya'da Yazılım Mühendisliği Yüksek Lisansı. Makine öğrenimine olan ilgiden dolayı, yüksek lisans tezi geleneksel anlamlarını iyileştirmek için genetik algoritma fikirlerini kullanmayı seçti. Şu anda Hangzhou'da büyük veri ile ilgili uygulamalar yapıyor. Datapie'ye katılmak THU, BT çalışanları için üzerine düşeni yapmayı ve aynı zamanda benzer düşünen birçok arkadaş edinmeyi umuyor.

- Bitiş -

Tsinghua-Qingdao Veri Bilimi Enstitüsü'nün resmi WeChat kamu platformunu takip edin " THU Veri Pastası "Ve kız kardeş numarası" Veri Pastası THU "Daha fazla ders avantajı ve kaliteli içerik elde edin.

27.45 metre! Jinan'daki Baotu Kaynağı'nın yeraltı suyu seviyesi acil
önceki
Metin Özetleme için Derin Öğrenmeyi Kullanma için Python Kapsamlı Kılavuz Bölüm 1 (öğreticiyle birlikte)
Sonraki
Kadınlar Dünya Kupası boşluğu kabul ediyor, Evergrande Futbol Okulu ülke çapında kadın futbol öğrencilerini alıyor
Tüketici ihtiyaçlarını doğru bir şekilde karşılayan JD.com'un C2M modeli, yeni bir tüketim çağını açmak için anne ve çocuk markalarıyla el ele veriyor
"Derin Öğrenme 500 Soruları" güncellendi, GitHub 2,6 W yıldız aldı (tam indirme ile)
HDFS'yi ve 3 düğümlü bir HDFS kümesini nasıl oluşturacağınızı (kod durumuyla birlikte) öğrenin
Tsinghua Profesörü Sun Maosong ile diyalog: Üçüncü nesil yapay zeka, "yorumlanabilirlik" konusunu ele almalıdır
İnsansız biçerdöver ulusal lansmanını yapıyor! Siyah teknoloji Jiaxiang köyünden geliyor ve yabancı netizenler şaşırıyor
Yapay zekanın geçmişini ve bugününü anlamanızı sağlayan 60 yıllık teknolojinin kısa bir geçmişi
Yapay zeka "yapay zeka geriliği" mi oluyor? Yeni nedensellik bilimi
Tarayıcıda makine öğrenimi modelleri oluşturmak için TensorFlow.js ve Python kullanın
Yapay zekanın hangi bölümünden sorumlusunuz? Bilgi grafiğinin oluşturulması esas olarak insanlara mı yoksa makinelere mi dayanıyor?
Roger Data: Yaşam döngüsü dinamik simülasyon teknolojisi ve vergilendirmedeki uygulaması üzerine bir ön çalışma
360 cep telefonu işi askıya alındı; 37 şehrin ortalama aylık maaşı 8,452 yuan ...
To Top