프로젝트/리뷰집 11

[리뷰집] 프로젝트 소개

크롤링 공개가 문제가 될까 하는 걱정에 도메인은 닫아둔 상태입니다. 필요성 이 프로젝트를 만든 사람은 독해력이 약합니다. 기억력도 그다지 좋지 않습니다. 그리고 돈이 많지 않아 무엇이든 하나 살 때 리뷰를 꼼꼼하게 읽어봅니다. 읽다 보면 어느새 모든 리뷰를 읽고 있습니다. 하지만 너무 많은 리뷰를 한 번에 읽었기 때문에 시간은 많이 소비했지만 머릿속에 잘 기억이 남지를 않습니다. 그 제품이 그래서 어떤 특징을 가지고 있는지, 장점은 뭔지, 단점은 뭔지 요약할 수 있어야 하는데 그게 쉽지 않습니다. 그래서 리뷰에서 자주 등장하는 단어를 뽑아내서 해당하는 문장들만 읽고 싶었습니다. 자주 등장하는 단어는 곧 그 제품의 특징을 말해줍니다. 하지만 여기에서 그치지 않고 제품의 장점을 대표하는 단어, 단점을 대표하..

PyKomoran 사용법 정리

PyKomoran github 페이지에 사용법을 확인할 수 있게 링크가 걸려있다. 그런데 링크를 눌러보면 서버가 망가진 건지 도메인 갱신을 안 하신 건지 페이지 오류가 떠서 확인할 수가 없다. PyKomoran 덕분에 프로젝트를 성공적으로 배포할 수 있었기 때문에 PyKomoran 함수들에 대해 정리 해본다. PyKomoran install pip install PyKomoran 대문자, 소문자가 섞여있으니 주의가 필요하다 import from PyKomoran import Komoran, DEFAULT_MODEL 보통은 이 두가지만 import 하면 문제 없이 사용 가능할 것이다. 생성자 komoran = Komoran(DEFAULT_MODEL['LIGHT']) 이와 같이 LIGHT 모델을 사용하는 k..

python 메모리와의 전쟁[종지부] - konlpy를 버리고 PyKomoran을 선택하다

정말 나의 리뷰 프로젝트를 heroku 무료 서버에 올리기 힘들었다. 메모리 개선만을 위해 거의 일주일을 불태웠다. 저장 용량은 단 500MB만 허락되는데 konlpy, django를 비롯해 꼭 필요한 패키지들과 RNN 학습 모델, 토크나이저 등 꼭 필요한 파일들만 heroku에 올렸을 때 497.8MB로 간당간당하게 올라갔었다. 하지만 메모리 제한에 막혔었다. heroku 무료 서버 기준 512MB까지 RAM을 사용할 수 있지만 1024MB까지는 ERROR R14를 띄우면서 허용해준다. worker가 죽지 않는다는 뜻이다. 1024MB를 넘어가면 ERROR R15를 띄우면서 강제 종료된다. 저장 용량부터 거의 500MB였기 때문에 쉽게 worker가 강제 종료됐다. 자연어 처리를 heroku 무료 서버..

OrderedDict의 배신 - not ordered

keras의 tokenizer가 학습을 하고 나면 tokenizer.word_counts()를 사용하여 단어가 몇 번 등장했는지 쉽게 파악이 가능하다. 내가 배운 예제에서는 tokenizer.word_index()와 tokenizer.word_counts()의 단어 순서가 동일했다. 그러니 당연히 항상 같을 거라고 생각해왔다. tokenizer.word_index()는 가장 많이 등장한 단어부터 인덱스 번호 1번을 매긴다고 배웠다. 게다가 tokenizer.word_counts()는 print시 OrderedDict라고 나온다. OrderedDict는 이름에서 자기가 순서를 가지고 있다고 어필하고 있다. 난 당연히 이 순서가 주요 key에 의해 정렬된 순서라고 생각했다. 단어 등장 횟수에 의해 정렬된 순..

python 메모리와의 전쟁 - pandas의 거대함, pickle의 압축력

heroku 512MB 무료 서버에 만들어놓은 리뷰 분석 프로젝트를 올리기 위해 끙끙대고 있다. 거의 일주일 동안 배포에만 매진하고 있고 여러 가지 경우의 수들을 테스트 중이다. 매우 많은 경우의 수를 테스트해본 뒤에도 메모리에 개선이 없자 더는 경우의 수를 생각해낼 수 없었다. 그래서 이건 뭔가 고질적인 문제가 있다는 생각 하에 celery task가 돌아가는 중에 사용되는 메모리를 알아야겠다는 생각이 들었다. 진작 이걸 찾아봤어야 했다. 아래 코드만으로도 변수가 사용 중인 메모리(memory)를 확인할 수 있다. import sys sys.getsizeof(변수명) 사용 중인 변수들의 메모리를 확인해 보니 예상치도 못한 결과가 나왔다. 가장 큰 메모리를 차지하고 있던 건 리스트도 아니고 pandas가..

꼬꼬마(kkma)의 메모리 효율 문제 - konlpy 품사 태거에 대해

꼬꼬마가 konlpy 태거 중에 품사 태깅 결과가 가장 마음에 들었었다. 그러나 문제는 이를 heroku에 배포 시 2000MB가 넘는 메모리를 사용하며 E15 에러와 함께 뻗어버린다는 것이다. heroku에서는 무료 서버가 아닌 돈을 지불하는 서버도 1000MB는 꽤나 고가이다. 그렇기 때문에 꼬꼬마가 태깅 실력이 좋다 했도 사용할 수가 없다. konlpy memory를 검색어로 구글에 검색을 했을 때 kkma 메모리가 연관 검색어로 뜰만큼 kkma는 메모리를 많이 차지한다. 심지어 꼬꼬마 공식 홈페이지에도 메모리 얘기가 나와있다. 꼬꼬마 한글 형태소 분석기는 Java 라이브러리로써 jar 파일 형태로 배포한다. 배포하는 jar 파일을 내려받아 형태소 분석기를 사용할 프로젝트의 classpath에 이 ..

rmsprop vs adam 나에게는 어떤 optimizer가 더 좋을까?

[정정] 어떤 optimizer가 좋다고 확정하기 어렵다. 모델이 다른 가중치, 다른 테스트 케이스를 사용했기 때문에 정확하다고 말할 수 없다. [참고로 konlpy tag 중 Okt를 사용해 감성 분류, Kkma를 사용해 키워드 추출을 했다] keras의 optimizer 중에 rmsprop과 adam이 그나마 단점을 잘 보완한 애들이라고 배웠다. adam은 rmsprop에 학습 step까지 조절한 꽤나 훌륭한 optimizer라고 알고 있었다. 그래서 당연히 adam(아담) 짱을 외치며 adam을 optimizer로 선택했었다. 그런데 긍정, 부정 예측에 있어서 만족스럽지 못한 결과를 금방 얻어 버렸다. 캡처를 깜빡했지만 adam으로 학습한 결과 아래 문장 '오버핏이라 핏은 이쁘게 촤악 나오긴한다.'..

konlpy 형태소 분석(품사 태깅) 결과 비교

무신사 리뷰의 한 문장으로 mecab을 제외하고 모든 tag에 대해 품사 추출을 해보았다. 리뷰 분석에 있어서 신조어나 사전에 등록되어 있지 않은 단어도 하나의 품사로 취급되기를 원했다. 리뷰 문장을 참으로 많이 살펴봤지만 대부분 띄어쓰기가 나름 잘 되어있다. 그래서 조사 앞, 띄어쓰기 뒤에 있는 단어는 전부 하나로 취급해줬으면 했다. 위에 결과를 보면 kkma가 그나마 내 요구 조건을 잘 충족시켜 줬다. 하지만 속도는 저 짧은 문장에 대해서도 억 소리 나게 느렸다. 꼬꼬마(kkma)야. 속도 좀 어떻게 안 되겠니? customized_konlpy 사용도 염두에 뒀다. 그런데 2018년 이후 customized_konlpy가 개발이 중단돼서 그런지 최신 okt보다 품사 태깅 능력이 많이 떨어진다. okt..

tensorflow 사용하는 프로젝트 heroku에 배포 - tensorflow-cpu를 사용하자

tensorflow 최신 버전으로 아무 생각 없이 깔고 로컬에서 잘 구동하는 걸 확인 했다. 그래서 heroku에 배포에도 잘 될 줄만 알았다. "error: failed to push some refs to" 그래서 이게 도대체 무슨 말인가? 싶어서 해당 에러를 복사해서 구글에 검색을 해봤다. 어느 블로그에서는 commit이 문제가 있어서라고 했다. 근본적인 문제는 이게 아니었다. heroku의 해당 app에 들어가보니 build failed가 적혀 있었다. 그래서 view build log를 클릭 했더니 맨 아랫줄에서 문제의 원인을 찾을 수 있었다. Compiled slug size: 616.2M is too large (max is 500M) 500M까지 가능한데 필요한 파이썬 패키지 설치에서 10..

error 발생: jpype 버전 주의하세요

잘 되던 걸 배포 준비하다가 jpype1을 삭제하고 다시 깔았었다. 그랬더니 okt가 java 파일 경로를 못 읽는 문제가 발생했다. 다행히 전에 헤매던 기억이 있었는지 금방 오류를 잡을 수 있었다. 로컬 컴퓨터에 깔려있는 jpype1이랑 같은 버전을 django의 가상환경에 설치했더니 다행히 다시 정상 작동한다. jpype1의 로컬 버전이랑 같게 설치하자.