Natural Language Toolkit-단어 대체

어간 및 lemmatization은 일종의 언어 압축으로 간주 될 수 있습니다. 같은 의미에서 단어 교체는 텍스트 정규화 또는 오류 수정으로 생각할 수 있습니다.

하지만 왜 우리는 단어 교체가 필요합니까? 토큰 화에 대해 이야기하면 수축에 문제가 있다고 가정합니다 (예 : 할 수 없음, 할 수 없음 등). 따라서 이러한 문제를 처리하려면 단어 교체가 필요합니다. 예를 들어 수축을 확장 된 형태로 바꿀 수 있습니다.

정규식을 사용한 단어 교체

먼저 정규 표현식과 일치하는 단어를 교체합니다. 그러나이를 위해서는 파이썬 re 모듈뿐만 아니라 정규 표현식에 대한 기본적인 이해가 있어야합니다. 아래 예에서 우리는 수축을 확장 된 형태로 대체 할 것입니다 (예 : "ca n't"는 "cannot"으로 대체 됨).이 모든 것은 정규 표현식을 사용합니다.

먼저 정규식 작업에 필요한 패키지를 다시 가져옵니다.

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 레시피에서 정규식 바꾸기를 사용하지 않는 경우와 사용하는 경우의 단어 토크 나이저 출력의 차이를 쉽게 이해할 수 있습니다.

반복되는 문자 제거

우리는 일상 언어로 엄격하게 문법을 사용합니까? 아니 우리는하지 않습니다. 예를 들어 'Hi'라는 단어를 강조하기 위해 'Hiiiiiiiiiiii Mohan'이라고 씁니다. 그러나 컴퓨터 시스템은 '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

이 파이썬 프로그램을 저장하고 (예 : removalrepeat.py) 파이썬 명령 프롬프트에서 실행하십시오. 실행 후 가져 오기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'