NLTK ile POS Etiketleme ve NLP'de Parçalama [ÖRNEKLER]

⚡ Akıllı Özet

POS Etiketleme, bir cümledeki her kelimeye bir sözcük türü atarken, Gruplama ise etiketlenmiş bu kelimeleri isim tamlamaları gibi anlamlı ifadeler halinde gruplandırarak NLTK'nin düzenli ifadelerle oluşturduğu yüzeysel bir yapı ekler. Python.

  • ???? ️ POS Etiketleme: Her kelime, bağlamından NN, VB veya JJ gibi bir gramer belirteci alır.
  • ???? Kümeleme: Etiketlenmiş kelimeler, sığ ayrıştırma olarak da adlandırılan bir işlemle, kelime öbekleri halinde gruplandırılır.
  • 🔤 İş Akışı: Önce metni belirteçlere ayırın, ardından pos_tag uygulayın, sonra da RegexpParser grameriyle ayrıştırın.
  • 📊 Etiketleri saymak: Counter ve FreqDist, özellik geliştirme için etiket ve kelime sıklıklarını ortaya çıkarır.
  • 🔗 Kelime grupları: İkili ve üçlü kelime grupları, metin özelliklerini güçlendirmek için kelime çiftlerini ve üçlülerini yakalar.
  • 🤖 Yapay Zeka Kullanımı: Makine öğrenimi ve HMM tabanlı etiketleyiciler, belirsiz kelimeleri olasılıksal olarak ele alır.

NLP'de NLTK ve Parçalama ile POS Etiketleme

POS Etiketleme

POS Etiketleme (Sözcük Türü Etiketleme), bir kelimeyi tanımına ve bağlamına göre belirli bir sözcük türüne göre işaretleme işlemidir. Bir dildeki metni okumaktan ve her kelimeye belirli bir belirteç (Sözcük Türü) atamaktan sorumludur. Buna dilbilgisel etiketleme de denir.

NLTK sözcük türü örneğiyle öğrenelim:

Input: Everything to permit us.
Output: [('Everything', NN),('to', TO), ('permit', VB), ('us', PRP)]

POS Etiketleme Örneğinde Yer Alan Adımlar

  • Metni simgeleştirme (word_tokenize)
  • Yukarıdaki adıma pos_tag'ı uygulayın, yani nltk.pos_tag(tokenize_text)

Aşağıda NLTK POS Etiketi örnekleri listelenmiştir:

Kısaltma anlam
CC koordine edici bağlaç
CD kardinal rakam
DT belirlemek
EX orada varoluşsal
FW yabancı kelime
IN edat/alt bağlaç
JJ sıfat
JJR sıfat, karşılaştırmalı
JJS sıfat, üstünlük derecesi
LS liste pazarı
MD tipik
NN isim, tekil
NNS isim çoğul
NNP özel isim, tekil
NNPS özel isim, çoğul
PDT önceden belirleyici
POS iyelik eki
PRP şahıs zamiri
PRP $ iyelik zamiri
RB zarf
RBR zarf, karşılaştırmalı
RBS zarf, üstünlük derecesi
RP parçacık
TO sonsuz işaretleyici
UH ünlem
VB fiil
GBV fiil gerund
VBD fiil geçmiş zaman
VBN fiilin geçmiş zaman ortacı
VBP fiil, şimdiki zaman, üçüncü tekil şahıs hariç
VBZ fiil, şimdiki zaman, üçüncü tekil şahıs
wdt wh-belirleyici
WP wh-zamiri
WRB wh-zarfı

Yukarıdaki NLTK POS etiket listesi, tüm NLTK POS etiketlerini içermektedir. NLTK POS etiketleyici, cümlenin her kelimesine dilbilgisel bilgi atamak için kullanılır. POS NLTK'nin tüm paketlerinin kurulumu, içe aktarılması ve indirilmesi tamamlanmıştır.

NLP'de Parçalama Nedir?

Kümeleme Doğal dil işlemede (NLP), küçük bilgi parçalarını alıp büyük birimler halinde gruplandırma işlemidir. Parçalama işleminin temel kullanım alanı, "isim öbekleri" grupları oluşturmaktır. Düzenli ifadelerle birlikte sözcük türü etiketlemesini takip ederek cümleye yapı kazandırmak için kullanılır. Ortaya çıkan kelime grubuna "parçalar" denir. Buna ayrıca sığ ayrıştırma da denir.

Yüzeysel ayrıştırmada, kökler ve yapraklar arasında en fazla bir seviye bulunurken, derin ayrıştırma birden fazla seviye içerir. Yüzeysel ayrıştırmaya ayrıca hafif ayrıştırma veya öbekleme de denir.

Parçalama Kuralları

Önceden belirlenmiş kurallar yoktur, ancak bunları ihtiyaç ve gereksinimlere göre birleştirebilirsiniz. Örneğin, cümleden isim, fiil (geçmiş zaman), sıfat ve bağlayıcı edatı etiketlemeniz gerektiğini varsayalım. Aşağıdaki kuralı kullanabilirsiniz:

chunk:{***?}

Aşağıdaki tabloda çeşitli sembollerin anlamları gösterilmektedir:

Sembolün adı Açıklama
. Yeni satır dışında herhangi bir karakter
* 0 veya daha fazla tekrarı eşleştirin
? 0 veya 1 tekrarı eşleştirin

Şimdi kuralı daha iyi anlamak için kod yazalım.

from nltk import pos_tag
from nltk import RegexpParser
text ="learn php from guru99 and make study easy".split()
print("After Split:",text)
tokens_tag = pos_tag(text)
print("After Token:",tokens_tag)
patterns= """mychunk:{***?}"""
chunker = RegexpParser(patterns)
print("After Regex:",chunker)
output = chunker.parse(tokens_tag)
print("After Chunking",output)

Çıktı:

After Split: ['learn', 'php', 'from', 'guru99', 'and', 'make', 'study', 'easy']
After Token: [('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN'), ('and', 'CC'), ('make', 'VB'), ('study', 'NN'), ('easy', 'JJ')]
After Regex: chunk.RegexpParser with 1 stages:
RegexpChunkParser with 1 rules:
       '***?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

Yukarıdaki Konuşma Kısmı etiketlemesinden elde edilen sonuç Python Örneğin, "make" fiili kurala dahil olmadığı için mychunk olarak etiketlenmemiştir.

Parçalama Kullanım Örneği

Parçalara ayırma (chunking) varlık tespiti için kullanılır. Varlık, bir makinenin herhangi bir niyet için değeri elde ettiği cümlenin parçasıdır.

Example:
Temperature of New York.
Here Temperature is the intention and New York is an entity.

Başka bir deyişle, öbekleme, belirteçlerin alt kümelerini seçmek için kullanılır. Öbeklemenin belirteçleri seçmek için nasıl kullanıldığını anlamak için lütfen aşağıdaki kodu inceleyin. Bu örnekte, bir isim öbeğinin bir öbeğine karşılık gelen bir grafik göreceksiniz.

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {
?*}" cp =nltk.RegexpParser(grammar) result = cp.parse(tag) print(result) result.draw() # It will draw the pattern graphically which can be seen in Noun Phrase chunking

Çıktı:

['learn', 'php', 'from', 'guru99']  -- These are the tokens
[('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN')]   -- These are the pos_tag
(S (NP learn/JJ php/NN) from/IN (NP guru99/NN))        -- Noun Phrase Chunking

İsim Cümle Parçalama Grafiği

İsim Cümle parçalama Grafiği

Grafikten, "öğren" ve "guru99" kelimelerinin iki farklı token olduğunu ancak isim öbeği olarak sınıflandırıldığını, buna karşılık "from" kelimesinin isim öbeğine ait olmadığını çıkarabiliriz. Parçalama (chunking), farklı token'ları aynı öbeğe sınıflandırmak için kullanılır. Sonuç, seçilen dilbilgisine bağlı olacaktır. Ayrıca, NLTK'deki parçalama, kalıpları etiketlemek ve metin külliyatlarını keşfetmek için kullanılır.

POS Etiketlerini Sayma

Çeşitli konuları tartıştık konum etiketi Daha önce elde edilen değerleri burada inceleyeceksiniz. Etiket sayımı, metin sınıflandırması ve doğal dil işlemleri için özelliklerin hazırlanması açısından çok önemlidir. Önce çalışan kodu yazacağız, ardından adımları açıklayacağız.

from collections import Counter
import nltk
text = "Guru99 is one of the best sites to learn WEB, SAP, Ethical Hacking and much more online."
lower_case = text.lower()
tokens = nltk.word_tokenize(lower_case)
tags = nltk.pos_tag(tokens)
counts = Counter( tag for word,  tag in tags)
print(counts)

Çıktı:

Counter({'NN': 5, ',': 2, 'TO': 1, 'CC': 1, 'VBZ': 1, 'NNS': 1, 'CD': 1, '.': 1, 'DT': 1, 'JJS': 1, 'JJ': 1, 'JJR': 1, 'IN': 1, 'VB': 1, 'RB': 1})

Kodun detaylı açıklaması:

  1. `collections` modülündeki `Counter` paketini kullanın. `Counter`, öğeleri anahtar, sayımlarını ise değer olarak saklayan bir sözlük alt sınıfıdır.
  2. Metni belirteçlere ayırmak için nltk'yi içe aktarın.
  3. POS_tag'ını saymak istediğiniz metni yazın.
  4. Tokenizasyon işleminden önce tüm kelimeleri küçük harfe dönüştürün.
  5. Kelimeleri word_tokenize fonksiyonundan geçirin ve her bir tokenin pos_tag değerini hesaplayın.
  6. Sayaç daha sonra metindeki her etiketin toplam geçme sayısını sayar.

Frekans dağılımı

Frekans Dağılımı, bir deneyin sonucunun kaç kez meydana geldiğini ifade eder. Bir belgede her kelimenin geçme sıklığını bulmak için kullanılır. Frekans Dağıtımı tarafından tanımlanan sınıf nltk.olasılık modül. Her örnekleme gerçekleştiğinde sayım bir artırılır.

Herhangi bir kelimenin belgede kaç kez geçtiğini kontrol edebiliriz. Örneğin:

  • Sayma Yöntemi: `freq_dist.count('and')` ifadesi 'and' ifadesinin kaç kez geçtiğini döndürür. Bu ifadeye `count` metodu denir.
  • Frekans Yöntemi: freq_dist.freq('and') verilen bir örneğin frekansını döndürür.

Metindeki her kelimenin frekans dağılımını hesaplayan küçük bir program yazacağız.

import nltk
a = "Guru99 is the site where you can find the best tutorials for Software Testing     Tutorial, SAP Course for Beginners. Java Tutorial for Beginners and much more. Please     visit the site guru99.com and much more."
words = nltk.tokenize.word_tokenize(a)
fd = nltk.FreqDist(words)
fd.plot()

Kodun açıklaması:

  1. nltk modülünü içe aktarın.
  2. Kelime dağılımını bulmanız gereken metni yazın.
  3. nltk'nin FreqDist modülüne girdi olarak verilen metindeki her kelimeyi belirteçlere ayırın.
  4. Her bir kelimeyi nltk.FreqDist'e liste şeklinde uygulayın.
  5. plot() fonksiyonunu kullanarak kelimeleri grafikte çizin.

NOT: Grafiği görebilmek için matplotlib'in kurulu olması gerekmektedir. Metindeki her kelimenin geçme sayısını sayar ve metin tabanlı duygu analizine yardımcı olur. Anahtar terim "tokenleştirme"dir: tokenleştirmeden sonra, her kelimenin kaç kez geçtiği kontrol edilir.

Eşdizimler: Bigramlar ve Trigramlar

Kelime öbekleri, bir belgede birçok kez birlikte geçen kelime çiftleridir. Bu, birlikte geçen kelime çiftlerinin sayısının belgenin toplam kelime sayısına oranıyla hesaplanır.

Ultraviyole ışınları ve kızılötesi ışınları gibi kelimeleri ele alalım. Ultraviyole ve ışınlar kelimeleri ayrı ayrı kullanılmadığından, bir sözcük öbeği olarak değerlendirilebilirler. Bir diğer örnek ise BT taramasıdır, çünkü BT ve tarama kelimelerini ayrı ayrı kullanmayız. Sözcük öbekleri iki türe ayrılabilir:

  • İki kelimeden oluşan semboller: iki kelimenin birleşimi
  • Trigramlar: üç kelimenin birleşimi

İkili ve üçlü kelime grupları, özellik örneğine daha anlamlı ve kullanışlı özellikler sağlar.tracBu aşama özellikle metin tabanlı duygu analizi çalışmalarında faydalıdır.

İki kelimeden oluşan kelime öbeği Code:

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.bigrams(Tokens))
print(output)

Çıktı:

[('Guru99', 'is'), ('is', 'totally'), ('totally', 'new'), ('new', 'kind'), ('kind', 'of'), ('of', 'learning'), ('learning', 'experience'), ('experience', '.')]

Trigram Örneği Code:

Bazen istatistiksel analiz ve sıklık sayımı için cümlede üç kelime çiftini görmek önemli hale gelir. Bu yine oluşumunda önemli bir rol oynar NLP (Doğal dil işleme) özelliklerinin yanı sıra metin tabanlı duygu tahmini de kullanılır. Üçlü kelime gruplarını hesaplamak için de aynı kod çalıştırılır.

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.trigrams(Tokens))
print(output)

Çıktı:

[('Guru99', 'is', 'totally'), ('is', 'totally', 'new'), ('totally', 'new', 'kind'), ('new', 'kind', 'of'), ('kind', 'of', 'learning'), ('of', 'learning', 'experience'), ('learning', 'experience', '.')]

Cümleleri Etiketleme

Cümle etiketleme, cümlenin bağlamına bağlı olarak fiil veya isim gibi etiketler eklemeyi ifade eder. Sözcük türü etiketlerini belirlemek karmaşıktır, bu nedenle bazı kelimelerin cümle yapısına bağlı olarak belirsiz anlamları olabileceğinden, manuel olarak genel etiketleme mümkün değildir. Metni bir listeye dönüştürmek, etiketlemeden önce önemli bir adımdır, çünkü her kelime belirli bir etiket için döngüye alınır ve sayılır.

import nltk
text = "Hello Guru99, You have to build a very good site, and I love visiting your site."
sentence = nltk.sent_tokenize(text)
for sent in sentence:
	 print(nltk.pos_tag(nltk.word_tokenize(sent)))

Code Açıklama:

  1. Code nltk'yi içe aktarmak için (Doğal) Language Tool(İçinde cümle tokenizasyonu ve kelime tokenizasyonu gibi alt modüller bulunan kit).
  2. Etiketleri yazdırılacak metin.
  3. Cümle Belirteçleme.
  4. Cümledeki kelimelerin tokenleştirilmesi ve her kelimenin etiketinin çıktı olarak yazdırılması için bir for döngüsü uygulanmıştır.

Bir metin kümesinde iki tür POS etiketleyici bulunur:

1. Kural Tabanlı POS Etiketleyici: Anlamı belirsiz kelimeler için, bağlamsal bilgilere dayalı kural tabanlı bir yaklaşım uygulanır. Bu, önceki veya sonraki kelimenin anlamının analiz edilmesiyle yapılır. Bu nedenle kelimeler, büyük harf kullanımı ve noktalama işaretleri gibi belirli bir dilin gramer kurallarına göre etiketlenir. Örneğin, Brill'in etiketleyicisi.

2. Stokastik POS Etiketleyici: Bu yöntemde frekans veya olasılık gibi yaklaşımlar uygulanır. Bir kelime eğitim setinde çoğunlukla belirli bir etiketle etiketlenmişse, test cümlesinde de o etiket verilir. Kelime etiketi yalnızca kendi etiketine değil, aynı zamanda önceki etikete de bağlıdır, bu nedenle bu yöntem her zaman doğru sonuç vermeyebilir.

Gizli Markov Modeli ile POS Etiketleme

Etiketleme problemleri, Gizli Markov Modeli (HMM) kullanılarak da modellenebilir. Bu model, girdi belirteçlerini gözlemlenebilir bir dizi olarak ele alırken, etiketleri gizli durumlar olarak kabul eder ve amaç gizli durum dizisini belirlemektir. Örneğin, x = x1,x2,…,xn, burada x belirteç dizisidir, y = y1,y2,y3,y4…yn ise gizli dizidir.

Gizli Markov Modeli (HMM) Nasıl Çalışır?

HMM, x'in giriş belirteç dizisi ve y'nin etiket dizisi olduğu bir ortak dağılım P(x, y) kullanır. x için etiket dizisi, p(x1,x2,…xn,y1,y2,y3,…)'ün y1…yn üzerindeki argmax'ı olacaktır. Metinden etiketleri kategorize ettik, ancak bu etiketlerin istatistikleri hayati önem taşıdığından, bir sonraki adım istatistiksel çalışma için bu etiketleri saymaktır.

SSS

POS etiketleme, her bir kelimeyi isim veya fiil gibi sözcük türüyle etiketler. Gruplandırma ise bir adım daha ileri giderek, etiketlenmiş kelimeleri isim tamlamaları gibi ifadeler halinde gruplandırır ve cümleye yüzeysel bir yapı kazandırır.

Sığ ayrıştırma, diğer adıyla öbekleme veya hafif ayrıştırma, kökler ve yapraklar arasında en fazla bir seviye bırakır. Tam bir ayrıştırma ağacı oluşturmadan kelime öbeği sınırlarını belirler, bu da onu derin ayrıştırmadan daha hızlı hale getirir.

Kelime öbekleri, etiketlenmiş kelimeleri gruplar halinde bir araya getirerek sistemin kişiler, konumlar, tarihler veya ürünler gibi varlıkları tespit etmesini sağlar. Adlandırılmış varlık tanıma, bu öbeklere dayanarak farklı varlıkları tanımlar.tracHam metinden anlamlı değerler elde etmek.

`nltk.pos_tag()` fonksiyonu, sözcük türü etiketlerini atar. Öncelikle metni `word_tokenize` ile belirteçlere ayırırsınız, ardından belirteç listesini `pos_tag` fonksiyonuna iletirsiniz; bu fonksiyon her kelimeyi `NN`, `VB` veya `JJ` gibi etiketleriyle eşleştirerek döndürür.

Evet. Makine öğrenimi ve derin sinir ağlarıyla eğitilmiş modern yapay zeka etiketleyicileri, büyük metin verilerinden bağlam öğrenerek belirsiz kelimeleri çözümlüyor ve gerçek dünya metinlerinde kural tabanlı yöntemlere göre daha yüksek doğruluk oranına ulaşıyor.

Stokastik etiketleyiciler, eğitim verilerinden öğrenilen olasılıkları kullanır. Makine öğrenimi, çevredeki etiketler göz önüne alındığında her bir etiketin bir kelime için ne kadar olası olduğunu tahmin eder ve ardından en yüksek genel olasılığa sahip diziyi seçer.

Dışında NLTKPopüler seçenekler arasında şunlar yer almaktadır: spacy Hızlı üretim süreçleri için Stanford CoreNLP ve transformatör tabanlı etiketleme için Hugging Face Transformers kullanılmıştır.

Bir öbek dilbilgisinde, nokta yeni satır karakteri hariç herhangi bir karakterle eşleşir, yıldız işareti sıfır veya daha fazla tekrarla eşleşir ve soru işareti önceki POS etiket kalıbının sıfır veya bir tekrarıyla eşleşir.

Bu yazıyı şu şekilde özetleyin: