Natural Language Toolkit - Kelime Değiştirme

Kök bulma ve lemmatizasyon bir tür dilsel sıkıştırma olarak düşünülebilir. Aynı anlamda, kelime değiştirme, metin normalleştirme veya hata düzeltme olarak düşünülebilir.

Ama neden kelime değiştirmeye ihtiyacımız vardı? Diyelim ki tokenleştirme hakkında konuşursak, o zaman kasılmalarla ilgili sorunlar yaşıyor (yapamama, yapmayacağım, vb. Bu nedenle, bu tür sorunları çözmek için kelime değiştirmeye ihtiyacımız var. Örneğin, kasılmaları genişletilmiş biçimleriyle değiştirebiliriz.

Normal ifade kullanarak kelime değişimi

İlk olarak, normal ifadeyle eşleşen kelimeleri değiştireceğiz. Ancak bunun için normal ifadelerin yanı sıra python re modülüne ilişkin temel bir anlayışa sahip olmamız gerekir. Aşağıdaki örnekte, daraltmayı genişletilmiş biçimleriyle değiştireceğiz (ör. "Yapamaz", "yapılamaz" ile değiştirilecektir), bunların hepsini normal ifadeler kullanarak.

Misal

Öncelikle, normal ifadelerle çalışmak için gerekli paketi yeniden içe aktarın.

import re
from nltk.corpus import wordnet

Ardından, seçtiğiniz değiştirme modellerini aşağıdaki gibi tanımlayın -

R_patterns = [
   (r'won\'t', 'will not'),
   (r'can\'t', 'cannot'),
   (r'i\'m', 'i am'),
   r'(\w+)\'ll', '\g<1> will'),
   (r'(\w+)n\'t', '\g<1> not'),
   (r'(\w+)\'ve', '\g<1> have'),
   (r'(\w+)\'s', '\g<1> is'),
   (r'(\w+)\'re', '\g<1> are'),
]

Şimdi, kelimeleri değiştirmek için kullanılabilecek bir sınıf oluşturun -

class REReplacer(object):
   def __init__(self, pattern = R_patterns):
      self.pattern = [(re.compile(regex), repl) for (regex, repl) in patterns]
   def replace(self, text):
      s = text
      for (pattern, repl) in self.pattern:
         s = re.sub(pattern, repl, s)
      return s

Bu python programını kaydedin (repRE.py deyin) ve python komut isteminden çalıştırın. Çalıştırdıktan sonra, kelimeleri değiştirmek istediğinizde REReplacer sınıfını içe aktarın. Nasıl olduğunu görelim.

from repRE import REReplacer
rep_word = REReplacer()
rep_word.replace("I won't do it")
Output:
'I will not do it'
rep_word.replace("I can’t do it")
Output:
'I cannot do it'

Eksiksiz uygulama örneği

import re
from nltk.corpus import wordnet
R_patterns = [
   (r'won\'t', 'will not'),
   (r'can\'t', 'cannot'),
   (r'i\'m', 'i am'),
   r'(\w+)\'ll', '\g<1> will'),
   (r'(\w+)n\'t', '\g<1> not'),
   (r'(\w+)\'ve', '\g<1> have'),
   (r'(\w+)\'s', '\g<1> is'),
   (r'(\w+)\'re', '\g<1> are'),
]
class REReplacer(object):
def __init__(self, patterns=R_patterns):
   self.patterns = [(re.compile(regex), repl) for (regex, repl) in patterns]
def replace(self, text):
   s = text
   for (pattern, repl) in self.patterns:
      s = re.sub(pattern, repl, s)
   return s

Şimdi yukarıdaki programı kaydettikten ve çalıştırdıktan sonra, sınıfı içe aktarabilir ve aşağıdaki gibi kullanabilirsiniz -

from replacerRE import REReplacer
rep_word = REReplacer()
rep_word.replace("I won't do it")

Çıktı

'I will not do it'

Metin işlemeden önce değiştirme

Doğal dil işleme (NLP) ile çalışırken yaygın uygulamalardan biri, metin işlemeden önce metni temizlemektir. Bu konuda biz de kullanabilirizREReplacer önceki örnekte, metin işlemeden önceki bir ön adım olarak, yani belirteçleştirmeden önce oluşturulan sınıf.

Misal

from nltk.tokenize import word_tokenize
from replacerRE import REReplacer
rep_word = REReplacer()
word_tokenize("I won't be able to do this now")
Output:
['I', 'wo', "n't", 'be', 'able', 'to', 'do', 'this', 'now']
word_tokenize(rep_word.replace("I won't be able to do this now"))
Output:
['I', 'will', 'not', 'be', 'able', 'to', 'do', 'this', 'now']

Yukarıdaki Python tarifinde, düzenli ifade değiştirme kullanmadan ve kullanmadan kelime tokenizatörünün çıktısı arasındaki farkı kolayca anlayabiliriz.

Yinelenen karakterlerin kaldırılması

Günlük dilimizde kesinlikle gramer yapıyor muyuz? Biz değiliz. Örneğin, bazen 'Merhaba' kelimesini vurgulamak için 'Hiiiiiiiiiiii Mohan' yazarız. Ancak bilgisayar sistemi, "Hiiiiiiiiiiii" nin "Merhaba" kelimesinin bir varyasyonu olduğunu bilmiyor. Aşağıdaki örnekte, adında bir sınıf oluşturacağızrep_word_removal yinelenen kelimeleri kaldırmak için kullanılabilir.

Misal

Öncelikle, normal ifadelerle çalışmak için gerekli paketi içe aktarın

import re
from nltk.corpus import wordnet

Şimdi, yinelenen kelimeleri kaldırmak için kullanılabilecek bir sınıf oluşturun -

class Rep_word_removal(object):
   def __init__(self):
      self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
      self.repl = r'\1\2\3'
   def replace(self, word):
      if wordnet.synsets(word):
      return word
   repl_word = self.repeat_regexp.sub(self.repl, word)
   if repl_word != word:
      return self.replace(repl_word)
   else:
      return repl_word

Bu python programını kaydedin (removerepeat.py deyin) ve python komut isteminden çalıştırın. Çalıştırdıktan sonra içe aktarınRep_word_removalyinelenen kelimeleri kaldırmak istediğinizde sınıf. Bakalım nasıl olacak?

from removalrepeat import Rep_word_removal
rep_word = Rep_word_removal()
rep_word.replace ("Hiiiiiiiiiiiiiiiiiiiii")
Output:
'Hi'
rep_word.replace("Hellooooooooooooooo")
Output:
'Hello'

Eksiksiz uygulama örneği

import re
from nltk.corpus import wordnet
class Rep_word_removal(object):
   def __init__(self):
      self.repeat_regexp = re.compile(r'(\w*)(\w)\2(\w*)')
      self.repl = r'\1\2\3'
   def replace(self, word):
      if wordnet.synsets(word):
         return word
   replace_word = self.repeat_regexp.sub(self.repl, word)
   if replace_word != word:
      return self.replace(replace_word)
   else:
      return replace_word

Şimdi yukarıdaki programı kaydettikten ve çalıştırdıktan sonra, sınıfı içe aktarabilir ve aşağıdaki gibi kullanabilirsiniz -

from removalrepeat import Rep_word_removal
rep_word = Rep_word_removal()
rep_word.replace ("Hiiiiiiiiiiiiiiiiiiiii")

Çıktı

'Hi'