인공지능/머신러닝

머신러닝 연습 ① - 영화평 긍정/부정 리뷰 예측

해피밀세트 2020. 5. 14. 20:26
반응형

 

 

 

1. 네이버 영화평 크롤링 및 긍정/부정 평가 나누기 (레미제라블) - R 사용

 

https://truman.tistory.com/163?category=853967

 

R - 크롤링 연습 ②

1. 영화 평점을 기준으로 긍정/부정 리뷰 분석 (레미제라블) # 평점, 리뷰, 작성자, 작성날짜 뽑기 text <- c() p <- c() name <- c() time <- c() for(i in 1:10){ html <- read_html(iconv(paste0("https://mov..

truman.tistory.com

 

 

 

2. 긍정/부정 평가 텍스트 파일로 저장하기 - R 사

 

# 긍정/부정 평가 데이터프레임으로 만들기

df_po <- data.frame(po)

df_ne <- data.frame(ne)

 

# 컬럼 이름 지정
# 긍정/부정 평에 라벨 달아주기

colnames(df_po) <- c('text')
df_po$label <- c('긍정')
df_pocolnames(df_po)

 

colnames(df_ne) <- c('text')

df_ne$label <- c('부정')

df_necolnames(df_ne)

# 데이터프레임 합치기

movie_ham <- rbind(df_po,df_ne)
str(movie_ham)

# 텍스트 파일로 저장하기

write.table(movie_ham, "C:/data/movie_ham.txt", sep = ",",
               row.names = F, quote = T, append = T,
               na = "NA")

 

 

 

 

3. nltk를 사용해서 새로운 영화평 긍정/부정 예측 - 파이썬 사용

 

# 데이터 불러오기

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

                   encoding="CP949")

data.info()

# 컬럼 이름 변경

data.columns = ['feature','label']
data.columns
# 데이터 모양 바꾸기

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()

# 단어들만 뽑기

from konlpy.tag import Okt
pos_tagger = Okt()

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]]

def term_exists(doc):
    return {word:(word in set(doc)) for word in tokens}

# 있으면 True 없으면 False

train_x = [(term_exists(x),y) for x,y in train_doc]

 

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)

 

반응형