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.
"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.
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
https://www.analyticsvidhya.com/blog/2019/01/sequence-models-deeplearning/?utm_source=blogutm_medium=comprehensive-guide-text-summarization-using-deep-learning-python
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
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.
Ş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:
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 = 10Modelin 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:
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.
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_indexmuhakeme
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:
Ş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, 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;
Daha sonra katılan gizli vektör Si'yi yoğun katmana göndererek yi'yi oluşturun;
Yukarıdaki dikkat mekanizması adımlarını anlamak için bir örnek kullanalım. Kaynak diziyi hedef dizi olarak düşünün.
Hedef zaman adımı i = 1
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:
Hedef zaman adımı i = 2
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!
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:
https://courses.analyticsvidhya.com/courses/natural-language-processing-nlp?utm_source=blogutm_medium=comprehensive-guide-text-summarization-using-deep-learning-python
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.
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.