형태소 분석 및 Lemmatization Python 예제가 포함된 NLTK
⚡ 스마트 요약
어간 추출과 표제어 추출은 텍스트 정규화 기법입니다. 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 사전그러므로 다음에는 그 주제를 공부하는 것이 필수적입니다.
