Natural Language Toolkit - Ayrıştırma
Ayrıştırma ve NLP'deki alaka düzeyi
Kökeni Latince kelimeden gelen 'Ayrıştırma' kelimesi ‘pars’ (yani ‘part’), metinden tam anlam veya sözlük anlamını çıkarmak için kullanılır. Sözdizimi analizi veya sözdizimi analizi olarak da adlandırılır. Biçimsel gramer kurallarını karşılaştıran sözdizimi analizi, metnin anlamlı olup olmadığını kontrol eder. Örneğin "Bana sıcak dondurma ver" gibi cümle ayrıştırıcı veya sözdizimsel çözümleyici tarafından reddedilir.
Bu anlamda, ayrıştırma veya sözdizimsel analizi veya sözdizimi analizini aşağıdaki gibi tanımlayabiliriz -
Biçimsel dilbilgisi kurallarına uygun olarak sembol dizilerinin doğal dilde analiz edilmesi süreci olarak tanımlanabilir.
Aşağıdaki noktaların yardımıyla NLP'de ayrıştırmanın alaka düzeyini anlayabiliriz -
Ayrıştırıcı, herhangi bir sözdizimi hatasını bildirmek için kullanılır.
Programın geri kalanının işlenmesine devam edilebilmesi için yaygın olarak meydana gelen hatalardan kurtulmaya yardımcı olur.
Ayrıştırma ağacı bir ayrıştırıcı yardımı ile oluşturulur.
Ayrıştırıcı, NLP'de önemli bir rol oynayan sembol tablosu oluşturmak için kullanılır.
Ayrıştırıcı ayrıca ara gösterimler (IR) üretmek için de kullanılır.
Derin ve Sığ Ayrıştırma
Derin Ayrıştırma | Sığ Ayrıştırma |
---|---|
Derin ayrıştırmada, arama stratejisi bir cümleye tam bir sözdizimsel yapı verecektir. | Verilen görevdeki sözdizimsel bilginin sınırlı bir bölümünü ayrıştırma görevidir. |
Karmaşık NLP uygulamaları için uygundur. | Daha az karmaşık NLP uygulamaları için kullanılabilir. |
Diyalog sistemleri ve özetleme, derin ayrıştırmanın kullanıldığı NLP uygulamalarının örnekleridir. | Bilgi çıkarma ve metin madenciliği, derin ayrıştırmanın kullanıldığı NLP uygulamalarının örnekleridir. |
Tam ayrıştırma olarak da adlandırılır. | Aynı zamanda yığınlama olarak da adlandırılır. |
Çeşitli ayrıştırıcı türleri
Tartışıldığı gibi, ayrıştırıcı temelde dilbilgisinin prosedürel bir yorumudur. Çeşitli ağaçların arasında arama yaptıktan sonra verilen cümle için en uygun ağacı bulur. Aşağıdaki mevcut ayrıştırıcılardan bazılarını görelim -
Yinelemeli iniş ayrıştırıcı
Özyinelemeli iniş ayrıştırma, ayrıştırmanın en basit biçimlerinden biridir. Aşağıda yinelemeli iniş ayrıştırıcısı hakkında bazı önemli noktalar verilmiştir -
Yukarıdan aşağıya bir süreci takip eder.
Giriş akışının sözdiziminin doğru olup olmadığını doğrulamaya çalışır.
Giriş cümlesini soldan sağa okur.
Özyinelemeli iniş ayrıştırıcısı için gerekli bir işlem, giriş akışındaki karakterleri okumak ve bunları dilbilgisindeki uçbirimlerle eşleştirmektir.
Shift-azaltma ayrıştırıcı
Shift-azaltma ayrıştırıcısı hakkında bazı önemli noktalar aşağıdadır -
Basit bir aşağıdan yukarıya süreci izler.
Bir gramer üretiminin sağ tarafına karşılık gelen ve bunları üretimin sol tarafıyla değiştiren bir dizi kelime ve kelime öbeği bulmaya çalışır.
Yukarıdaki bir kelime dizisi bulma girişimi, tüm cümle indirgenene kadar devam eder.
Diğer basit bir deyişle, kaydırma-azaltma ayrıştırıcısı, giriş sembolüyle başlar ve başlangıç sembolüne kadar ayrıştırıcı ağacını oluşturmaya çalışır.
Grafik ayrıştırıcı
Aşağıda, grafik ayrıştırıcıyla ilgili bazı önemli noktalar verilmiştir -
Esas olarak, doğal dillerin gramerleri dahil, belirsiz gramerler için yararlı veya uygundur.
Ayrıştırma problemlerine dinamik programlama uygular.
Dinamik programlamadan dolayı, kısmi varsayımsal sonuçlar 'grafik' adı verilen bir yapıda saklanır.
'Grafik' de yeniden kullanılabilir.
Regexp ayrıştırıcı
Regexp ayrıştırma, en çok kullanılan ayrıştırma tekniklerinden biridir. Aşağıda, Regexp ayrıştırıcısı ile ilgili bazı önemli noktalar verilmiştir -
Adından da anlaşılacağı gibi, POS etiketli bir dizenin üstünde gramer biçiminde tanımlanan normal bir ifade kullanır.
Temelde bu normal ifadeleri girdi cümlelerini ayrıştırmak ve bundan bir ayrıştırma ağacı oluşturmak için kullanır.
Misal
Aşağıda, Regexp Ayrıştırıcısının çalışan bir örneği verilmiştir -
import nltk
sentence = [
("a", "DT"),
("clever", "JJ"),
("fox","NN"),
("was","VBP"),
("jumping","VBP"),
("over","IN"),
("the","DT"),
("wall","NN")
]
grammar = "NP:{<DT>?<JJ>*<NN>}"
Reg_parser = nltk.RegexpParser(grammar)
Reg_parser.parse(sentence)
Output = Reg_parser.parse(sentence)
Output.draw()
Çıktı
Bağımlılık Ayrıştırma
Bağımlılık Ayrıştırma (DP), modern bir çözümleme mekanizması olup, ana konsepti her dil biriminin, yani kelimelerin doğrudan bir bağlantıyla birbiriyle ilişkili olmasıdır. Bu doğrudan bağlantılar aslında‘dependencies’dilbilimsel olarak. Örneğin, aşağıdaki diyagram cümle için bağımlılık dilbilgisini gösterir.“John can hit the ball”.
NLTK Paketi
NLTK ile bağımlılık ayrıştırması yapmanın iki yolunu takip ediyoruz -
Olasılıklı, projektif bağımlılık ayrıştırıcı
NLTK ile bağımlılık ayrıştırması yapmanın ilk yolu budur. Ancak bu ayrıştırıcı, sınırlı bir eğitim verisi kümesiyle eğitim kısıtlamasına sahiptir.
Stanford ayrıştırıcı
Bu, NLTK ile bağımlılık ayrıştırmasını yapabileceğimiz başka bir yoldur. Stanford ayrıştırıcısı, son teknoloji ürünü bir bağımlılık ayrıştırıcısıdır. NLTK'nın etrafında bir sarmalayıcı var. Kullanmak için aşağıdaki iki şeyi indirmemiz gerekiyor -
Stanford CoreNLP ayrıştırıcı .
İstenilen dil için dil modeli . Örneğin, İngilizce dil modeli.
Misal
Modeli indirdikten sonra NLTK üzerinden şu şekilde kullanabiliriz -
from nltk.parse.stanford import StanfordDependencyParser
path_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser.jar'
path_models_jar = 'path_to/stanford-parser-full-2014-08-27/stanford-parser-3.4.1-models.jar'
dep_parser = StanfordDependencyParser(
path_to_jar = path_jar, path_to_models_jar = path_models_jar
)
result = dep_parser.raw_parse('I shot an elephant in my sleep')
depndency = result.next()
list(dependency.triples())
Çıktı
[
((u'shot', u'VBD'), u'nsubj', (u'I', u'PRP')),
((u'shot', u'VBD'), u'dobj', (u'elephant', u'NN')),
((u'elephant', u'NN'), u'det', (u'an', u'DT')),
((u'shot', u'VBD'), u'prep', (u'in', u'IN')),
((u'in', u'IN'), u'pobj', (u'sleep', u'NN')),
((u'sleep', u'NN'), u'poss', (u'my', u'PRP$'))
]