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'