Cohesion Probability
05 May 2017 | tokenize
이번 글에서는 말뭉치 내 빈도로 단어를 추출하는 기법인 Cohesion Probabilty(이하 CP)에 대해 살펴보도록 하겠습니다. CP는 Kim&Cho(2013)가 제안한 모델인데요, 이 글은 모델 원저자인 김현중 서울대 박사과정이 진행한 2017 패스트캠퍼스 강의와 코드를 참고하였음을 먼저 밝힙니다. 그럼 시작하겠습니다.
기법 개요
CP는 연속된 글자의 연관성이 높을 수록 단어일 가능성이 높다는 가정 하에 구축된 모델입니다. $c_1$, $c_2$, …, $c_{n-1}$ 다음에 $n$번째 글자인 $c_n$이 많이 나오면 $n$개 문자열로 이뤄진 $c_1$, $c_2$, …, $c_{n-1}$, $c_n$은 단어일 것이라는 이야기입니다. 글자별로 조건부 확률을 구하여 모두 곱한 뒤 $1/n$승을 해서 구합니다. 아래 식과 같습니다.
\[\begin{align*}
cohesion({ c }_{ 1 },{ c }_{ 2 },...,{ c }_{ n })&=\sqrt [ n ]{ \prod _{ i=1 }^{ n-1 }{ P({ c }_{ 1 },...,{ c }_{ i+1 }|{ c }_{ 1 },...,{ c }_{ i }) } }\\&=\sqrt [ n ]{ \frac { Freq({ c }_{ 1 },{ c }_{ 2 },...{ c }_{ n }) }{ Freq({ c }_{ 1 }) } }
\end{align*}\]
분석 예시
예를 들어보겠습니다. $cohesion(박태환)$은 아래와 같이 ‘박태환’ 빈도수를 ‘박’의 개수로 나눈 뒤 세제곱을 취해 구합니다. 아래 식에서 $N$은 말뭉치에 등장하는 단어 빈도수의 총합인데, 분자 분모에 동시에 있으므로 계산상 가능합니다. CP는 빈도만으로도 얼마든지 구할 수 있습니다.
\[\begin{align*}
cohesion(박태환)&=\sqrt [ 3 ]{ P(박태|박)P(박태환|박태) } \\ &=\sqrt [ 3 ]{\frac { P(박태) }{ P(박) } \frac { P(박태환) }{ P(박태) } } \\ &=\sqrt [ 3 ]{ \frac { P(박태환) }{ P(박) } } \\ &=\sqrt [ 3 ]{ \frac { Freq(박태환)/N }{ Freq(박)/N } } \\ &=\sqrt [ 3 ]{ \frac { Freq(박태환) }{ Freq(박) } }
\end{align*}\]
이번엔 실제 말뭉치를 가지고 예를 들어보겠습니다. 영화 리뷰 사이트 ‘왓챠’에서 655만306개의 리뷰를 수집했습니다. 우선 이를 글자 단위로 세었습니다.
구분
빈도수
꿀
14145
꿀잼
10179
꿀잼ㅋㅋ
306
위 표를 토대로 $cohesion(꿀잼)$과 $cohesion(꿀잼ㅋㅋ)$를 각각 구해보겠습니다.
\[\begin{align*}
cohesion(꿀잼)&=\sqrt [ 2 ]{ \frac { Freq(꿀잼) }{ Freq(꿀) } } =\sqrt [ 3 ]{ \frac { 10179 }{ 14145 } } =0.8483\\ cohesion(꿀잼ㅋㅋ)&=\sqrt [ 4 ]{ \frac { Freq(꿀잼ㅋㅋ) }{ Freq(꿀) } } =\sqrt [ 4 ]{ \frac { 306 }{ 14145 } } =0.3835
\end{align*}\]
위 결과를 해석하면 이렇습니다.
이를 토대로 ‘꿀잼ㅋㅋ’이라는 문자열을 토크나이즈(tokenize)하면 아래와 같습니다.
꿀잼,ㅋㅋ
말뭉치 분석 결과
지금까지 CP는 왼쪽에서 오른쪽 방향(forward)으로 빈도수를 세어 분석하는 방법만을 설명했는데요, 사실 오른쪽에서 왼쪽(backward)으로도 분석이 가능합니다. 우선 왓챠 리뷰 655만306개 리뷰를 학습해 forward 방향 CP 상위 500개 문자열을 나열한 결과는 아래와 같습니다. (CP * 빈도수 내림차순 정렬)
backward 방향 CP 상위 500개 문자열은 아래와 같습니다. (CP * 빈도수 내림차순 정렬)
코드
김현중 박사과정이 작성한 CP 코드를 사용했습니다. 저 역시 정리 용도로 남긴 것이니 문제되면 바로 삭제하겠습니다. 최신 코드는 김현중 박사과정의 깃헙 https://github.com/lovit/soy을 참고하시기 바랍니다.
사용법은 아래와 같습니다. 아래 코드에서 CohesionTokenizer 역시 김현중 박사과정이 만든 코드로 말뭉치에서 학습한 CP를 바탕으로 문장을 토큰으로 나눠주는 함수입니다.
import cohesion_probability as tool
cohesion = tool.CohesionProbability()
cohesion.train(reviews)
cohesiontokenizer = tool.CohesionTokenizer(cohesion)
cohesion_tokenized_reviews = [cohesiontokenizer.tokenize(review) for review in reviews]
이번 글에서는 말뭉치 내 빈도로 단어를 추출하는 기법인 Cohesion Probabilty(이하 CP)에 대해 살펴보도록 하겠습니다. CP는 Kim&Cho(2013)가 제안한 모델인데요, 이 글은 모델 원저자인 김현중 서울대 박사과정이 진행한 2017 패스트캠퍼스 강의와 코드를 참고하였음을 먼저 밝힙니다. 그럼 시작하겠습니다.
기법 개요
CP는 연속된 글자의 연관성이 높을 수록 단어일 가능성이 높다는 가정 하에 구축된 모델입니다. $c_1$, $c_2$, …, $c_{n-1}$ 다음에 $n$번째 글자인 $c_n$이 많이 나오면 $n$개 문자열로 이뤄진 $c_1$, $c_2$, …, $c_{n-1}$, $c_n$은 단어일 것이라는 이야기입니다. 글자별로 조건부 확률을 구하여 모두 곱한 뒤 $1/n$승을 해서 구합니다. 아래 식과 같습니다.
\[\begin{align*} cohesion({ c }_{ 1 },{ c }_{ 2 },...,{ c }_{ n })&=\sqrt [ n ]{ \prod _{ i=1 }^{ n-1 }{ P({ c }_{ 1 },...,{ c }_{ i+1 }|{ c }_{ 1 },...,{ c }_{ i }) } }\\&=\sqrt [ n ]{ \frac { Freq({ c }_{ 1 },{ c }_{ 2 },...{ c }_{ n }) }{ Freq({ c }_{ 1 }) } } \end{align*}\]분석 예시
예를 들어보겠습니다. $cohesion(박태환)$은 아래와 같이 ‘박태환’ 빈도수를 ‘박’의 개수로 나눈 뒤 세제곱을 취해 구합니다. 아래 식에서 $N$은 말뭉치에 등장하는 단어 빈도수의 총합인데, 분자 분모에 동시에 있으므로 계산상 가능합니다. CP는 빈도만으로도 얼마든지 구할 수 있습니다.
\[\begin{align*} cohesion(박태환)&=\sqrt [ 3 ]{ P(박태|박)P(박태환|박태) } \\ &=\sqrt [ 3 ]{\frac { P(박태) }{ P(박) } \frac { P(박태환) }{ P(박태) } } \\ &=\sqrt [ 3 ]{ \frac { P(박태환) }{ P(박) } } \\ &=\sqrt [ 3 ]{ \frac { Freq(박태환)/N }{ Freq(박)/N } } \\ &=\sqrt [ 3 ]{ \frac { Freq(박태환) }{ Freq(박) } } \end{align*}\]이번엔 실제 말뭉치를 가지고 예를 들어보겠습니다. 영화 리뷰 사이트 ‘왓챠’에서 655만306개의 리뷰를 수집했습니다. 우선 이를 글자 단위로 세었습니다.
구분 | 빈도수 |
---|---|
꿀 | 14145 |
꿀잼 | 10179 |
꿀잼ㅋㅋ | 306 |
위 표를 토대로 $cohesion(꿀잼)$과 $cohesion(꿀잼ㅋㅋ)$를 각각 구해보겠습니다.
\[\begin{align*} cohesion(꿀잼)&=\sqrt [ 2 ]{ \frac { Freq(꿀잼) }{ Freq(꿀) } } =\sqrt [ 3 ]{ \frac { 10179 }{ 14145 } } =0.8483\\ cohesion(꿀잼ㅋㅋ)&=\sqrt [ 4 ]{ \frac { Freq(꿀잼ㅋㅋ) }{ Freq(꿀) } } =\sqrt [ 4 ]{ \frac { 306 }{ 14145 } } =0.3835 \end{align*}\]위 결과를 해석하면 이렇습니다.
이를 토대로 ‘꿀잼ㅋㅋ’이라는 문자열을 토크나이즈(tokenize)하면 아래와 같습니다.
꿀잼,ㅋㅋ
말뭉치 분석 결과
지금까지 CP는 왼쪽에서 오른쪽 방향(forward)으로 빈도수를 세어 분석하는 방법만을 설명했는데요, 사실 오른쪽에서 왼쪽(backward)으로도 분석이 가능합니다. 우선 왓챠 리뷰 655만306개 리뷰를 학습해 forward 방향 CP 상위 500개 문자열을 나열한 결과는 아래와 같습니다. (CP * 빈도수 내림차순 정렬)
backward 방향 CP 상위 500개 문자열은 아래와 같습니다. (CP * 빈도수 내림차순 정렬)
코드
김현중 박사과정이 작성한 CP 코드를 사용했습니다. 저 역시 정리 용도로 남긴 것이니 문제되면 바로 삭제하겠습니다. 최신 코드는 김현중 박사과정의 깃헙 https://github.com/lovit/soy을 참고하시기 바랍니다.
사용법은 아래와 같습니다. 아래 코드에서 CohesionTokenizer 역시 김현중 박사과정이 만든 코드로 말뭉치에서 학습한 CP를 바탕으로 문장을 토큰으로 나눠주는 함수입니다.
import cohesion_probability as tool
cohesion = tool.CohesionProbability()
cohesion.train(reviews)
cohesiontokenizer = tool.CohesionTokenizer(cohesion)
cohesion_tokenized_reviews = [cohesiontokenizer.tokenize(review) for review in reviews]
Comments