728x90
어간 추출(Stemming), 표제어 추출(Lemmatization)은 코퍼스에서 단어의 개수를 줄이는 기법이다.
이 둘의 결과가 어떻게 다른지 한 번 살펴보자.

 

 

1. 어간 추출(Stemming)

: 단어에서 실질적인 의미를 지닌 부분을 추출하는 것으로 접사나 어미를 제거하여 어간 또는 어근을 추출한다.

 

*어간과 어근(표준국어대사전)

어간
: 활용어가 활용할 때에 변하지 않는 부분. ‘보다’, ‘보니’, ‘보고’에서 ‘보-’와 ‘먹다’, ‘먹니’, ‘먹고’에서 ‘먹-’ 따위이다.
어근
: 단어를 분석할 때, 실질적 의미를 나타내는 중심이 되는 부분. ‘덮개’의 ‘덮-’, ‘어른스럽다’의 ‘어른’ 따위이다.

 

NLTK(Natural Language Toolkit) 라이브러리에서 제공하는 PorterStemmer 클래스를 이용하여 어간 추출을 수행한다. 예시 문장을 단어로 분리한 후 stemmer.stem(word) 메서드를 이용하여 단어의 어간을 추출한다. 추출된 어간을 다시 문장으로 합쳐 출력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from nltk.stem import PorterStemmer
 
# 어간 추출을 위한 객체 생성
stemmer = PorterStemmer()
 
# 예시 문장
sentence = "I am loving natural language processing"
 
# 문장을 단어로 분리
words = sentence.split()
 
# 어간 추출
stemmed_words = [stemmer.stem(word) for word in words]
 
# 결과 출력
print(" ".join(stemmed_words))
cs

 

문장에서 단어를 추출한 후 각 단어의 어간을 추출하여 공백을 구분자로 하여 다시 하나의 문장으로 만든다.

결과는 다음과 같이 출력된다.

I am love natur languag process

문장에서 "loving"은 "love"로, "processing"은 "process"로 어간이 추출된다. 이렇게 어간 추출을 통해 단어의 형태를 일정하게 만들어 텍스트 데이터를 효과적으로 처리할 수 있다.

 

 

2. 표제어 추출

: 표제어 추출은 단어의 원형을 찾는 것이다. Python의 NLTK(Natural Language Toolkit)을 사용한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import nltk
nltk.download('omw-1.4'# 데이터 다운로드
 
from nltk.stem import WordNetLemmatizer
 
# 표제어 추출 함수
def lemmatize_text(text):
    lemmatizer = WordNetLemmatizer()
    # 토큰화
    tokens = nltk.word_tokenize(text)
    # 각 토큰에 대해 표제어 추출 수행
    lemmatized_tokens = [lemmatizer.lemmatize(token) for token in tokens]
    # 추출된 표제어를 다시 문자열로 결합하여 반환
    return ' '.join(lemmatized_tokens)
 
# 예시 텍스트
text = "The quick brown foxes jumped over the lazy dogs"
# 표제어 추출 수행
lemmatized_text = lemmatize_text(text)
# 결과 출력
print(lemmatized_text)
cs

 

입력된 텍스트를 토큰화하여 각 토큰에 대해 표제어 추출을 수행한다.

추출된 표제어를 다시 문자열로 결합하여 반화하는 함수 'lemmatize_text'를 정의하였다.

결과는 다음과 같다.

The quick brown fox jumped over the lazy dog

 기존의 문장은 "The quick brown foxes jumped over the lazy dogs"로 복수형이 단수형으로 바뀌어 표제어가 추출된 것을 알 수 있다.

그렇다면 왜 "jumped"는 "jump"로 추출되지 않았을까?

 

"jumped"는 과거형 동사이다. 표제어 추출은 기본적으로 단어의 원형을 찾는 것이기 때문에 "jumped" 대신 원형인 "jump"를 추출해야 한다. 그러나 위의 코드에서는 단어의 품사를 고려하지 않고 단순히 WordNetLemmatizer를 사용하여 표제어 추출을 수행하였다.

따라서, 품사 정보를 고려하여 표제어 추출을 수행하려면 nltk.pos_tag() 함수를 사용하여 각 토큰의 품사를 식별한 후, 해당 품사 정보를 함께 WordNetLemmatizer에 전달한다. 예를 들어, "jumped"를 포함한 문장에 대해 품사 정보를 고려하여 코드를 작성하면 다음과 같다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import nltk
nltk.download('wordnet'# WordNet 다운로드
nltk.download('averaged_perceptron_tagger'# 품사 태깅 모듈 다운로드
 
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet
 
# WordNet 품사 태그와 WordNetLemmatizer 품사 태그 간 매핑
tag_map = {
    'N': wordnet.NOUN,
    'V': wordnet.VERB,
    'R': wordnet.ADV,
    'J': wordnet.ADJ
}
 
# 표제어 추출 함수
def lemmatize_text(text):
    lemmatizer = WordNetLemmatizer()
    # 토큰화
    tokens = nltk.word_tokenize(text)
    # 각 토큰에 대해 표제어 추출 수행
    lemmatized_tokens = []
    for token, tag in nltk.pos_tag(tokens):
        # 토큰의 품사 태그를 WordNet 품사 태그로 변환
        wn_tag = tag_map.get(tag[0].upper(), wordnet.NOUN)
        # 변환된 품사 태그와 함께 표제어 추출 수행
        lemmatized_token = lemmatizer.lemmatize(token, wn_tag)
        lemmatized_tokens.append(lemmatized_token)
    # 추출된 표제어를 다시 문자열로 결합하여 반환
    return ' '.join(lemmatized_tokens)
 
# 예시 텍스트
text = "The quick brown foxes jumped over the lazy dogs"
# 표제어 추출 수행
lemmatized_text = lemmatize_text(text)
# 결과 출력
print(lemmatized_text)
 
cs

 

위 코드에서는 nltk.pos_tag() 함수를 사용하여 토큰화된 각 단어의 품사를 식별하고, tag_map 딕셔너리를 사용하여 해당 품사 태그를 WordNet 품사 태그로 변환한다.
그리고 변환된 품사 태그와 함께 WordNetLemmatizer를 사용하여 표제어 추출을 수행한다. 이때, lemmatize() 함수에 전달하는 품사 태그는 WordNet에서 정의된 품사 태그를 사용해야 한다.

위 코드에서는 tag_map 딕셔너리를 사용하여 nltk.pos_tag() 함수에서 반환된 품사 태그를 WordNet 품사 태그로 변환했다. 예를 들어, "jumped"는 nltk.pos_tag() 함수에서 "VBD"로 식별된다. "VBD"는 과거형 동사를 나타내는 품사 태그이며, tag_map 딕셔너리에서는 "V"를 키로 사용하고 해당 값으로 wordnet.VERB를 사용한다. 따라서 "jumped"에 대한 표제어 추출을 수행할 때는 WordNetLemmatizer에 "jump"와 wordnet.VERB를 전달하여 "jump"를 추출할 수 있다.

위 코드를 실행하면 다음과 같은 결과가 출력된다.

The quick brown fox jump over the lazy dog

이번엔 "jumped"가 품사 정보를 고려하여 단어의 원형인 동사 "jump"로 변환된 것을 알 수 있다.


어간 추출과 표제어 추출이 사용되는 여러 가지 Task


어간 추출:
- 정보 검색: 검색 엔진이나 텍스트 분석 시스템에서 단어의 다양한 형태를 하나의 어간으로 통일하여 검색과 분석이 가능하다.
- 텍스트 분류: 단어의 다양한 형태를 고려하지 않고 어간만 고려하여 텍스트 분류할 때 사용될 수 있다.
- 단어 빈도 계산: 어간 추출을 통해 동일한 어간을 가지는 단어들의 빈도를 계산할 수 있다.

표제어 추출:
- 문서 요약: 문서를 요약할 때, 단어들을 원형으로 변환하여 의미를 유지하면서 문서 요약의 일관성을 높일 수 있다.
- 문서 클러스터링: 비슷한 의미를 가지는 단어들을 표제어로 변환하여 문서들을 그룹화하거나 클러스터링할 때 사용될 수 있다.
- 자연어 이해: 자연어 처리 작업에서 단어들을 원형으로 변환하여 텍스트를 이해하고 처리하는데 활용된다.

 

 

728x90

+ Recent posts