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'
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) 제로베이스 데이터스쿨 강의자료