지난번에 블로그에서 음식이름의 출현 횟수를 통계낸 포스팅을 했었습니다. 그 포스트에서 예고를 했듯이 이번에는 음식 이름의 co-occurrence(공기, 共起, 동시출현) 정보를 뽑아 보았습니다. 지난번과 마찬가지로 약 8만개의 rss feed 주소로 약 75만개의 포스트에서 통계 정보를 만들었습니다.
먼저 단순하게 co-occurrence 횟수를 세어 본 결과는 다음과 같습니다. 횟수를 보다 정확히 말하면 두개의 음식이 한개의 포스트에 함께 출현한 횟수입니다.

매우 친숙한 조합이 상위에 많이 나왔습니다. '라면-밥' 이 '김치-밥'을 제치고 1등을 차지했습니다. 저는 사실 '김치-라면'이 1등을 차지하지 않을까 했었는데 기대만큼 해주지를 못했습니다. 100등까지 쭉 보면 재밌는 조합이 많이 있습니다. 20등 '밥-피자' 이걸 같이 먹었다는 건지 뭔지. 25등 '김치-빵'이 있는데 이 조합 먹어봤는데 괜찮습니다. 김치라는 음식이 아무 음식에나 굉장히 잘 어울립니다. 자꾸 얘기가 새는 군요. 배가 고파집니다. 100등 '샌드위치-샐러드'까지 의미있어 보이는 조합이 많습니다.
그런데, '라면-사과'는 도대체 뭥미? 인가 싶어서 구글로 검색을 때려 봤더니 흠 역시 중의성을 가진 두개의 단어라 음식 이름 쌍이 아닌 결과들이 많습니다. 예를 들어 이런 것들 입니다. 남자라면 사과랍니다. 뭐 키워드 매칭이라는 바닥 자체가 그렇습니다. 새겨서 이해해야 할 때가 많고, 또 그걸 뭐라고 하는 사람도 별로 없습니다.
그런데, 이 방법은 사실 매우 옳지 않습니다. 단순히 동시 출현한 횟수를 세는 것은 당연히 많이 출현하는 음식들이 유리하게 됩니다. 두 단어의 의존 정도를 계산하는 방법으로 Mutual Information이나 카이제곱 테스트 등등이 있는데요, 저는 Mutual Information을 사용해 보았습니다.
Mutual Information(정확히 말하자면 Pointwise Mutual Information)의 계산식은 다음과 같습니다.

예를 들어, 전체 문서셋의 전체 토큰 개수가 1억개이고 라면이 20번 출현, 김치가 30번 출현, 라면-김치 동시 출현이 10번이라면 MI는 다음과 같습니다.

그런데, 위의 식을 사용하면 한가지 문제가 있습니다. 즉, Sparse 데이터 문제가 발생을 해서, 굉장히 적은 출현 빈도가 나타나는 단어들이 높은 MI값을 받어 버립니다. 위에서 했던 단순 카운팅 때와 정반대의 문제입니다. 이 문제의 해결 방법을 비롯해서 Mutual Information에 대한 자세한 내용은 저~~ 유명한 구글을 이용하시기 바랍니다. 저는 기냥 단순하게 동시 출현 횟수가 30보다 작은 단어쌍은 싹둑 잘라냈습니다. 결과는 이렇습니다.

1등이 아주 제대로입니다. 총각김치는 깍두기를 제치고 배추김치와 더 가까운 김치로 판정났습니다. 탕수육과의 궁합에서는 짜장면(22위,25위)이 짬뽕(28위)보다 앞섰습니다. 저 위쪽의 표는 밥, 라면, 빵 이런 주식류였는데 여기는 시원하고 얼큰한 국수나 국물있는 음식같은 메인 메뉴들이 많이 보입니다. 17위 '보쌈-족발' 아 정말 땡깁니다. 그만 정리하고 뭐라도 먹어야 할 듯합니다. 지금 시간 1시 51분 이러면 안돼는데...
먼저 단순하게 co-occurrence 횟수를 세어 본 결과는 다음과 같습니다. 횟수를 보다 정확히 말하면 두개의 음식이 한개의 포스트에 함께 출현한 횟수입니다.
매우 친숙한 조합이 상위에 많이 나왔습니다. '라면-밥' 이 '김치-밥'을 제치고 1등을 차지했습니다. 저는 사실 '김치-라면'이 1등을 차지하지 않을까 했었는데 기대만큼 해주지를 못했습니다. 100등까지 쭉 보면 재밌는 조합이 많이 있습니다. 20등 '밥-피자' 이걸 같이 먹었다는 건지 뭔지. 25등 '김치-빵'이 있는데 이 조합 먹어봤는데 괜찮습니다. 김치라는 음식이 아무 음식에나 굉장히 잘 어울립니다. 자꾸 얘기가 새는 군요. 배가 고파집니다. 100등 '샌드위치-샐러드'까지 의미있어 보이는 조합이 많습니다.
그런데, '라면-사과'는 도대체 뭥미? 인가 싶어서 구글로 검색을 때려 봤더니 흠 역시 중의성을 가진 두개의 단어라 음식 이름 쌍이 아닌 결과들이 많습니다. 예를 들어 이런 것들 입니다. 남자라면 사과랍니다. 뭐 키워드 매칭이라는 바닥 자체가 그렇습니다. 새겨서 이해해야 할 때가 많고, 또 그걸 뭐라고 하는 사람도 별로 없습니다.
그런데, 이 방법은 사실 매우 옳지 않습니다. 단순히 동시 출현한 횟수를 세는 것은 당연히 많이 출현하는 음식들이 유리하게 됩니다. 두 단어의 의존 정도를 계산하는 방법으로 Mutual Information이나 카이제곱 테스트 등등이 있는데요, 저는 Mutual Information을 사용해 보았습니다.
Mutual Information(정확히 말하자면 Pointwise Mutual Information)의 계산식은 다음과 같습니다.
예를 들어, 전체 문서셋의 전체 토큰 개수가 1억개이고 라면이 20번 출현, 김치가 30번 출현, 라면-김치 동시 출현이 10번이라면 MI는 다음과 같습니다.
그런데, 위의 식을 사용하면 한가지 문제가 있습니다. 즉, Sparse 데이터 문제가 발생을 해서, 굉장히 적은 출현 빈도가 나타나는 단어들이 높은 MI값을 받어 버립니다. 위에서 했던 단순 카운팅 때와 정반대의 문제입니다. 이 문제의 해결 방법을 비롯해서 Mutual Information에 대한 자세한 내용은 저~~ 유명한 구글을 이용하시기 바랍니다. 저는 기냥 단순하게 동시 출현 횟수가 30보다 작은 단어쌍은 싹둑 잘라냈습니다. 결과는 이렇습니다.
1등이 아주 제대로입니다. 총각김치는 깍두기를 제치고 배추김치와 더 가까운 김치로 판정났습니다. 탕수육과의 궁합에서는 짜장면(22위,25위)이 짬뽕(28위)보다 앞섰습니다. 저 위쪽의 표는 밥, 라면, 빵 이런 주식류였는데 여기는 시원하고 얼큰한 국수나 국물있는 음식같은 메인 메뉴들이 많이 보입니다. 17위 '보쌈-족발' 아 정말 땡깁니다. 그만 정리하고 뭐라도 먹어야 할 듯합니다. 지금 시간 1시 51분 이러면 안돼는데...