ชุดเครื่องมือภาษาธรรมชาติ - การแทนที่คำ

การสะกดคำและการทำให้เป็นตัวอักษรถือได้ว่าเป็นการบีบอัดภาษาศาสตร์ชนิดหนึ่ง ในทำนองเดียวกันการแทนที่คำอาจถือได้ว่าเป็นการทำให้ข้อความเป็นมาตรฐานหรือการแก้ไขข้อผิดพลาด

แต่ทำไมเราต้องเปลี่ยนคำ? สมมติว่าถ้าเราพูดถึงโทเค็นมันมีปัญหาเกี่ยวกับการหดตัว (เช่นทำไม่ได้, ไม่ได้, ฯลฯ ) ดังนั้นเพื่อจัดการกับปัญหาดังกล่าวเราจำเป็นต้องเปลี่ยนคำ ตัวอย่างเช่นเราสามารถแทนที่การหดตัวด้วยรูปแบบที่ขยายได้

การแทนที่คำโดยใช้นิพจน์ทั่วไป

ขั้นแรกเราจะแทนที่คำที่ตรงกับนิพจน์ทั่วไป แต่สำหรับสิ่งนี้เราต้องมีความเข้าใจพื้นฐานเกี่ยวกับนิพจน์ทั่วไปเช่นเดียวกับโมดูล python re ในตัวอย่างด้านล่างเราจะแทนที่การหดตัวด้วยรูปแบบที่ขยายออก (เช่น "ไม่สามารถ" จะถูกแทนที่ด้วย "ไม่สามารถ") โดยใช้นิพจน์ทั่วไป

ตัวอย่าง

ขั้นแรกให้อิมพอร์ตแพ็กเกจที่จำเป็นเพื่อทำงานกับนิพจน์ทั่วไป

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, 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

บันทึกโปรแกรม python นี้ (พูดว่า repRE.py) และเรียกใช้จากพรอมต์คำสั่ง python หลังจากเรียกใช้แล้วให้นำเข้าคลาส REReplacer เมื่อคุณต้องการแทนที่คำ ให้เราดูว่า

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'

ตัวอย่างการใช้งานที่สมบูรณ์

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

เมื่อคุณบันทึกโปรแกรมข้างต้นและเรียกใช้แล้วคุณสามารถนำเข้าคลาสและใช้งานได้ดังนี้ -

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

เอาต์พุต

'I will not do it'

แทนที่ก่อนการประมวลผลข้อความ

แนวทางปฏิบัติทั่วไปอย่างหนึ่งในขณะที่ทำงานกับการประมวลผลภาษาธรรมชาติ (NLP) คือการล้างข้อความก่อนประมวลผลข้อความ ในประเด็นนี้เราสามารถใช้ไฟล์REReplacer คลาสที่สร้างขึ้นข้างต้นในตัวอย่างก่อนหน้านี้เป็นขั้นตอนเบื้องต้นก่อนการประมวลผลข้อความเช่นโทเค็น

ตัวอย่าง

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']

ในสูตร Python ข้างต้นเราสามารถเข้าใจความแตกต่างระหว่างผลลัพธ์ของโทเค็นไนเซอร์คำที่ไม่มีและโดยใช้นิพจน์ทั่วไปแทนที่

การลบอักขระที่ซ้ำกัน

เราใช้ไวยากรณ์ในภาษาประจำวันอย่างเคร่งครัดหรือไม่? ไม่เราไม่ใช่. ตัวอย่างเช่นบางครั้งเราเขียน 'Hiiiiiiiiiiii Mohan' เพื่อเน้นคำว่า 'Hi' แต่ระบบคอมพิวเตอร์ไม่ทราบว่า 'Hiiiiiiiiiiii' เป็นรูปแบบของคำว่า“ Hi” ในตัวอย่างด้านล่างเราจะสร้างคลาสชื่อrep_word_removal ซึ่งสามารถใช้สำหรับลบคำที่ซ้ำกัน

ตัวอย่าง

ขั้นแรกให้อิมพอร์ตแพ็กเกจที่จำเป็นเพื่อทำงานกับนิพจน์ทั่วไป

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
   repl_word = self.repeat_regexp.sub(self.repl, word)
   if repl_word != word:
      return self.replace(repl_word)
   else:
      return repl_word

บันทึกโปรแกรม python นี้ (เช่น removerepeat.py) และเรียกใช้จากพรอมต์คำสั่ง python หลังจากเรียกใช้แล้วให้นำเข้าRep_word_removalคลาสเมื่อคุณต้องการลบคำที่ซ้ำกัน ให้เราดูว่า?

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

ตัวอย่างการใช้งานที่สมบูรณ์

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

เมื่อคุณบันทึกโปรแกรมข้างต้นและเรียกใช้แล้วคุณสามารถนำเข้าคลาสและใช้งานได้ดังนี้ -

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

เอาต์พุต

'Hi'