Merhaba! Bu yazımızda sözcük türlerini ve varlık ismi tanımlamayı göstermiş olacağız. Günümüz doğal dillerinde kelimelerin temsil ettiği özellikler vardır. Bu özelliklerden biri ise kelimenin türüdür. Bir kelimenin türü, cümle içindeki kullanıma göre değişmektedir. Bir kelimenin aldığı eklere göre de değişmektedir. Örnek olarak bir kelime bir kişiyi belirtebilir, cümle içindeki yerine bağlı olarak işten etkilenen bir varlık olabilir veya aldığı eklere göre olayı belirtebilir. Örnek olarak düşünelim : "Google bir şirkettir", bu cümlede Google bir isimdir ve varlığı temsil etmektedir. Tekrardan düşünmek için yeni bir örnek vermek istiyorum. "Bu adamlar zamanında Google'ı kurdu." cümlesinde "bu adamalar" bir isimdir ve işi yapan varlıklardır ayrıca "Google" ise bir nesnedir ve işten etkilenen varlıktır. Diğer bir örnek ise "Google bu uygulamayı kapattı." cümlesinde ise "Google" işi yapandır ve isimdir. Verebileceğim son örnek ise "Bu adam bu soruyu Googlelladı." kelimesinde ise "Googlellamak" bir olayı belirtir, yani bir fiildir. Anlayacağımız gibi bir kelimenin birden fazla türü olabilir ve yapay zeka çalışmaları için bunu iyi tespit etmemiz gerekmektedir. Ayrıca bir varlığın ise sınıfını bulmamız gerekmektedir. Google bir şirketi, bir kuruluşu belirtir. ABD ise bir ülkeyi belirtir. Arda Güler ise bir kişiyi belirtir. Bu örneklerde ise isim olan kelimelerin varlık kategorisini tespit etmemiz gerekmektedir. Varlıkların kategorilerini tespit etmemiz ise yapay zeka çalışmaları için önemlidir buna varlık ismi tanımlama denilmektedir.
Postags - Sözcük Türleri
Sözcük türü bir bir kelimenin cümle içindeki görevini belirtmektedir. Sözcükler bir varlığı, konumu, olayı, olaydan etkilenen nesneyi, bir varlığın sahip olduğu betimlenebilir özelliğini belirtebilir. Sahip oldukları bu özelliklerine göre çeşitli türlere ayrılmaktadır. Yapay zeka çalışmalarında insan gibi makinelerin her bir kelimenin türünü belirlemesi önemlidir. Örnek olarak bir isim türündeki sözcüğü betimleyen kelime bir sıfattır, yüklem olan kelimeyi özellik bakımından belirten kelime ise zarftır.
Pos, port of speech olarak bir sözcüğün türünü belirtmektedir. Doğal dil işleme alanında kullanılan bir terimdir. Örnek olarak ADJ(sıfat) bu alanda kullanılmaktadır.
Postagging, ise bu kelimelerin sözcük türlerini bulmak için kullanılmaktadır. Örnek olarak ise "Kırmızı başlıklı kız buraya geldi." kelimesinde "Kırmızı->ADJ=sıfaat" olarak bulunmaktadır.
>>> from nltk.tag import pos_tag >>> from nltk.tokenize import word_tokenize >>> pos_tag(word_tokenize("John's big idea isn't all that bad.")) [('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 'VBZ'), ("n't", 'RB'), ('all', 'PDT'), ('that', 'DT'), ('bad', 'JJ'), ('.', '.')] >>> pos_tag(word_tokenize("John's big idea isn't all that bad."), tagset='universal') [('John', 'NOUN'), ("'s", 'PRT'), ('big', 'ADJ'), ('idea', 'NOUN'), ('is', 'VERB'), ("n't", 'ADV'), ('all', 'DET'), ('that', 'DET'), ('bad', 'ADJ'), ('.', '.')]
Günümüzde postagging alanında ise çeşitli çalışmalar bulunmaktadır. Bu çalışmaların popüler olanları ise Türkçe alanında : Zemberek, TS Corpus vb. çalışmalardır. Yabancı dillerde ise NLTK gibi çalışmalar vardır. Burada belirttiğimiz Zemberek ve NLTK kütüphanesi ise bu çalışmalarda etkin olarak kullanılmaktadır.
Postagging Yaklaşımları
Bu alanda ise çeşitli yaklaşımlar yer almaktadır. Kural Tabanlı ve Stokastik Tabanlı yaklaşımlar yer almaktadır. Kural Tabanlı Yaklaşımlar, doğal dillerin dilbilgisi kuralları ile ilgilidir. Stokastik Tabanlı Yaklaşımlar ise bir olaya bağlı olarak değişkenlere göre karar alma algoritmalarına, olasılığına ve matematiksel yaklaşımına bağlıdır.
Kural Tabanlı Yaklaşımlar
Bu yöntem, önceden belirlenmiş dilbilgisi kurallarına dayanır. Kurallar, kelimelerin hangi kelime sınıfına ait olduğunu belirlemek için kullanılır.Kurallar el ile oluşturulur veya dilbilgisi analiz araçları kullanılarak otomatik olarak oluşturulabilir.Kural tabanlı yaklaşımlar, nispeten basit ve hızlıdır. Ancak, karmaşık dilbilgisi yapıları ile başa çıkmakta zorlanabilirler ve hatalı sonuçlar üretebilirler.
Stokastik Yaklaşımlar
Bu yöntem, büyük miktarda metin verisi üzerinde istatistiksel modeller kullanır. Modeller, kelimelerin hangi kelime sınıfına ait olma ihtimalini tahmin eder. Modeller, gözetimli öğrenme veya gözetimsiz öğrenme teknikleri kullanılarak eğitilmiş olabilir. Stokastik tabanlı yaklaşımlar, karmaşık dilbilgisi yapıları ile daha iyi başa çıkabilir ve daha doğru sonuçlar üretebilirler. Ancak, kural tabanlı yaklaşımlara kıyasla daha karmaşık ve zaman alıcı olabilirler.
Üretken Modeller:
Üretken modeller, verilerdeki kalıpları öğrenerek yeni veri örnekleri üretmek için kullanılır.Bu modeller, metin üretme, müzik oluşturma veya görüntüler sentezleme gibi görevlerde kullanılır.
Üretken modellerin bazı yaygın örnekleri şunlardır:
Gizli Markov Modelleri (HMM'ler): Zaman içinde değişen sistemleri modellemek için kullanılır.
Nöron Ağları: Karmaşık veri ilişkilerini öğrenmek için kullanılır.
Dil Modelleri: Metin üretmek için kullanılır.
HMM'ler :
Düğümler arası tüm yol olasılıklarını inceler, permütasyon kullanabilir ve hafızası yoktur, gözlemlenebilir durumların bir dizi gizli durumdan etkilendiği stokastik modelleme yöntemidir. Bu modeller, gözlemlenebilir durumları kullanarak gizli durumları tahmin etmek için kullanılır.
HMM'lerin temel bileşenleri şunlardır:
- Durumlar: Gözlemlenmeyen, ancak sistemin altta yatan durumunu temsil eden olası durumlar kümesi.
- Gözlemler: Gözlemlenebilen ve sistemin durumuyla ilişkili olan semboller kümesi.
- Geçiş Olasılıkları: Bir durumdan diğerine geçiş olasılıklarını temsil eden bir matris.
- Yayılma Olasılıkları: Bir durumdayken belirli bir gözlemleme olasılığını temsil eden bir matris.
Viterbi Algoritması :
Her durum ile ilgili olarak geçiş olasılıklarını hafızaya tut, katmanlara kaydet ve aktarma işine bağlıdır, bir gözlem dizisi için en olası gizli durum dizisini bulmak için kullanılan bir algoritmadır. Bu algoritma, HMM'lerde kullanılır ve dinamik programlama ilkesine dayanır.
Viterbi Algoritması'nın adımları şunlardır:
- Başlangıç olasılıklarını hesaplayın: Her durum için ilk gözlemle birlikte olma olasılığını hesaplayın.
- Her adım için en iyi öncü durumları ve olasılıkları hesaplayın: Bir önceki adımda hesaplanan en iyi öncü durumları ve olasılıkları kullanarak, her durum için en iyi öncü durumları ve olasılıkları hesaplayın.
- Son adımı en iyi öncü duruma göre hesaplayın: Son gözlemle birlikte en iyi öncü duruma göre son adımı hesaplayın.
- En olası gizli durum dizisini geriye doğru izleyin: Son adımdan başlayarak, en iyi öncü durumları kullanarak en olası gizli durum dizisini geriye doğru izleyin.
Ayrıcı Modeller:
Ayırıcı modeller, verileri farklı kategorilere ayırmak için kullanılır. Bu modeller, spam filtreleme, optik karakter tanıma veya tıbbi teşhis gibi görevlerde kullanılır.
Ayırıcı modellerin bazı yaygın örnekleri şunlardır:
Lojistik Regresyon: İki sınıf arasındaki ayrımı modellemek için kullanılır.
Destek Vektör Makineleri (SVM'ler): Karmaşık veri kümelerindeki ayırma problemlerini çözmek için kullanılır.
Karar Ağaçları: Verileri basit kurallara göre sınıflandırmak için kullanılır.
NER - Varlık İsmi Tanımlama
Bu alanda ise amaç bir kelimenin varlık isimlerini bulmayı, bu varlık isimlerinin sınıflarını bulmayı hedeflemektir. Kelimeler tek başına veya birlikte bir varlığı tanımlayabilir. Bu tanımlanan varlığın ise sınıfını bulmak önemlidir. Örnek olarak mekan, meslek vb. olabilir. Ayrıca her kelime için varlık tanımlamaya gerek yoktur. Örnek olarak ise edat ve bağlaçlar için gerek yoktur.
import nltk
text = "Barack Obama, Amerika Birleşik Devletleri'nin 44. ve şu anki cumhurbaşkanıdır."
text = text.lower()
text = nltk.word_tokenize(text)
features = []
for i in range(len(text)):
features.append((text[i], text[i-1:i+2], text[max(0, i-2):i+3]))
trainer = nltk.train.CRFTagger()
trainer.set_features(features)
labels = [PERSON, LOCATION, O, O, O, O, O, O, O, O, O]
trainer.fit(features, labels)
new_text = "Ankara, Türkiye'nin başkentidir."
new_text = new_text.lower()
new_text = nltk.word_tokenize(new_text)
features_new = []
for i in range(len(new_text)):
features_new.append((new_text[i], new_text[i-1:i+2], new_text[max(0, i-2):i+3]))
predictions = trainer.tag(features_new)
print(predictions)
NER Yaklaşımları
Kural Tabanlı : Bu yaklaşım, önceden tanımlanmış kurallar ve kalıplar kullanarak varlık isimlerini tanır.Kurallar, el ile yazılır veya dilbilgisi kuralları ve sözlükler gibi kaynaklardan otomatik olarak çıkarılır.Kural tabanlı yaklaşım, nispeten basit ve hızlıdır.Ancak, bu yaklaşım, karmaşık metinleri işlemekte zorlanabilir ve domain'e özel kurallara ihtiyaç duyabilir.
İstatistiksel Tabanlı : Bu yaklaşım, varlık isimlerini tanımlamak için istatistiksel modeller kullanır. Modeller, büyük miktarda etiketlenmiş metin verisi üzerinde eğitilerek oluşturulur. İstatistiksel yaklaşım, karmaşık metinleri işleyebilir ve domain'e özel kurallara ihtiyaç duymaz. Ancak, bu yaklaşım, eğitilmesi daha uzun sürebilir ve daha fazla veri gerektirir.
Genel olarak kural tabanlı için yeni kurallar türetilebilir, alt eşlemeler yapılabilir, atamaya göre özel sözlük ayarlanabilir. Genel olarak ise istatistiksel tabanlı ise dizi etiketleme(sequence labels) ve özellik tabanlı(feature-based) olarak belirtilebilir.