Stanford NLP — Stanza

Original article was published by Uğur Özker on Deep Learning on Medium


Stanford Üniversitesi NLP birimi tarafından kısa süre önce duyurulan Stanza isimli yeni NLP ürünün analizinden bahsedeceğim. Nedir ne değildir? Türkçe dilimiz sondan eklemeli olduğu ve veri setleri ile kaynakları az olduğu için yaşanan sorunlar burada ne durumda? Performans metrikleri, kullanılabileceği alanlar ve Türkçe dilinde Stanza’nın gelebileceği noktalara detaylı bakmaya çalıştım umarım konu ile ilgilenen herkese faydası olur.

Stanza Kaynak Kodu: https://github.com/stanfordnlp/stanza

STANZA-NLP INTRODUCTION

Stanford NLP Bölümü’nün resmi ve tamamen Python dili ile oluşturulan NLP uygulamasıdır. 60’tan fazla dilde çeşitli doğal dil işleme araçlarını çalıştırma ve Python’dan Java tabanlı Stanford CoreNLP yazılımına erişim desteği içerir. Java tarafında kullanılan mevcut uygulamanın içerdiği tüm özelliklerin yavaş yavaş bu tarafa taşınması planlanmaktadır.

Desteklediği 66 dil için free format metinden kelime ve hece sentezleme, morphologic analiz ve (N)ER gibi özellikler sunmaktadır. Altyapısında desteklediği tüm diller için Universal Dependencies formatında eğitim ve veri setlerini kullanmaktadır.

Comparison of similar NLP systems

Stanza mümkün olan en iyi performansı ortaya koyabilmesi için eğitim süreçlerinde yapay sinir ağı tekniklerinden faydalanmaktadır. Eğitim süreçlerinde kullanılan bu modüller Pytorch kütüphanesi üzerine kurulmuştur. Dolayısıyla eğitim sürecinizi GPU donanımına sahip bir makinede çalıştırırsanız çok daha verimli ve yüksek bir performans elde edebilirsiniz.

Ek olarak bahsettiğimiz gibi Stanza, Stanford CoreNLP uygulamasına erişim ve oradaki fonksiyonlarında kullanılabilmesi için bir Python ara katmanı sunmaktadır ki bu sayede Java dilinde olan CoreNLP uygulamasının paketleri ve oradaki tüm methodları kullanabilirsiniz. Örneğin linguistic pattern matching gibi fonksiyonları şuan da Stanza içerisinde barındırmadığı için CoreNLP üzerinden sorunsuz kullanabilirsiniz.

Özetlemek gerekirse Stanford NLP tarafından sağlanan yeni uygulama Stanza şunları içerir;

1- Minimum efor ile kurabileceğiniz Native bir Python uygulamasıdır.

2- Uçtan uca yapay sinir ağı tabanlı ve Tokenization, Multi-Word Token (MWT), Lemmatization, POS tagging, Morphologic Analiz ve (N)ER özelliklerini içeren doğal dil işleme altyapısı sağlamaktadır.

3- 66 farklı dil destekli pre-train olarak sağlanmaktadır ve uygun formatta eğitim verisi sağlanırsa diğer diller ile de uyumludur.

Stanza teknik altyapısı ise aşağıdaki gibidir;

Stanza App Pipeline

Ayrıca Stanza için İngilizce dil modeli özelinde Biyomedikal ve klinik terimleri ayırt edebilmek için kullanabileceğimiz pre-train edilmiş bir Named-Entity Recognation modeli de son sürüm ile birlikte kullanılabilir durumdadır. Sağlık alanında özellikle uluslararası dil standartlarının kullanıldığını düşünürsek bu alanda çalışan arkadaşların fazlasıyla işine yarayabilir.

Daha detaylı dokümantasyona ise link altında yer alan makaleyi inceleyerek erişebilirsiniz.

INSTALLATION

Yeni bir dil yada model oluşturarak ekleyeceğimizi varsayarsak uygulamayı indirmeden önce stanza-train uygulamasını indirip onun içerisine Stanza NLP uygulamasını indirmeniz gerekmektedir.

Stanza sadece Python 3 desteklemektedir. Uygulamayı kurmak için öncelikle Linux işletim sistemine sahip makinemize;

sudo git clone https://github.com/stanfordnlp/stanza-train.git

komutu ile train uygulaması kaynak kodunu indiriyoruz. Sonrasında;

sudo pip install -r requirements.txt komutu ile numpy, pytorch gibi Python kütüphanelerini kuruyoruz ve stanza-train dizinine girdikten sonra gerekli config dosyalarını aynı dizin içerisine indirdiğimiz Stanza NLP uygulaması içerisine kopyalıyoruz;

cd stanza-train

git clone https://github.com/stanfordnlp/stanza.git
cp config/config.sh stanza/scripts/config.sh
cp config/xpos_vocab_factory.py stanza/stanza/models/pos/xpos_vocab_factory.py
cd stanza

MODEL TRAINING & EVALUATION

Data Format:

Önemli bir nokta burada model eğitiminde kullanacağımız corpus ve veri dosyalarıdır. Eğitimde kullanacağımız veriler mutlaka CONLLU formatında olmalıdır. Türkçe dili için uygun formatta hazırlanmış en detaylı Treebank, ODTU tarafından hazırlanmış olan verilerdir. Sıfırdan bir CONLLU oluşturmak istemiyorsanız açık kaynak olan bu dosyayı indirerek kullanabilirsiniz. İçerisinde çeşitli kaynaklardan elde edilmiş 5.635 cümle, 56.396 token ve 57.859 kelime bulunmaktadır.

Classification uygulamaları(örneğin Sentiment vs.) için uygulama kullanılacaksa buradaki veri formatı CONLLU’dan biraz daha farklıdır. Supervised olarak tanımlayacağımız label ve bir boşluk sonrası her satıra bir kayıt gelecek şekilde Fasttext uygulamasındaki gibi düşünebiliriz.

Word Vectors:

Word2Vec veya Fasttext pre-trained kelime vektörleri kullanılmaktadır. Üzerinde çalışacağınız dil bunlarda mevcut değil ise, GloVe uygulaması ile Word2Vec dönüşümü yaparak vektör dosyanızı oluşturabilirsiniz ama Türkçe dili için Fasttext içerisinde pre-train model wikipedia kaynaklarından elde edilerek oluşturulmuş şekilde yer almaktadır.

CoNLL 2018 çalışmasına göre hazırlanan vektör dosyalarını dil özelinde indirmeniz burada en kolay yoldur. Stanza uygulaması ile tam uyumludur ve aşağıdaki yolu izleyerek indirebilirsiniz:

Öncelikle Scripts dizini altında yer alan download_vectors.sh shell script dosyası Türkçe kaynağı indirecek şekilde aşağıdaki gibi düzenlenmelidir.

bash scripts/download_vectors.sh ${wordvec_dir}

Sonrasında yukarıdaki komut çalıştırılarak dosyalar aşağıdaki dizin altında konumlandırılır.

${WORDVEC_DIR}/{language}/{language_code}.vectors.xz

Character LMs

Türkçe dili için hazır halde Character LM bulunmamaktadır. Uygulamanın beklediği şekilde forward ve backward char LM dosyalarını oluşturmak için Wikipedia Türkçe dumps kaynağından xml içerikleri temizlenmiş raw data verisini elde ederek aşağıdaki komutları sırasıyla çalıştırıp dosyaları oluşturmamız gerekmektedir.

bash scripts/run_charlm.sh Turkish-IMST forward –epochs 2 –cutoff 0 –batch_size 2
bash scripts/run_charlm.sh Turkish-IMST backward –epochs 2 –cutoff 0 –batch_size 2

Oluşturulan dosyalar eğitimde kullanılmak üzere uygulama altında /charlm klasörüne konumlandırılmalıdır. NER modülü için eğitim yapılacaksa elde ettiğimiz bu dosyalar ve Word Vector dosyaları oradaki eğitim sürecinde kullanılmaktadır.

Named Entity Recognation

BIO formatında etiketlenmiş sözcüklerin olduğu dosyaları {NERBASE}/{corpus}/{train,dev,test}.bio dizininde konumlandırmanız gerekmektedir. Maalesef BIO formatında hazır bir veri seti Türkçe dili için bulunmamaktadır. Çeşitli scriptler yazarak bu dosyaları sizin oluşturmanız beklenmektedir yada Mendeley’den Türkçe için hazırlanan en kapsamlı NER veri setini indirerek script’ler aracılığı ile beklenen BIO formatına çevirebilirsiniz. Ayrıca Stanza NER ile ilgili daha fazla bilgi edinmek için linkte yer alan makaleyi incelemenizi tavsiye ederim. Son durumda hazır hale getirdiğimiz eğitim verilerimiz için kullanacağımız config.sh dosyası içerisindeki dizinler aşağıdaki gibi olmalıdır.

UDBASE: {UDBASE}/{corpus}/{corpus_short}-ud-{train,dev,test}.conllu NERBASE: {NERBASE}/{corpus}/{train,dev,test}.bio WORDVEC_DIR:{WORDVEC_DIR}/{language}/{language_code}.vectors.xz

Training

Eğitim sürecini /scripts klasörü altında yer alan shell script dosyaları ile yapmamız gerekmektedir. Her modül aşağıdaki formata uygun olarak komutlarımızı çalıştırarak eğitimlerimizi sorunsuz yapmalıyız.

bash scripts/run_${module}.sh ${corpus} ${other_args}bash scripts/run_tokenize.sh UD_Turkish-IMST --step 500
bash scripts/run_mwt.sh UD_Turkish-IMST --num_epoch 2
bash scripts/run_lemma.sh UD_Turkish-IMST --num_epoch 2
bash scripts/run_pos.sh UD_Turkish-IMST --max_steps 500
bash scripts/run_depparse.sh UD_Turkish-IMST gold --max_steps 500
bash scripts/run_ner.sh Turkish-IMST -max_steps 500 --word_emb_dim 5

NER modülünün Accuracy rate oranının düşük olması durumunda aşağıdaki gibi oluşturduğumuz charlm dosyalarını kullanarak daha iyi sonuçlar elde edebiliriz.

bash scripts/run_ner.sh Turkish-IMST --max_steps 500 --word_emb_dim 5 --charlm --charlm_shorthand tr_imst --char_hidden_dim 1024

Tüm eğitilmiş model dosyalarımızı hazırladıktan sonra aşağıdaki gibi Pipeline tanımlamalarımızı yaparak uygulamamızı kullanmaya başlayabiliriz.

Hazırlamış olduğumuz Pipeline ile komut satırı üzerinden örnek cümle ile çalıştırdığımızda ise aşağıdaki gibi uygulamanın sonuç verdiğini görebilirsiniz.

Tokenization, Lemmazition output of queried sentence.
Dependency Parser of Stanza

EVALUATE

Son aşamada eğitmiş olduğumuz modellere ait sonuçların değerlendirmesini isteyebiliriz. Bu durumda otomatik olarak Accuracy rate hesaplamalarımızı yapmak için aşağıdaki komutu çalıştırmamız yeterli olacaktır.

bash scripts/run_ete.sh ${corpus} ${split}

Türkçe için UD_Turkish-IMST veri setine göre hazırlanan modellere ait performans sonuçları ise aşağıdaki gibidir.

Performance rates of UD_Turkish-IMST

REFERENCES

https://nlp.stanford.edu/pubs/qi2020stanza.pdf

https://universaldependencies.org/format.html

https://github.com/UniversalDependencies/UD_Turkish-IMST/tree/master

https://www.aclweb.org/anthology/W03-0419.pdf