인공지능/머신러닝

NLTK 자연어 처리 패키지 사용

해피밀세트 2020. 5. 14. 19:40

 

 

1. nltk.NaiveBayesClassifier + show_most_informative_features()

 

# nltk 패키지 다운 (오래 걸리니까 punkt만 다운)
# 필요한 라이브러리 불러오기

nltk.download('punkt')
import nltk
from nltk.tokenize import word_tokenize
from konlpy.tag import Okt
pos_tagger = Okt()

 

# train 데이터셋

train = [('
홍길동은 좋아', '긍정'),
('강아지는 무지 좋아', '긍정'),
('수업이 재미없어', '부정'),
('홍길동은 이쁜 강아지야', '긍정'),
('난 수업 마치고 홍길동이랑 놀거야', '긍정'),
('오늘 하루는 너무 짜증스러운 날이야', '부정'),
('하루가 너무 짜증스러운 날이야', '부정'),
('날이 맑아서 좋아', '긍정'),
('오늘 지하철에 사람이 너무 많아서 짜증이 난다', '부정'),
('지하철에서 질서는 너무 없어 짜증이 난다', '부정'),
('비가 오니 짜증난다', '부정'),
('친구가 짜증낸다', '부정'),
('하늘이 맑아서 행복하다', '긍정'),
('공기가 맑아서 좋다', '긍정'),
('밝게 인사해주니 행복하다', '긍정')]

# word_tokenize() : 단어 분류 예시

word_tokenize("강사님 이집트 언제 가실래요?")

[word for sentence in train

 for word in word_tokenize(sentence[0])]

# 중복제거

allword = set(word for sentence in train

              for word in word_tokenize(sentence[0]))

# allword가 사전의 역할
# 사전에 문장에 있는 단어가 있으면 True, 없으면 False

t = [({word : (word in word_tokenize(x[0]))

                for word in allword},x[1]) for x in train]

# '너무' 없을때 긍정과 부정의 비율

model = nltk.NaiveBayesClassifier.train(t)

model.show_most_informative_features()

 


 

2. 일반 텍스트 형식을 사용할때

 

# 데이터 불러들여와서 [(,),(,),...]모습 만들기

data = pd.read_csv("C:/data/bulletin_board.txt",header=None,

                   encoding="CP949")

data.columns = ['feature','label']

data['label'] = data['label'].str.strip()

# 데이터프레임을 리스트처럼 반복해서 한줄씩 읽을 수 있게 하는 메소드

train = [(feature,label) for index,(feature,label) in data.iterrows()]

# train 단어로 사전 만들기

allword = set(word for sentence in train

              for word in word_tokenize(sentence[0]))

# 사전에 문장에 있는 단어가 있으면 True, 없으면 False

t = [({word : (word in word_tokenize(x[0]))

                for word in allword},x[1]) for x in train]

# 모델의 단어별 긍정 부정 확률 확인

model = nltk.NaiveBayesClassifier.train(t)
model.show_most_informative_features()

# 테스트

test = "난 수업을 마치면 홍길동이랑 놀거야"

test_t = {word : (word in word_tokenize(test))

                for word in allword}

model.classify(test_t)

<Okt 종류>

test = "난 수업을 마치면 홍길동이랑 놀아도 되나욬"

from konlpy.tag import Okt

pos_tagger = Okt()

# stem : 원형글자로 만드는것("되나욬ㅋㅋ" -> "되나요")

pos_tagger.pos(test, norm=True, stem=True)

# nouns() : 명사 추출

pos_tagger.nouns(test)


# morphs() :
형태소 추출

pos_tagger.morphs(test)

# 글자와 형태소 같이 붙이기(구분자 : /)

def tokenize(doc):

    return ['/'.join(i) for i in

            pos_tagger.pos(doc, norm=True, stem=True)]

 

train_doc = [(tokenize(i[0]),i[1])for i in train]

train_doc

# 긍정,부정을 뺀 부분만 뽑아내기

tokens = [t for i in train_doc for t in i[0]]

# 있으면 True 없으면 False

def term_exists(doc):
    return {word:(word in set(doc)) for word in tokens}
train_x = [(term_exists(x),y) for x,y in train_doc]
train_x 

# '너무' 없을때 긍정과 부정의 비율

model = nltk.NaiveBayesClassifier.train(train_x)
model.show_most_informative_features()

# 테스트 데이터 만들기
test = [("홍길동이랑 놀거야")]
test_doc = tokenize(test[0])

# 테스트 해보기
test_f = {word:(word in tokens) for word in test_doc}
model.classify(test_f)

 

반응형