Natural Language Toolkit - Parçaları Dönüştürmek

Neden Chunks'u dönüştürüyoruz?

Şimdiye kadar cümlelerden parçalarımız veya tümcelerimiz var ama onlarla ne yapmamız gerekiyor? Önemli görevlerden biri onları dönüştürmektir. Ama neden? Aşağıdakileri yapmaktır -

  • dilbilgisi düzeltmesi ve
  • ifadeleri yeniden düzenlemek

Önemsiz / yararsız kelimeleri filtreleme

Bir cümlenin anlamını yargılamak istiyorsanız, o zaman 'the', 'a' gibi yaygın olarak kullanılan birçok kelimenin önemsiz veya faydasız olduğunu varsayalım. Örneğin, şu ifadeye bakın -

'Film güzeldi'.

Burada en anlamlı kelimeler 'film' ve 'iyi'. Diğer sözcükler, 've' idi 'her ikisi de işe yaramaz veya önemsizdir. Çünkü onlar olmadan da cümlenin aynı anlamını elde edebiliriz. 'İyi film'.

Aşağıdaki python tarifinde, POS etiketleri yardımıyla gereksiz / önemsiz kelimelerin nasıl kaldırılacağını ve anlamlı kelimelerin nasıl saklanacağını öğreneceğiz.

Misal

Önce, bakarak treebankEngellenecek kelimeler için külliyat, hangi konuşma parçası etiketlerinin önemli, hangilerinin önemli olmadığına karar vermemiz gerekir. Aşağıdaki önemsiz kelime ve etiket tablosunu görelim -

Kelime Etiket
a DT
Herşey Pasifik yaz saati
Bir DT
Ve CC
Veya CC
Bu WDT
The DT

Yukarıdaki tablodan CC dışındaki tüm etiketleri görebiliriz, diğer tüm etiketler DT ile biter, bu da önemsiz kelimeleri etiketin son ekine bakarak filtreleyebileceğimiz anlamına gelir.

Bu örnek için, adlı bir fonksiyon kullanacağız. filter()Bu, tek bir yığın alır ve önemsiz etiketlenmiş kelimeler olmadan yeni bir yığın döndürür. Bu işlev, DT veya CC ile biten tüm etiketleri filtreler.

Misal

import nltk
def filter(chunk, tag_suffixes=['DT', 'CC']):
   significant = []
   for word, tag in chunk:
      ok = True
      for suffix in tag_suffixes:
         if tag.endswith(suffix):
            ok = False
            break
      if ok:
         significant.append((word, tag))
   return (significant)

Şimdi, önemsiz kelimeleri silmek için Python tarifimizde bu fonksiyon filtresini () kullanalım -

from chunk_parse import filter
filter([('the', 'DT'),('good', 'JJ'),('movie', 'NN')])

Çıktı

[('good', 'JJ'), ('movie', 'NN')]

Fiil Düzeltme

Çoğu zaman, gerçek dünya dilinde yanlış fiil formları görürüz. Örneğin, 'iyi misin?' Doğru değil. Bu cümlede fiil formu doğru değil. Cümle 'iyi misin?' Olmalıdır. NLTK, fiil düzeltme eşlemeleri oluşturarak bu tür hataları düzeltmemiz için bize bir yol sağlar. Bu düzeltme eşlemeleri, öbekte çoğul veya tekil bir isim olmasına bağlı olarak kullanılır.

Misal

Python tarifini uygulamak için önce fiil düzeltme eşlemelerini tanımlamamız gerekir. Aşağıdaki gibi iki eşleme oluşturalım -

Plural to Singular mappings

plural= {
   ('is', 'VBZ'): ('are', 'VBP'),
   ('was', 'VBD'): ('were', 'VBD')
}

Singular to Plural mappings

singular = {
   ('are', 'VBP'): ('is', 'VBZ'),
   ('were', 'VBD'): ('was', 'VBD')
}

Yukarıda görüldüğü gibi, her eşlemede başka bir etiketli fiil ile eşleşen etiketli bir fiil vardır. Örneğimizdeki ilk eşlemeler, eşlemelerin temelini kapsaris to are, was to wereve tam tersi.

Sonra, adında bir fonksiyon tanımlayacağız verbs(), yanlış fiil biçimine sahip bir boşluktan geçebilir ve düzeltilmiş bir yığın geri alırsınız. Bitirmek içinverb() işlev adlı bir yardımcı işlev kullanır index_chunk() bu, ilk etiketlenen kelimenin konumu için yığın arayacaktır.

Bu işlevleri görelim -

def index_chunk(chunk, pred, start = 0, step = 1):
   l = len(chunk)
   end = l if step > 0 else -1
   for i in range(start, end, step):
      if pred(chunk[i]):
         return i
      return None
def tag_startswith(prefix):
   def f(wt):
      return wt[1].startswith(prefix)
   return f

def verbs(chunk):
   vbidx = index_chunk(chunk, tag_startswith('VB'))
   if vbidx is None:
      return chunk
   verb, vbtag = chunk[vbidx]
   nnpred = tag_startswith('NN')
   nnidx = index_chunk(chunk, nnpred, start = vbidx+1)
   if nnidx is None:
      nnidx = index_chunk(chunk, nnpred, start = vbidx-1, step = -1)
   if nnidx is None:
      return chunk
   noun, nntag = chunk[nnidx]
   if nntag.endswith('S'):
      chunk[vbidx] = plural.get((verb, vbtag), (verb, vbtag))
   else:
      chunk[vbidx] = singular.get((verb, vbtag), (verb, vbtag))
   return chunk

Bu işlevleri Python veya Anaconda'nın kurulu olduğu yerel dizininizdeki bir Python dosyasına kaydedin ve çalıştırın. Olarak kaydettimverbcorrect.py.

Şimdi arayalım verbs() etiketli bir POS üzerinde işlev is you fine yığın -

from verbcorrect import verbs
verbs([('is', 'VBZ'), ('you', 'PRP$'), ('fine', 'VBG')])

Çıktı

[('are', 'VBP'), ('you', 'PRP$'), ('fine','VBG')]

Pasif sesi ifadelerden çıkarmak

Diğer bir yararlı görev, pasif sesi ifadelerden çıkarmaktır. Bu, kelimeleri bir fiilin etrafına yerleştirmek suretiyle yapılabilir. Örneğin,‘the tutorial was great’ dönüştürülebilir ‘the great tutorial’.

Misal

Bunu başarmak için adlı bir fonksiyon tanımlıyoruz eliminate_passive()Bu, pivot noktası olarak fiili kullanarak yığının sağ tarafını sol tarafla değiştirecektir. Dönecek fiili bulmak için, aynı zamandaindex_chunk() yukarıda tanımlanan işlev.

def eliminate_passive(chunk):
   def vbpred(wt):
      word, tag = wt
      return tag != 'VBG' and tag.startswith('VB') and len(tag) > 2
   vbidx = index_chunk(chunk, vbpred)
   if vbidx is None:
      return chunk
   return chunk[vbidx+1:] + chunk[:vbidx]

Şimdi arayalım eliminate_passive() etiketli bir POS üzerinde işlev the tutorial was great yığın -

from passiveverb import eliminate_passive
eliminate_passive(
   [
      ('the', 'DT'), ('tutorial', 'NN'), ('was', 'VBD'), ('great', 'JJ')
   ]
)

Çıktı

[('great', 'JJ'), ('the', 'DT'), ('tutorial', 'NN')]

İsim kardinallerinin değiştirilmesi

Bildiğimiz gibi, 5 gibi kardinal bir kelime bir yığın halinde CD olarak etiketlenir. Bu ana sözcükler genellikle bir isimden önce veya sonra ortaya çıkar, ancak normalleştirme amacıyla onları her zaman ismin önüne koymak yararlıdır. Örneğin tarihJanuary 5 olarak yazılabilir 5 January. Bunu aşağıdaki örnekle anlayalım.

Misal

Bunu başarmak için adlı bir fonksiyon tanımlıyoruz swapping_cardinals()bu, isimden hemen sonra ortaya çıkan herhangi bir kardinali isimle değiştirecektir. Bununla kardinal, isimden hemen önce ortaya çıkacaktır. Verilen etiketle eşitlik karşılaştırması yapmak için, adını verdiğimiz bir yardımcı işlevi kullanır.tag_eql().

def tag_eql(tag):
   def f(wt):
      return wt[1] == tag
   return f

Şimdi swapping_cardinals () tanımlayabiliriz -

def swapping_cardinals (chunk):
   cdidx = index_chunk(chunk, tag_eql('CD'))
   if not cdidx or not chunk[cdidx-1][1].startswith('NN'):
      return chunk
   noun, nntag = chunk[cdidx-1]
   chunk[cdidx-1] = chunk[cdidx]
   chunk[cdidx] = noun, nntag
   return chunk

Şimdi arayalım swapping_cardinals() bir tarihte işlev “January 5” -

from Cardinals import swapping_cardinals()
swapping_cardinals([('Janaury', 'NNP'), ('5', 'CD')])

Çıktı

[('10', 'CD'), ('January', 'NNP')]
10 January