하루 하루
POS Tagging 본문
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
'IT > Artificial intelligence' 카테고리의 다른 글
[그림으로 공부하는 머신러닝 알고리즘17 머신러닝 도감] matplotlib를 이용한 그래프 출력_1일차 (0) | 2020.05.14 |
---|---|
인공지능 기술 (0) | 2020.05.05 |
펭귄브로의 3분 딥러닝 파이토치맛_11일차 (0) | 2020.04.27 |
펭귄브로의 3분 딥러닝 파이토치맛_10일차 (0) | 2020.04.26 |
펭귄브로의 3분 딥러닝 파이토치맛_9일차 (0) | 2020.04.26 |