👯

제멋대로인 텍스트, 손 쉽게 정돈 / 나열하기 - 코사인 유사도

"김 사원, 그 내역서에서 A랑 내용 비슷한 것들만 쭉 뽑아주세요" "네? 데이터가 주관식 응답에 2000개인데요...?"
스타트업의 사내 복지 데이터를 크롤링에 성공한 김 사원.
하지만 '자기계발 복지' 항목이 A회사랑 '비슷한 회사들만 걸러오라'는 지시가 떨어졌다.
데이터는 정돈된 것이 아닌, 날것의 텍스트 데이터라면?
데이터를 눈으로 읽으며 비슷한지 판단하기엔 양이 너무 많다면?
→ 간단한 머신러닝 코드 몇 줄로 해결하자!

예시 데이터 : 100억 이상 투자 유치 스타트업의 사내 복지 항목들

→ 아래 링크를 통해 엑셀 형식의 파일을 다운 받을 수 있습니다.
(번거롭다면) 파이썬 코드로 바로 csv 불러오는 코드 보기
데이터를 판다스 데이터프레임으로 로딩하면 다음과 같이 생겼습니다.

사이킷런 코사인 유사도 코드를 적용해 바로 비슷한 데이터부터 정렬하기

자기계발 항목인 self_improvement 항목을 보면
"스터디 모임 지원, 자기 개발 교육비 지원, 도서 구입비 지원" 가 첫 행에 위치해 있습니다.
이와 비슷한 내용을 가진 데이터 순으로 정렬하면 김 사원의 미션을 손쉽게 달성할 수 있겠죠?
아래 코드를 입력하면, 빠르고 간단하게 'self_improvement' 칼럼을 비슷한 순으로 정렬할 수 있습니다.
#pip install sklearn 혹은 conda install sklearn 을 통해 사이킷런(sklearn) 오픈 소스 다운로드 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity # 자기계발 칼럼을 임시 리스트에 담아줌 df_self_imporvement_list = df['self_improvement'].tolist() # TF - IDF 기법을 사용해서 텍스트의 등장 빈도를 체크해 저장 tfidf_vect_simple = TfidfVectorizer() feature_vect_simple = tfidf_vect_simple.fit_transform(df_self_imporvement_list) # 등장 빈도에 기반하여, 코사인 유사도 알고리즘 적용 similarity_simple_pair = cosine_similarity(feature_vect_simple[0] , feature_vect_simple) result_list = similarity_simple_pair.tolist()[0] # result_list를 df 우측에 삽입해서, 유사도가 높은 순으로 정렬 df['self_improvement_result'] = result_list df.sort_values(by='self_improvement_result', ascending=False).head(20)
Python
그 결과물은 다음과 같습니다.
머신러닝은 해당 칼럼의 데이터들을 기준 데이터로부터 얼마나 비슷한지 체크해냈습니다.
스터디 모임 지원, 자기 개발 교육비 지원, 도서 구입비 지원 (기준 데이터. 유사도는 만점인 1.0점)
1.
자기개발 교육비 지원, 사내 스터디 (0.703점)
2.
교육비, 세미나 참가비 지원, 스터디 모임 지원 (0.702점)
3.
세미나 참가비 지원, 스터디 모임 지원 (0.582점)
4.
세미나 참가비 지원, 스터디 모임 지원 (0.582점)
5.
스터디 모임 지원, 세미나 참가비 지원, 동아리 지원 (0.570점)
반대로 유사하지 않은 데이터들은 어떻게 생긴 데이터였을까요?
df.sort_values(by='self_improvement_result').head(20) # ascending을 바꿔주거나 #.head(20)이 아닌 .tail(20)을 하면 됩니다
Python
역시나 아예 null 데이터가 나오거나, 전혀 내용상 무관한 "길드모임지원" 과 같은 데이터가
'유사도가 떨어진다'고 판단되었습니다.
위에서 사용된 알고리즘 개념 이해하기
김문과의 데이터