자연어처리(나이브베이즈)

yeoni·2023년 6월 16일
0

머신러닝

목록 보기
24/40

나이브베이즈 분류

  • naive bayes classifier, 나이브 베이즈 분류기는 지도학습

1. 영어

import nltk
from nltk.tokenize import word_tokenize

train = [
    ('i like you', 'pos'),
    ('i hate you', 'neg'),
    ('you like me', 'neg'),
    ('i like her', 'pos')
]

# 전체 말 뭉치로 만들기: word_tokenize 띄어쓰기로 분리 -> set으로 묶기
all_words = set(word.lower() for sentence in train for word in word_tokenize(sentence[0]))

# 말 뭉치 대비해서 단어가 있고 없음을 True, False로 표기
t = [({word: (word in word_tokenize(x[0])) for word in all_words}, x[1]) for x in train]

#각 단어별로 독립적으로 확률을 계산
classifier = nltk.NaiveBayesClassifier.train(t)

# 예시) like가 있을 때, Positive할 확률이 1.7:1.0
classifier.show_most_informative_features() 

test_sentence = 'i like MeRui'
test_sent_features = {
    word.lower(): (word in word_tokenize(test_sentence.lower())) for word in all_words
}

classifier.classify(test_sent_features) # 'pos'

2. 한글

  • 형태소 분석이 필수!
import nltk
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt

pos_tagger= Okt()

train = [
    ('메리가 좋아', 'pos'),
    ('고양이도 좋아', 'pos'),
    ('난 수업이 지루해', 'neg'),
    ('메리는 이쁜 고양이야', 'pos'),
    ('난 마치고 메리랑 놀거야', 'pos')
]

# 형태소 분석을 한 후 품사를 단어 뒤에 붙여 넣도록
def tokenize(doc): 
    return ["/".join(t) for t in pos_tagger.pos(doc, norm=True, stem=True)]
train_docs = [(tokenize(row[0]), row[1]) for row in train]

'''
[(['메리/Noun', '가/Josa', '좋다/Adjective'], 'pos'),
 (['고양이/Noun', '도/Josa', '좋다/Adjective'], 'pos'),
 (['난/Noun', '수업/Noun', '이/Josa', '지루하다/Adjective'], 'neg'),
 (['메리/Noun', '는/Josa', '이쁘다/Adjective', '고양이/Noun', '야/Josa'], 'pos'),
 (['난/Noun', '마치/Noun', '고/Josa', '메리/Noun', '랑/Josa', '놀다/Verb'], 'pos')]
'''

# 말뭉치
tokens = [t for d in train_docs for t in d[0]]

def term_exists(doc):
    return {word: (word in set(doc)) for word in tokens}
    
train_xy = [(term_exists(d), c) for d, c in train_docs]

classifier = nltk.NaiveBayesClassifier.train(train_xy)
test_sentence = [('난 수업이 마치면 메리랑 놀거야')]

# teste도 형태소 분석
test_docs = pos_tagger.pos(test_sentence[0])
classifier.show_most_informative_features()

test_sent_features = {word :  (word in tokens) for word in test_docs}
classifier.classify(test_sent_features) #'pos'

Rerference
1) 제로베이스 데이터스쿨 강의자료

profile
데이터 사이언스 / just do it

0개의 댓글