신의 책상 위에는 이런 글이 쓰여 있다. ‘네가 만일 불행하다는 말을 하고 다닌다면 불행이 정말 어떤 것인지 보여주겠다.’ ‘네가 만일 행복하다는 말을 하고 다닌다면 행복이 정말 어떤 것인지 보여주겠다.’ - 버니 S. 시겔
텍사스 대학교 제임스 페너베커 교수는 개인 블로그 3만 5천개와 학생들 에세이 1만 5천개를 분석해서 부정적인 단어들을 많이 사용하는 이들은 질병이나 외로움, 신경증이나 우울증에 시달릴 가능성이 더 높다는 사실을 발견했습니다. 반면 긍정적인 단어를 다채롭게 구사하는 이들은 직장 생활 뿐 아니라, 여가 활동에서도 더 성실하고 적극적이고 몸도 더 건강했다고 합니다.
ratings_test.txt: 50K reviews held out for testing
ratings_train.txt: 150K reviews for training
각 파일에 있는 Column 은 <영화 아이디, 영화 평, 영화 평점> 입니다.
위의 세개의 파일을 raw형태로 다운로드 합니다.
Onebook 가상환경 하단에 NLP라는 폴더를 만들고 다운받은 파일을 이동합니다. "NaverMovieWord2Vec.py" 파이썬 파일을 새로 만들고 프로그래밍을 시작하겠습니다.
일단 저장된 파일을 csv를 사용해서 읽겠습니다. CSV란 Comma-separated values의 약자로서 CSV 파일은 각 라인의 컬럼들이 콤마로 분리된 텍스트 파일 포맷입니다. CSV 파일을 읽기 위해서는 먼저 파이썬에 기본 내장된 csv 모듈을 import 합니다. 다음 .csv 파일을 오픈하고 파일객체를 csv.reader(파일객체) 에 넣으면 됩니다. csv.reader() 함수는 Iterator 타입인 reader 객체를 리턴하므로 for 루프를 돌며 한 라인씩 가져올 수 있습니다. CSV 파일과 비슷하지만, 콤마 대신 Tab으로 컬럼을 분리하는 파일포맷을 TSV 파일이라 합니다. TSV 파일은 컬럼 delimiter만 차이가 나므로, csv 모듈의 reader() 혹은 writer() 함수에서 delimiter='\t' 옵션만 지정해 주면 나머지는 CSV와 동일합니다. Naver sentiment movie corpus는 탭으로 구분되어 있으므로 TSV를 읽는 방식으로 읽습니다.
여기에서 “Josa”, “Eomi”, “'Punctuation”는 제외하고 처리해야 합니다. 전체 소스는 다음과 같습니다.
import csv
from konlpy.tag import Okt
from gensim.models import word2vec
#네이버 영화 코퍼스를 읽는다.
f = open('ratings_train.txt', 'r', encoding='utf-8')
rdr = csv.reader(f, delimiter='\t')
rdw = list(rdr)
f.close()
#트위터 형태소 분석기를 로드한다. Twiter가 KoNLPy v0.4.5 부터 Okt로 변경 되었다.
twitter = Okt()
#텍스트를 한줄씩 처리합니다.
result = []
for line in rdw:
#형태소 분석하기, 단어 기본형 사용
malist = twitter.pos( line[1], norm=True, stem=True)
r = []
for word in malist:
#Josa”, “Eomi”, “'Punctuation” 는 제외하고 처리
if not word[1] in ["Josa","Eomi","Punctuation"]:
r.append(word[0])
#형태소 사이에 공백 " " 을 넣습니다. 그리고 양쪽 공백을 지웁니다.
rl = (" ".join(r)).strip()
result.append(rl)
#print(rl)
#형태소들을 별도의 파일로 저장 합니다.
with open("NaverMovie.nlp",'w', encoding='utf-8') as fp:
fp.write("\n".join(result))
#Word2Vec 모델 만들기
wData = word2vec.LineSentence("NaverMovie.nlp")
wModel =word2vec.Word2Vec(wData, size=200, window=10, hs=1, min_count=2, sg=1)
wModel.save("NaverMovie.model")
print("Word2Vec Modeling finished")
위의 코드를 실행하면 종료 할 때까지 많은 시간이 걸립니다. 결과는 NaverMovie.model 파일입니다. 어미, 조사, 구두점을 제외하고 동사와 형용사는 기본형으로 학습하도록 입력 텍스트를 만들었습니다. 공백으로 구분된 텍스트 파일을 Word2Vec에 전달하고 생성된 모델을 save()로 저장했습니다.
이제 위에서 생성한 모델을 사용하여 단어 유사도를 확인해 보겠습니다.
다시 NaverMovieModelTest.py 라는 파일을 만들어 다음의 코드를 입력 해 봅니다.
from gensim.models import word2vec
model = word2vec.Word2Vec.load("NaverMovie.model")
print(model.most_similar(positive=["재미"]))
print(model.most_similar(positive=["최고"]))
불화의 주범, 목소리. 귀엽고 예쁘다는 이야기를 목소리 톤을 높여 소리 지르듯 했을 때, 아기는 입을 삐죽거리며 칭얼대기 시작할 것이고 강아지는 슬금슬금 당신을 피해 달아날 것이다. 아기나 강아지는 말하는 내용이 무엇인지 전혀 알아듣지 못한다. 그러나 그 말을 전하는 목소리에서 말하는 사람의 감정을 느끼고 두려움을 갖는 것이다.
- 아놀드 베넷의《변화의 즐거움》중에서 -
* 말을 할 때는 단어의 선택도 중요하지만 말투와 목소리도 정말 중요한 것 같아요. 무심코 던진 돌에 개구리는 맞아 죽는다는 속담처럼 나의 불화에서 튕겨 나온 목소리가 누군가에게 돌이 되지 않도록 말을 하기 전 잠시 생각하는, 한숨 쉬는 습관을 가져야겠습니다.
남편은 내게도 선생님이 되었다. 출근할 적마다 숙제를 내주기 시작한 것이다. 이를테면 사자성어 같은 것, 또는 어려운 단어 같은 것. 그럼 난 살림하는 사이사이 열심히 외우고 쓰고 익혔다. 공부 때문에 혼이 났다거나 야단이 났다거나 한 적은 없다. 지금 내가 국한문 혼용이 자유자재인 건 다 남편 덕이다. 뿐만 아니다. 자식들에게 늘 책을 한 아름씩 안겨주면서 동시에 내게도 소설책을 많이 갖다 주었다.
- 서동필의《남의 눈에 꽃이 되어라》중에서 -
* '남편이 선생님이었다'는 아내의 고백, 많은 것이 눈에 보이듯 그려집니다. 남편 앞에서 우등생처럼 좋은 학생이 되어주었던 그 아내는 아마도 그 자식들에게 더없이 훌륭한 선생님이 되었을 것입니다. 자식들에게 한 아름씩 책을 안겨주면서 '남의 눈에 꽃이 되라'는 말을 전해주는 '선생님'의 모습이 큰 바위 얼굴로 다가옵니다.