하루 하루

POS Tagging 본문

IT/Artificial intelligence

POS Tagging

san_deul 2020. 4. 30. 21:52

Time Flies like an arrow

Fruit flies like an banana 

두 문장에서 Flies의 품사는 다른데, 품사 정보가 제대로 명시 되지 않는다면 해석 상에 문제가 생기게 된다.

Tagging

위와 같은 중의적인 문제를 해결하기 위해서 말뭉치에 붙이는 부가적인 언어 정보를 tag라고,

tag를 원시 말뭉치에 붙이는 것을 Tagging이라 한다. 

그리고, 이러한 Tagging을 수행하는 프로그램을 Tagger 라고 하고, 

태그가 부착된 말뭉치를 Tagged corpus라 한다. 

 

<일반적인 텍스트 마이닝 과정 >

1. raw text -> sentence segmentation -> sentence

2. sentence -> tokenization -> tokenized sentence

3. tokenized sentence -> part of  speech tagging -> pos-tagged sentence

4. pos-tagged sentence-> entity detection -> chunked sentence

5. chunked sentence -> relation detection -> relations

Using a Tagger

Tagged Corpora

str2tuple( ) 메소드 

-> '단어 / 품사' 형태를 ('단어','품사') 형태로 바꿀 수 있도록 해준다. 

 

brown.tagged_words()

-> brown의 단어와 tag가 튜플 형태로 반환된다.

 

universal tag set

https://universaldependencies.org/u/pos/

Mapping Words to Properties Using Python Dictionaries

defaultdict 

-> 기본값을 지정한 딕셔너리

원래의 딕셔너리의 경우 dict[key]에서 key 가 미리 정의되어 있지 않으면 오류가 발생하지만

defaultdict을 사용하면 미리 삽입하지 않아도 dict[key]를 하였을 때 default 값으로 초기화 된다.

 

# news 카테고리에서 tagset을 universal로 해서 Tagging을 하면서 

각 품사에 해당하는 단어 수를 count 한다.

# 품사 등장 횟수 기준으로 내림차순으로 정렬한다.

Automatic Tagging

NLTK 

- DefaultTagger : 전체를 하나의 품사로 Tagging 

- RegexpTagger :  tagging에 regular expression을 사용 

- UnigramTagger:  통계 알고리즘 기반 

- BigramTagger , TrigramTagger

 

- tag( ) 

- evaluate( ) 

 

- backoffTagger 

N-Gram Tagging

UnigramTagger는 LookupTagger 처럼 행동하지만, Trainning이 가능하다

더보기
from nltk.corpus import brown
brown_tagged_sents = brown.tagged_sents(categories='news')
unigram_tagger1 = nltk.UnigramTagger(brown_tagged_sents)
print ( 'Unigram_tagger : ',unigram_tagger1.evaluate(brown_tagged_sents)*100,"%")
bigram_tagger1 = nltk.BigramTagger(brown_tagged_sents)
print ( 'Bigram_tagger',bigram_tagger1.evaluate(brown_tagged_sents)*100,'%')

# Separating the Training and Testing Data
size = int(len(brown_tagged_sents) * 0.9)
train_sents = brown_tagged_sents[:size]
test_sents = brown_tagged_sents[size:]
print ( '\nSeparate the Training and Testing Data\n')

# evaluate
unigram_tagger2 = nltk.UnigramTagger(train_sents)
print ( 'Unigram_tagger : ',unigram_tagger2.evaluate(test_sents)*100,"%")

# bigram_tagger
bigram_tagger2 = nltk.BigramTagger(train_sents)
print ( 'Bigram_tagger',bigram_tagger2.evaluate(test_sents)*100,'%')

tagger를 Training를 하는 것은 많은 시간이 걸리는 일이기 때문에 우리가 필요할 때마다 매번 새로 Training 하기 보다는 파일에 저장해서 다시 사용하는 것이 좋다.

더보기

태거 t2 를 파일 t2.pkl 에 저장

from pickle import dump
output = open('t2.pkl', 'wb')
dump(t2, output, -1)
output.close()

태거 t2를 다시 load

from pickle import load
input = open('t2.pkl', 'rb')
tagger = load(input)
input.close()

sparse data problem

- 데이터가 커질수록 문맥의 특수성이 증가하면서 Training set 에 존재하지 않았던 문맥이 존재하는 경우

 

이를 해결하기 위해서 정확성이 높은 알고리즘에서 Coverage가 높은 알고리즘으로 나아가면서 남는 것들을 tagging 한다.

 

1.  bigram tagger으로 태깅을 한다.

2. 만약 bigram tagge tag를 찾지 못하면 unigram tagger를 사용한다.

3. 만약 unigram tagger  tag를 찾지 못하면 default tagger를 사용한다.

 

Transformation-Based Tagging

Bril  Tagger 

-> Tag를 예측한 다음 틀렸을 경우 다시 오류를 고쳐나가는 Tagger 

 

 

Comments