프로젝트/리뷰집

OrderedDict의 배신 - not ordered

발전생 2021. 2. 15. 16:53

keras의 tokenizer가 학습을 하고 나면 tokenizer.word_counts()를 사용하여 단어가 몇 번 등장했는지 쉽게 파악이 가능하다.

내가 배운 예제에서는 tokenizer.word_index()와 tokenizer.word_counts()의 단어 순서가 동일했다. 그러니 당연히 항상 같을 거라고 생각해왔다. tokenizer.word_index()는 가장 많이 등장한 단어부터 인덱스 번호 1번을 매긴다고 배웠다. 게다가 tokenizer.word_counts()는 print시 OrderedDict라고 나온다.

 

OrderedDict는 이름에서 자기가 순서를 가지고 있다고 어필하고 있다. 난 당연히 이 순서가 주요 key에 의해 정렬된 순서라고 생각했다. 단어 등장 횟수에 의해 정렬된 순서라고 생각했던 것이다.

OrderedDict여도 정렬이 안 되어 있을 수 있다.

 

그런데 리뷰 프로젝트 진행 중에 분명 3번 이상 등장하는 단어만 키워드로 추출하도록 로직을 짰는데 막상 확인해보면 해당 키워드를 포함하는 문장이 한두 문장밖에 없는 경우가 있었다. try except를 사용해서 오류가 발생하는 문장은 pass 하기 때문에 그럴 수 있다고 생각했지만 착각이었다.

word_counts dic original: [2021-02-15 16:35:19,392: WARNING/MainProcess] OrderedDict([('팔', 1), ('길이', 2), ('길다', 1), ('짧다', 1), ('기준', 1), ('ㅎㅎ\n키큰', 1), ('기장', 1), ('사이즈', 4), ('디자인', 3), ('맘', 4), ('추천', 1), ('합', 1), ('당', 1), ('구매', 1), ('에', 1), ('사면', 1), ('겨울', 1), ('후회', 1), ('안', 1), ('가격', 1), ('대비', 1), ('성비', 1), ('스타일', 1), ('좋다', 5), ('색감', 1), ('예쁘다', 1), ('와이 드슬랙스랑', 1), ('흰색', 1), ('셔츠', 1), ('이쁘다', 2), ('옷', 4), ('완전', 1), ('따뜻', 2), ('롱코트로', 1), ('같다', 2), ('이', 1), ('비', 1), ('사고', 1), ('블랙', 1), ('오버핏', 1), ('코트', 2), ('크기', 1), ('크다', 1), ('감', 1), ('적당', 1), ('어깨', 1), ('선', 1), ('아쉽다', 1), ('재질', 2), ('폴리', 1), ('얇다', 1), ('초겨울', 1), ('느낌', 1), ('먼지', 1), ('보', 1), ('풀', 1), ('김', 1), (' 가볍다', 1), ('무난', 1), ('여자', 1), ('배', 1), ('송도', 1), ('빠르다', 1), ('마음', 1), ('제품', 1), ('생각', 1), ('만족', 1)])

word_counts()에서 숫자가 들쭉날쭉한 걸 볼 수 있다. 

 

 

결국 코드를 추가해서 직접 정렬을 해야했다.

아래 코드를 통해 등장 횟수를 기준으로 내림차순으로 정렬한 뒤 20개만 뽑아냈다.

word_count_dic = list(sorted(tokenizer.word_counts.items(), key=lambda x: x[1], reverse=True))[:20]

그 결과 이렇게 원하는 대로 가장 많이 등장한 단어 20개를 뽑아낼 수 있었다.

[('좋다', 5), ('사이즈', 4), ('맘', 4), ('옷', 4), ('디자인', 3), ('길이', 2), ('이쁘다', 2), ('따뜻', 2), ('같다', 2), ('코트', 2), ('재질', 2), ('팔', 1), ('길다', 1), ('짧다', 1), ('기준', 1), ('ㅎㅎ\n키큰', 1), ('기장', 1), ('추천', 1), ('합', 1), ('당', 1)]