ბუნებრივი ენის დამუშავება Jupyter ნოუთბუქი · TensorFlow

დასახელებული ერთეულის ამოცნობა (NER)

ეს არის პრაქტიკული ნოუთბუქი. წაიკითხე კოდი და შედეგები აქ, ან გაუშვი ინტერაქტიულად Google Colab-ში ან Jupyter-ში.

ეს ნოუთბუქი არის AI დამწყებთათვის სასწავლო პროგრამა-დან.

ამ მაგალითში ჩვენ ვისწავლით, თუ როგორ მოვამზადოთ NER მოდელი ანოტირებული კორპუსი დასახელებული ერთეულის ამოცნობისთვის მონაცემთა ნაკრებიდან Kaggle-დან. სანამ გააგრძელებთ, გთხოვთ, გადმოწეროთ ner_dataset.csv ფაილი მიმდინარე დირექტორიაში.

იტვირთება…

მონაცემთა ნაკრების მომზადება

ჩვენ დავიწყებთ მონაცემთა ბაზის წაკითხვით მონაცემთა ჩარჩოში. თუ გსურთ გაიგოთ მეტი პანდების გამოყენების შესახებ, ეწვიეთ გაკვეთილი მონაცემთა დამუშავების შესახებ ჩვენს მონაცემთა მეცნიერება დამწყებთათვის-ში

იტვირთება…
გამოტანა
    Sentence #           Word  POS Tag
0  Sentence: 1      Thousands  NNS   O
1          NaN             of   IN   O
2          NaN  demonstrators  NNS   O
3          NaN           have  VBP   O
4          NaN        marched  VBN   O

მოდით მივიღოთ უნიკალური ტეგები და შევქმნათ საძიებო ლექსიკონები, რომლებიც შეგვიძლია გამოვიყენოთ ტეგების კლასის ნომრებად გადაქცევისთვის:

იტვირთება…
გამოტანა
array(['O', 'B-geo', 'B-gpe', 'B-per', 'I-geo', 'B-org', 'I-org', 'B-tim',
       'B-art', 'I-art', 'I-per', 'I-gpe', 'I-tim', 'B-nat', 'B-eve',
       'I-eve', 'I-nat'], dtype=object)
იტვირთება…
გამოტანა
'O'

ახლა ჩვენ იგივე უნდა გავაკეთოთ ლექსიკასთან დაკავშირებით. სიმარტივისთვის შევქმნით ლექსიკას სიტყვების სიხშირის გათვალისწინების გარეშე; რეალურ ცხოვრებაში შეიძლება დაგჭირდეთ Keras vectorizer-ის გამოყენება და სიტყვების რაოდენობის შეზღუდვა.

იტვირთება…

ჩვენ უნდა შევქმნათ წინადადებების ნაკრები ტრენინგისთვის. მოდით გადავხედოთ თავდაპირველ მონაცემთა ბაზას და გამოვყოთ ყველა ცალკეული წინადადება X (სიტყვების სია) და Y (ნიშანთა სია):

იტვირთება…

ჩვენ ახლა ვექტორიზაციას მოვახდენთ ყველა სიტყვასა და ნიშანს:

იტვირთება…
გამოტანა
([10386,
  23515,
  4134,
  29620,
  7954,
  13583,
  21193,
  12222,
  27322,
  18258,
  5815,
  15880,
  5355,
  25242,
  31327,
  18258,
  27067,
  23515,
  26444,
  14412,
  358,
  26551,
  5011,
  30558],
 [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0])

სიმარტივისთვის, ჩვენ ყველა წინადადებას ჩავსვამთ 0 ტოკენებით მაქსიმალურ სიგრძემდე. რეალურ ცხოვრებაში, შეიძლება გვსურს გამოვიყენოთ უფრო ჭკვიანი სტრატეგია და ბალიშების თანმიმდევრობა მხოლოდ ერთი მინი პარტიაში.

იტვირთება…

ტოკენის კლასიფიკაციის ქსელის განსაზღვრა

ჩვენ გამოვიყენებთ ორ ფენის ორმხრივ LSTM ქსელს ტოკენის კლასიფიკაციისთვის. იმისათვის, რომ გამოვიყენოთ მკვრივი კლასიფიკატორი ბოლო LSTM ფენის თითოეულ გამოსავალზე, ჩვენ გამოვიყენებთ TimeDistributed კონსტრუქციას, რომელიც იმეორებს იმავე მკვრივ ფენას LSTM-ის თითოეულ გამოსავალზე ყოველ საფეხურზე:

იტვირთება…
გამოტანა
Model: "sequential_3"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding_4 (Embedding)     (None, 104, 300)          9545400   
                                                                 
 bidirectional_6 (Bidirectio  (None, 104, 200)         320800    
 nal)                                                            
                                                                 
 bidirectional_7 (Bidirectio  (None, 104, 200)         240800    
 nal)                                                            
                                                                 
 time_distributed_3 (TimeDis  (None, 104, 17)          3417      
 tributed)                                                       
                                                                 
=================================================================
Total params: 10,110,417
Trainable params: 10,110,417
Non-trainable params: 0
_________________________________________________________________

გაითვალისწინეთ, რომ ჩვენ ცალსახად ვაზუსტებთ maxlen-ს ჩვენი მონაცემთა ნაკრებისთვის - იმ შემთხვევაში, თუ გვინდა, რომ ქსელმა შეძლოს ცვლადი სიგრძის თანმიმდევრობების დამუშავება, ჩვენ უნდა ვიყოთ უფრო ჭკვიანები ქსელის განსაზღვრისას.

მოდით ახლა ვავარჯიშოთ მოდელი. სიჩქარისთვის ჩვენ მხოლოდ ერთი ეპოქისთვის ვივარჯიშებთ, მაგრამ შეგიძლიათ უფრო დიდხანს სცადოთ ვარჯიში. ასევე, შეიძლება დაგჭირდეთ მონაცემთა ნაკრების გარკვეული ნაწილის გამოყოფა, როგორც სასწავლო მონაცემთა ბაზა, რათა დააკვირდეთ ვალიდაციის სიზუსტეს.

იტვირთება…
გამოტანა
1499/1499 [==============================] - 740s 488ms/step - loss: 0.0667 - acc: 0.9841
<keras.callbacks.History at 0x16f0bb2a310>

შედეგის ტესტირება

ახლა ვნახოთ, როგორ მუშაობს ჩვენი ერთეულის ამოცნობის მოდელი ნიმუშის წინადადებაზე:

იტვირთება…
იტვირთება…
გამოტანა
john -> B-per
smith -> I-per
went -> O
to -> O
paris -> B-geo
to -> O
attend -> O
a -> O
conference -> O
in -> O
cancer -> B-org
development -> I-org
institute -> I-org

Takeaway

თუნდაც მარტივი LSTM მოდელი აჩვენებს გონივრულ შედეგებს NER-ზე. თუმცა, ბევრად უკეთესი შედეგების მისაღებად, შეიძლება დაგჭირდეთ დიდი წინასწარ მომზადებული ენის მოდელების გამოყენება, როგორიცაა BERT. BERT-ის ტრენინგი NER-ისთვის Huggingface Transformers ბიბლიოთეკის გამოყენებით აღწერილია აქ.

ეს გაკვეთილი არის Microsoft “AI for Beginners” კურსის ქართული თარგმანი, გავრცელებული MIT ლიცენზიით.