프로젝트 정리/소프트웨어 응용

11/27 TF-IDF, 클래스 분리

TF-IDF 기법을 각 유저들이 작성한 리뷰에 적용하여 추천 목록에 있는 음악들의 관련 키워드를 나타냈다. 파이썬 sklearn 모듈의sklearn.feature_extraction.text에서 TfidfVectorizer를 import하여 TF-IDF를 사용했고, 추출된 단어들 중 the, is, are, a, he 등의 쓸모없는 단어들을 걸러내기 위해 sklearn.feature_extraction의 stop_words를 사용했다.

 

 

stop word를 사용해도 음악 리뷰라는 특성 상 music이나 disk, cd, album과 같은 단어들이 많이 등장하는 것을 확인할 수 있었다. 또한 데이터 파일 자체에 저장되어 있는 &#8217, &#34와 같은 HTML 코드들도 TF-IDF 결과에 섞여 나오기도 했다. 현재는 추가적인 stop word 리스트를 수동으로 만들어 이를 기존 stop word 리스트에 추가하는 방식으로 쓸모없는 단어들을 걸러내고 있지만, 이 방법은 한계가 있기 때문에 (어느것이 쓸모없는 단어인지 정확히 구별하지 못함.) 다른 대책이 필요할 것 같다.

 

 

User review를 이용하는 다른 방법이 없을까 하여 구글링을 해봤는데 이미 많은 연구 결과가 나와있는 것을 확인할 수 있었다. 내가 찾은 방법은 CNN을 사용하여 user review에서 item profile과 user profile을 추출하여 이들을 합쳐서 기존의 추천엔진 성능을 향상시키는 DeepCoNN인데, 이를 적용해보려고 했지만 텐서플로우 버전 문제도 있고, 제출 기한이 얼마 남지 않아 지금 당장 적용하기는 힘들 것 같다. 나중에 개인적으로 적용해보던가 해야겠다.

 

 

기존에 하나의 클래스 Recommend_Engine_SGD에 존재하던 추천 목록 보여주기 기능을 별도의 클래스 User_Mode로 분리했다. 앞으로 구현할 추천 목록에 관련된 기능들은 이 클래스에 속하게 될 것 같다. 클래스를 분리하면서 기존에는 recommendation_menu 클래스만 Recommend_Engine_SGD의 인스턴스를 사용했지만 이제는 User_Mode도 해당 인스턴스의 데이터를 공유해야 했다. 이를 위해 Recommend_Engine_SGD에 정적 메소드 get_instance를 생성하여 싱글턴 패턴을 적용하였다. 

싱글턴 패턴

Recommend_Engine_SGD의 인스턴스의 생성은 기존의 생성방법이 아닌 정적 메소드 get_instance를 호출하면서 이루어진다. 기존의 생성자 __init__은 private 처리하여 외부에서 접근하지 못하게 해야 하지만 파이썬에는 private 개념이 없기 때문에 실수로 기존 생성자를 참조하지 않도록 조심해야 한다. 정적 메소드 get_instance를 실행하면 기존에 클래스 변수 sgd가 None일 경우 새로운 Recommend_Engine_SGD의 인스턴스를 생성해서 이를 리턴한다. sgd에 이미 인스턴스가 할당되어 있는 경우 새로 인스턴스를 생성하지 않고 sgd를 바로 넘겨준다. 이렇게 함으로써 여러 클래스들간에 인스턴스의 데이터를 공유할 수 있지만, 다른 클래스들 간의 결합도가 높아져 개방-폐쇄 원칙에 어긋나게 된다. ( 객체는 확장에 열려있고, 수정에 닫혀있어야 한다.) 따라서 싱글턴 패턴을 남용하지 않도록 주의해야 한다.

 

 

현재 추가로 구현하려고 생각한 기능들은 두 개 정도 있는데, 하나는 추천목록에 뜬 아이템 중 마음에 들지 않는 아이템을 목록에서 삭제하고 이와 관련된 아이템들도 평점을 깎아 이를 평점 행렬에 반응하는 것이다. 다른 하나는 유저가 특정 키워드를 입력하면 이와 관련된 아이템들을 추천해주는 기능이다. 다음 글은 이 기능들을 구현하고 이에 대해 쓸 수 있었으면 좋겠다.