Python에서 NLTK 스테밍 이상 현상 수정

Shikha Chaudhary 2023년6월21일
  1. Python에서 NLTK 스테밍 이상 현상 수정
  2. Python에서 NLTKPorterStemmer 모듈에서 형태소 분석 이상 수정
  3. Python의 NLTK에서 형태소 분석기보다 Lemmatizer 사용
  4. 결론
Python에서 NLTK 스테밍 이상 현상 수정

형태소 분석은 이름에서 알 수 있듯이 단어를 어근 형태로 줄이는 방법입니다. 예를 들어 happiness, happilyhappier와 같은 단어는 모두 happy라는 루트 단어로 분해됩니다.

Python에서는 Python의 NLTK 라이브러리에서 제공하는 다양한 모듈의 도움으로 이를 수행할 수 있지만 때로는 예상한 결과를 얻지 못할 수도 있습니다. 예를 들어 fairlyNLTK 라이브러리의 fair PorterStemmer 모듈이 아닌 fairli로 축소됩니다.

이 기사에서는 이러한 차이가 발생하는 이유와 원하는 루트 단어를 얻기 위해 이를 수정하는 방법에 대해 설명합니다. 그러니 커피를 들고 계속 읽으십시오!

Python에서 NLTK 스테밍 이상 현상 수정

Python의 NLTK 라이브러리에는 여러 형태소 분석기가 있지만 가장 일반적으로 사용되는 형태는 PorterStemmer입니다. 다음은 PorterStemmer 작동 방식의 예입니다.

먼저 이 코드에서 무슨 일이 일어나고 있는지 이해하겠습니다.

먼저 nltk 라이브러리에서 PorterStemmer를 가져온 다음 인스턴스를 생성합니다. 이제 이 인스턴스를 사용하여 nltk 라이브러리에서 제공하는 stem() 함수를 사용하여 주어진 단어 목록을 어간으로 만들 수 있습니다.

from nltk.stem import PorterStemmer

p = PorterStemmer()

similar_words = ["act", "acting", "acts"]

for x in similar_words:
    print(x, "comes from", p.stem(x))

출력:

act comes from act
acting comes from act
acts comes from act

이 목록의 모든 단어는 PorterStemmer 모듈의 도움으로 루트 단어 act로 축소됩니다. 그러나 이것이 이 모듈이 항상 작동하는 방식은 아닙니다.

여기 또 다른 예가 있습니다.

from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("loudly"))

출력:

'loudli'

이번에는 출력이 loudli가 아닌 loudli로 출력되는 것을 볼 수 있습니다.

왜 이런 일이 발생하는지 궁금합니다. 그리고 더 중요한 것은 이 문제를 해결하는 방법입니다.

Python에서 NLTKPorterStemmer 모듈에서 형태소 분석 이상 수정

PorterStemmer 모듈은 각각 고유한 규칙과 절차가 있는 5단계로 작동합니다. 또한 일반적으로 제공되는 결과는 영어를 기반으로 합니다.

이것은 loudi라는 단어가 우리가 원하는 것이 아니더라도 PorterStemmer 모듈의 규칙에 따라 어간이 올바른 단어임을 의미합니다.

그러나 좋은 소식이 있습니다. NLTK 모듈의 모든 형태소 분석기가 유사하게 작동하는 것은 아닙니다. 이번에는 SnowballStemmer의 도움으로 loudly라는 단어를 어간으로 만들어 보겠습니다.

여기에서 SnowballStemmer() 함수에 매개변수로 언어를 전달해야 합니다.

from nltk.stem import SnowballStemmer

s = SnowballStemmer("english")
print(s.stem("loudly"))

출력:

'loud'

SnowballStemmer는 확실히 PorterStemmer와는 다른 규칙 세트를 사용하기 때문에 이번에는 원하는 출력을 얻는 것을 볼 수 있습니다. 이제 여기에 흥미로운 것이 있습니다.

이 두 모듈을 모두 사용하여 배우라는 단어를 형태소 분석해 보십시오. 이것은 아래에서 수행됩니다.

from nltk.stem import SnowballStemmer
from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("actor"))


s = SnowballStemmer("english")
print(s.stem("actor"))

출력:

'actor'
'actor'

이 두 모듈 모두 루트 단어인 act가 아니라 actor라는 동일한 출력을 반환하는 것을 볼 수 있습니다. 이제 LancasterStemmer라는 또 다른 형태소 분석기로 이를 시도해 보겠습니다.

from nltk.stem import LancasterStemmer

l = LancasterStemmer()
print(l.stem("actor"))

출력:

'act'

이번에는 원하는 act 출력을 얻는 것을 볼 수 있습니다.

서로 다른 형태소 분석기가 서로 다른 단어로 서로 다른 출력을 제공하는 방법을 확인했습니다.

다양한 형태소 분석기를 사용할 수 있지만 모두 일부 알고리즘을 기반으로 하기 때문에 원하는 출력을 얻지 못할 가능성이 항상 있습니다. 또한 이러한 형태소 분석기는 알고리즘을 기반으로 단어를 잘라내는 데 매우 엄격합니다.

또한 형태소 분석은 대부분 접미사 부분에서 작동하며 접두사 또는 접미사를 제거하여 단어를 계산할 만큼 똑똑하지 않습니다. 어간 추출 알고리즘은 단어의 의미와 결과 어근을 찾지도 않습니다.

이 예를 보십시오.

다음은 끝에 ing이 있는 임의의 문자 문자열이며 형태소 분석기는 이 접미사를 제거하고 출력을 반환합니다.

from nltk.stem import PorterStemmer

p = PorterStemmer()
print(p.stem("wkhfksafking"))

출력:

'wkhfksafk'

따라서 이 문제를 해결하기 위해 더 좋은 방법은 표제어를 사용하는 것입니다. lemmatizer의 작업을 자세히 살펴보겠습니다.

Python의 NLTK에서 형태소 분석기보다 Lemmatizer 사용

형태소 분석기와 달리 원형 분류기는 단어를 형태학적으로 분석하고 단어가 사용되는 컨텍스트에 따라 가장 적합한 기본형을 찾을 수 있습니다. 기본형은 줄기와 달리 모든 형태의 기본 형태이기 때문에 보조형은 줄기와 동일하지 않습니다.

예를 들어 원형 분류기가 형태소 분석기보다 더 나은 방법을 살펴보겠습니다.

여기에서는 PorterStemmer를 사용하여 여러 단어를 형태소 분석합니다.

from nltk.stem import PorterStemmer

p = PorterStemmer()

w = ["studies", "studying", "study"]

for i in w:
    print(p.stem(i))

출력:

studi
studi
studi

우리가 얻은 출력이 그다지 도움이 되지 않는다는 것을 알 수 있습니다. 계속해서 동일한 단어 집합에 대해 원형 분류기를 사용하겠습니다.

먼저 WordNetLemmatizer 모듈을 가져와 인스턴스를 생성합니다. 그런 다음 for 루프와 함께 lemmatize() 함수를 사용하여 각 단어의 기본형을 찾습니다.

from nltk.stem import WordNetLemmatizer

l = WordNetLemmatizer()

w = ["studies", "studying", "study"]

for i in w:
    print(l.lemmatize(i))

출력:

study
studying
study

이번에는 터무니없는 출력을 얻지 않으며 모든 단어가 의미가 있습니다.

이것은 lemmatizer를 사용하는 것이 형태소 분석기를 사용하는 것보다 나은 방법입니다.

형태소 분석기와 원형 분류기에 대한 자세한 내용은 링크를 참조하십시오.

결론

이 기사에서는 Python에서 NLTK의 형태소 분석기와 원형 분류기에 대해 설명했습니다. 형태소 분석기가 때때로 터무니없는 결과를 제공하는 방법과 이유 및 더 나은 결과를 얻기 위해 원형 분류기를 사용할 수 있는 방법을 살펴보았습니다.