형태소 분석 및 Lemmatization Python 예제가 포함된 NLTK

⚡ 스마트 요약

어간 추출과 표제어 추출은 텍스트 정규화 기법입니다. Python NLTK는 단어 변형을 공통 기본형으로 줄여주는데, 어간 추출은 문맥에 관계없이 접미사를 빠르게 제거하고, 표제어 추출은 의미를 이용하여 실제 사전 단어를 반환합니다.

  • 🌱 어간 : PorterStemmer는 접미사를 제거하여 실제 단어가 아닐 수도 있는 어근에 도달합니다.
  • 📚 주형 화 : WordNetLemmatizer는 사전의 기본 형태인 어근을 반환합니다.
  • ⚖️ 차: 어간 추출은 더 빠르고, 표제어 추출은 더 느리지만 더 정확하고 문맥을 고려합니다.
  • 🔤 표준화: 둘 다 단어 밀도를 줄여 기계가 변형을 하나의 특징으로 처리하도록 합니다.
  • 🏷️ POS 태그: 품사 태그를 전달하면 어근 추출기가 훨씬 더 정확해집니다.
  • 🤖 AI의 이점: 더 깔끔하고 정규화된 텍스트는 더 강력한 머신러닝 특징과 모델을 생성합니다.

형태소 분석 및 Lemmatization Python NLTK

형태소 분석 및 Lemmatization이란 무엇입니까? Python NLTK?

형태소 분석 및 표제어 추출 in Python NLTK는 자연어 처리를 위한 텍스트 정규화 기법입니다. 이러한 기법은 텍스트 전처리에 널리 사용됩니다. 어간 추출과 표제어 추출의 차이점은 어간 추출은 문맥을 알지 못한 채 단어를 잘라내기 때문에 더 빠르지만, 표제어 추출은 문맥을 알고 처리하기 때문에 더 느리다는 것입니다.

형태소 분석이란 무엇입니까?

줄기 단어를 표준화하는 방법입니다. NLP 자연 언어 처리어간 추출은 문장 내 단어들을 순열로 변환하여 검색 시간을 단축하는 기술입니다. 이 방법에서는 문맥이나 문장에 따라 의미가 조금씩 다른 단어들을 표준화합니다. 다시 말해, 하나의 어근이 있지만 그 어근에 여러 변형이 있는 경우를 생각해 보세요. 예를 들어, 어근이 "먹다"이고 그 변형이 "eats", "eating", "eaten" 등이라면, 어간 추출을 이용하면 이러한 변형들을 효율적으로 찾아낼 수 있습니다. Python우리는 어떤 변형의 어근도 찾을 수 있습니다.

예 :

He was riding.
He was taking the ride.

위의 두 문장은 모두 과거의 승마 활동을 의미하는 동일한 의미를 가지고 있습니다. 사람은 두 문장의 의미를 쉽게 이해할 수 있지만, 기계는 두 문장을 서로 다른 것으로 인식합니다. 따라서 두 문장을 동일한 데이터 행으로 변환하는 것이 어려워집니다. 동일한 데이터셋을 제공하지 않으면 기계는 예측에 실패합니다. 그러므로 기계 학습을 위한 데이터셋을 준비하기 위해서는 각 단어의 의미를 구분하는 것이 필수적입니다. 여기서는 어간 추출(stemming)을 사용하여 동일한 유형의 데이터를 어근을 추출함으로써 분류합니다.

이를 구현하기 위해 다음을 사용해 보겠습니다. Python 프로그램. NLTK에는 다음과 같은 알고리즘이 있습니다. 포터스테머이 알고리즘은 토큰화된 단어 목록을 입력받아 어근 단어로 추출합니다.

형태소 분석 이해 프로그램

from nltk.stem import PorterStemmer
e_words= ["wait", "waiting", "waited", "waits"]
ps =PorterStemmer()
for w in e_words:
    rootWord=ps.stem(w)
    print(rootWord)

출력:

wait
wait
wait
wait

Code 설명 :

  • NLTK에는 임포트되는 스템 모듈이 있습니다. 전체 모듈을 임포트하면 수천 줄의 코드가 포함되어 프로그램이 무거워집니다. 따라서 전체 스템 모듈 중에서 "PorterStemmer"만 임포트했습니다.
  • 동일한 단어의 변형 데이터 더미 목록을 준비했습니다.
  • nltk.stem.porter.PorterStemmer 클래스에 속하는 객체가 생성됩니다.
  • 우리는 "for" 루프를 사용하여 목록을 하나씩 PorterStemmer에 전달했습니다. 최종적으로 목록에 있는 각 단어의 어근을 출력으로 얻었습니다.

위에서 살펴본 바와 같이, 어간 추출은 동일한 단어 내의 중복 및 변형을 제거하기 때문에 중요한 전처리 단계입니다. 결과적으로 데이터가 필터링되어 기계 학습 성능이 향상됩니다. 이제 완전한 문장을 입력하고 출력을 확인해 보겠습니다.

from nltk.stem import PorterStemmer
from nltk.tokenize import sent_tokenize, word_tokenize
sentence="Hello Guru99, You have to build a very good site and I love visiting your site."
words = word_tokenize(sentence)
ps = PorterStemmer()
for w in words:
	rootWord=ps.stem(w)
	print(rootWord)

출력:

hello
guru99
,
you
have
build
a
veri
good
site
and
I
love
visit
your
site

Code 설명 :

  • PorterStemmer 패키지는 stem 모듈에서 임포트됩니다.
  • 문장 및 단어 토큰화를 위한 패키지가 임포트됩니다.
  • 다음 단계에서 토큰화할 문장이 작성됩니다.
  • PorterStemmer용 개체가 여기에서 생성됩니다.
  • 반복문이 실행되고, 코드 5번째 줄에서 생성된 객체를 사용하여 각 단어의 어간 추출이 수행됩니다.

간단히 말해, 어간 추출은 데이터 전처리 모듈입니다. 영어에는 하나의 단어에 여러 변형이 존재하여 머신러닝 학습 및 예측에 모호성을 초래합니다. 성공적인 모델을 구축하려면 어간 추출을 통해 이러한 단어들을 동일한 순차적 데이터로 걸러내는 것이 필수적입니다. 이를 정규화라고도 합니다.

표절화란 무엇입니까?

정리 NLTK에서 어근 추출(Lemmatization)은 단어의 의미와 문맥에 따라 단어의 어근(lemma)을 찾는 알고리즘적 과정입니다. 어근 추출은 일반적으로 단어의 형태론적 분석을 의미하며, 굴절 어미를 제거하는 것을 목표로 합니다. 이를 통해 단어의 기본형 또는 사전 형태인 어근을 얻을 수 있습니다. NLTK의 어근 추출 방법은 WordNet의 내장 형태소자(morph) 함수를 기반으로 합니다. 텍스트 전처리에는 어간 추출(stemming)과 어근 추출이 모두 포함됩니다. 많은 사람들이 이 두 용어를 혼동하고 같은 것으로 생각하지만, 둘 사이에는 분명한 차이가 있습니다. 어근 추출이 어간 추출보다 선호되는 이유는 다음과 같습니다.

Lemmatization이 형태소 분석보다 나은 이유는 무엇입니까?

어간 추출 알고리즘은 단어에서 접미사를 잘라내는 방식으로 작동합니다. 더 넓은 의미로는 단어의 시작 부분이나 끝 부분을 잘라내는 것입니다. 반면에 표제어 추출은 더 강력한 연산으로, 단어의 형태론적 분석을 고려합니다. 표제어 추출은 모든 활용형의 기본 형태인 표제어를 반환합니다. 사전을 만들고 단어의 적절한 형태를 찾는 데에는 심도 있는 언어학적 지식이 필요합니다. 어간 추출은 일반적인 연산인 반면, 표제어 추출은 사전에서 적절한 형태를 찾아보는 지능적인 연산입니다. 따라서 표제어 추출은 더 나은 사전을 만드는 데 도움이 됩니다. 기계 학습 기능을 제공합니다.

Code 표제어 추출과 어간 추출을 구분하기 위해

줄기 Code:

import nltk
from nltk.stem.porter import PorterStemmer
porter_stemmer  = PorterStemmer()
text = "studies studying cries cry"
tokenization = nltk.word_tokenize(text)
for w in tokenization:
print("Stemming for {} is {}".format(w,porter_stemmer.stem(w)))

출력:

Stemming for studies is studi
Stemming for studying is studi
Stemming for cries is cri
Stemming for cry is cri

정리 Code:

import nltk
	from nltk.stem import 	WordNetLemmatizer
	wordnet_lemmatizer = WordNetLemmatizer()
	text = "studies studying cries cry"
	tokenization = nltk.word_tokenize(text)
	 for w in tokenization:
		print("Lemma for {} is {}".format(w, wordnet_lemmatizer.lemmatize(w)))

출력:

Lemma for studies is study
Lemma for studying is studying
Lemma for cries is cry
Lemma for cry is cry

출력에 대한 논의

studies와 studying의 어간 추출 결과를 비교해 보면 출력값은 동일하게 studi이지만, NLTK 어근 추출기는 두 토큰에 대해 각각 다른 어근을 생성합니다. studies에는 study를, studying에는 studying을 생성하는 것이죠. 따라서 기계 학습을 위한 특징 집합을 만들 때, 어근 추출 방식이 우선시된다면 좋을 것입니다.

Lemmatizer 사용 사례

어근 추출기는 텍스트의 모호성을 최소화합니다. bicycle이나 bicycles와 같은 단어는 기본 단어인 bicycle로 변환됩니다. 의미는 같지만 표현 방식이 다른 모든 단어를 기본형으로 변환하여 단어 밀도를 낮추고 모호성을 줄입니다.ping 머신 러닝 모델 학습을 위한 정확한 특징을 준비하세요. 데이터가 깨끗할수록 머신 러닝 모델의 정확도가 높아집니다. NLTK Lemmatizer는 메모리와 계산 비용도 절감해 줍니다.

WordNet 어근 추출 및 품사 태깅을 활용한 실시간 예시 Python:

from nltk.corpus import wordnet as wn
	from nltk.stem.wordnet import WordNetLemmatizer
	from nltk import word_tokenize, pos_tag
	from collections import defaultdict
	tag_map = defaultdict(lambda : wn.NOUN)
	tag_map['J'] = wn.ADJ
	tag_map['V'] = wn.VERB
	tag_map['R'] = wn.ADV
	text = "guru99 is a totally new kind of learning experience."
	tokens = word_tokenize(text)
	lemma_function = WordNetLemmatizer()
	for token, tag in pos_tag(tokens):
		lemma = lemma_function.lemmatize(token, tag_map[tag[0]])
		print(token, "=>", lemma)

출력:

guru99 => guru99
is => be
totally => totally
new => new
kind => kind
of => of
learning => learn
experience => experience
. => .

Code 설명 :

  • 말뭉치 판독기인 wordnet을 가져오고, wordnet에서 WordNetLemmatizer를 가져옵니다.
  • 단어 토큰화 및 품사 태그는 nltk에서 가져오고, 기본 사전은 컬렉션에서 가져옵니다.
  • pos_tag의 첫 글자를 키로 하고, 워드넷 사전의 값에 매핑하는 사전을 생성합니다.
  • 텍스트가 작성되고 토큰화되며, 루프 내부에서 사용할 lemma_function 객체가 생성됩니다.
  • 반복문이 실행되고, lemmatize 함수는 토큰과 맵이라는 두 개의 인수를 받습니다.ping pos_tag의 wordnet 값입니다.

Python 표제어 추출은 다음과 밀접한 관련이 있습니다. WordNet 사전그러므로 다음에는 그 주제를 공부하는 것이 필수적입니다.

자주 묻는 질문

Porter Stemmer는 NLTK의 PorterStemmer 클래스입니다. 접미사 제거 기능을 적용합니다.ping 마틴 포터가 1980년에 개발한 영어 단어 어간 축소 알고리즘의 규칙에 따라 "waiting", "waited", "waits"는 모두 "wait"가 됩니다.

검색 색인 생성, 대규모 감정 분석 또는 특징 축소와 같이 가독성보다 속도와 단순성이 더 중요한 경우에는 어간 추출을 사용하십시오. 출력 결과가 유효하고 사람이 읽을 수 있는 단어여야 하는 경우에는 표제어 추출을 선택하십시오.

텍스트 정규화는 단어의 다양한 형태를 하나의 공통된 표현으로 변환합니다. 어간 추출과 표제어 추출은 단어 밀도를 줄여 모델이 "study"와 "studies"와 같은 변형을 단일 특징으로 처리할 수 있도록 하는 두 가지 정규화 기법입니다.

NLTK는 어간 추출을 위해 PorterStemmer(및 Snowball과 같은 다른 어간 추출기)를, 어근 추출을 위해 WordNetLemmatizer를 제공합니다. 어근 추출기는 WordNet 사전을 사용하여 각 단어의 정확한 기본형을 반환합니다.

이러한 알고리즘은 중복되는 단어 변형을 제거하여 머신 러닝 모델이 더 깔끔하고 차원이 낮은 특징을 인식하도록 합니다. 중복 토큰이 적을수록 학습 과정에서 모호성이 줄어들고, 학습하지 않은 텍스트에 대한 예측 정확도가 높아집니다.

최신 AI 모델은 문맥을 자동으로 추론하지만, NLTK의 WordNetLemmatizer는 의미를 명확히 구분하기 위해 품사 태그가 필요합니다. 품사 태그를 제공하면 예를 들어 동사로 태그된 경우 "learning"을 "learn"으로 바꾸는 것처럼 적절한 어근을 선택할 수 있습니다.

단어는 어근에 따라 명사 또는 동사가 될 수 있습니다. 품사 태그가 없으면 WordNetLemmatizer는 이를 명사로 간주합니다. 동사 또는 형용사와 같은 올바른 태그를 전달하면 적절한 기본형을 제공합니다.

아니요. 어간 추출은 접미사만 잘라내기 때문에 "studies"는 "studi"가 되고 "cries"는 "cri"가 되는데, 이는 유효한 사전 단어가 아닙니다. 반면 표제어 추출은 "study"처럼 항상 실제 사전 단어를 반환합니다.

이 게시물을 요약하면 다음과 같습니다.