문장에 사용된 단어의 의미를 제대로 파악하려면 해당 단어가 어떤 품사로 사용되었는지 함께 알아야 합니다. 이를 위해 각 단어가 어떤 품사로 쓰였는지 표시하는 작업이 필요한데요. 해당 작업을 품사 태깅(POS; Part of Speech Tagging)이라고 합니다.
품사 태깅(POS; Part of Speech Tagging)
품사는 문장 안에서 단어가 어떻게 사용되는지에 따라 정해집니다. 따라서 여러 문장으로 이루어진 코퍼스에 품사 태깅을 하려면 먼저 코퍼스를 문장으로 구분하고, 각 문장 별로 단어 토큰화를 한 다음, 단어 토큰들 각각에 품사를 태깅해야 합니다.
코드를 통해 자세히 살펴볼게요. 먼저 전체 코드입니다.
import nltk
import pandas as pd
from nltk.tokenize import word_tokenize
from nltk.tokenize import sent_tokenize
from nltk.tag import pos_tag
nltk.download('averaged_perceptron_tagger')
nltk.download('punkt')
# 품사 태깅(POS; Part Of Speech Tagging)
# 각 단어가 어떤 푼사로 쓰였는지 표시하는 작업
from nltk.tag import pos_tag
text = "Watching Time Chasers, it obvious that it was made by a bunch of friends. Maybe they were sitting around one day in film school and said, \"Hey, let\'s pool our money together and make a really bad movie!\" Or something like that."
pos_tagged_words = []
# 문장 토큰화
# 품사 태깅할 코퍼스를 문장 기준으로 토큰화
tokenized_sents = sent_tokenize(text)
# 토큰화 된 문장등을 순화하며 순차적으로 단어 토큰화와 품사 태깅 작업 진행
for sentence in tokenized_sents:
# 단어 토큰화
tokenized_words = word_tokenize(sentence)
# 품사 태깅
pos_tagged = pos_tag(tokenized_words)
pos_tagged_words.extend(pos_tagged)
print(pos_tagged_words)
한 부분씩 자세히 살펴보겠습니다. 먼저 품사 태깅에 필요한 도구들을 불러옵니다.
from nltk.tag import pos_tag
다음으로 품사 태깅을 할 코퍼스를 문장 기준으로 토큰화할게요.
text = "Watching Time Chasers, it obvious that it was made by a bunch of friends. Maybe they were sitting around one day in film school and said, \"Hey, let\'s pool our money together and make a really bad movie!\" Or something like that."
tokenized_sents = sent_tokenize(text)
토큰화 된 문장들을 순회하면서 순차적으로 단어 토큰화와 품사 태깅 작업을 진행합니다.
for sentence in tokenized_sents:
# 단어 토큰화
tokenized_words = word_tokenize(sentence)
# 품사 태깅
pos_tagged = pos_tag(tokenized_words)
코퍼스를 문장 토큰화 한 다음에 각 문장들을 단어 토큰화 하면 아래와 같이 2차원 리스트 형태로 토큰들이 저장됩니다. 각 문장들이 리스트로 경계가 구분지어진 형태가 되는거죠.
거기에 품사 태깅까지 하면 문장 별 리스트 안에 [(단어, 품사 태그), (단어, 품사 태그), …] 형태로 품사 태깅된 결과가 반환됩니다.
저희는 이후 레슨의 실습에서 분석 단위를 문장이 아니라 코퍼스 전체로 할 것이기 때문에, 리스트로 끊어진 문장의 구분을 없애겠습니다. 혹시 분석을 문장 구분을 지어서 하는게 적절한 상황에서는 해당 과정을 생략해도 괜찮습니다.
pos_tagged_words.extend(pos_tagged_sentence)
결과를 확인해 보겠습니다.
print(pos_tagged_words)
단어 토큰에 품사가 잘 태그되었네요.
Penn Treebank POS Tags
NLTK의 pos_tag() 함수는 Penn Treebank POS Tags를 기준으로 품사를 태깅합니다. Penn Treebank POS Tags는 영어 코퍼스의 품사 정보를 세분화 하여 각 품사에 대응하는 태그를 정리해 둔 것인데요. 각 품사 태그의 의미는 아래와 같습니다.
품사태그 | 품사 | 품사태그 | 품사 |
CC | Coordinating conj. | TO | infinitival to |
CD | Cardinal number | UH | Interjection |
DT | Determiner | VB | Verb, base form |
EX | Existential there | VBD | Verb, past tense |
FW | Foreign word | VBG | Verb, gerund/present pple |
IN | Preposition | VBN | Verb, past participle |
JJ | Adjective | VBP | Verb, non-3rd ps. sg. present |
JJR | Adjective, comparative | VBZ | Verb, 3rd ps. sg. present |
JJS | Adjective, superlative | WDT | Wh-determiner |
LS | List item marker | WP | Wh-pronoun |
MD | Modal | WP$ | Possessive wh-pronoun |
NN | Noun, singular or mass | WRB | Wh-adverb |
NNS | Noun, pluarl | # | Pound sign |
NNP | Proper noun, singular | $ | Dollar sign |
NNPS | Proper noun, plural | . | Sentence-final punctuation |
PDT | Predeterminer | , | Comma |
POS | Possesive ending | : | Colon, semi-colon |
PRP | Personal pronoun | ( | Left bracket character |
PP$ | Possessive pronoun | ) | Right bracket character |
RB | Adverb | " | Straight double quote |
RBR | Adverb, comparative | ‘ | Left open single quote |
RBS | Adverb, superlative | “ | Left op2en double quote |
RP | Particle | ’ | Right close single quote |
SYM | Symbol | ” | Right close double quote |
예를 들어, ('After', 'IN')라고 결과가 나온 것은 After가 전치사(Preposition)로 태그되었다는 뜻입니다. ('The', 'DT')는 The가 관사(Determiner)로 태그되었다는 뜻이죠.
품사 태깅 함수 만들기
이후 분석에서 품사 태깅 과정을 간단하게 사용할 수 있도록 pos_tagger() 함수를 만들어 두겠습니다. pos_tagger()는 문장 토큰화 된 리스트를 파라미터로 받고 품사를 태그하는 함수입니다. 리턴 값으로는 품사가 태그된 단어들이 문장의 경계 없이 저장된 1차원 리스트 pos_tagged_words가 반환됩니다.
from nltk.tokenize import word_tokenize
from nltk.tag import pos_tag
# 품사 태깅 함수
def pos_tagger(tokenized_sents):
pos_tagged_words = []
for sentence in tokenized_sents:
# 단어 토큰화
tokenized_words = word_tokenize(sentence)
# 품사 태깅
pos_tagged = pos_tag(tokenized_words)
pos_tagged_words.extend(pos_tagged)
return pos_tagged_words
만들어진 함수는 preprocess.py에 추가해두고, 이후 포스팅에서 필요할 때마다 불러와서 사용하겠습니다.
'Data Analysis > Natural Language Processing(NLP)' 카테고리의 다른 글
표제어 추출(Lemmatization) (0) | 2023.06.10 |
---|---|
품사 태깅 실습 (0) | 2023.06.10 |
문장 토큰화 실습 (0) | 2023.06.09 |
문장 토큰화(Sentence Tokenization) (0) | 2023.06.09 |
어간 추출 실습 (0) | 2023.06.09 |