Intro to machine learning - (10) Text Learning
이번 강의에서는 Text 데이터를 처리하는 것에 대해 소개했습니다.
seunghunii/simple_examples
Contribute to seunghunii/simple_examples development by creating an account on GitHub.
github.com
보통은 예제코드가 간단하게 모델 돌려보는 정도여서 따로 정리하지 않았는데, 이번에는 처음보는 코드여서 Jupyter에 정리해두었습니다. 실습에서 사용한 코드 전체는 위의 링크에서 확인할 수 있습니다.
Text데이터를 SVM같은 알고리즘에 활용하려면 어떻게 처리해야할까요? 기본적으로 모든 문서의 길이는 같지 않습니다. 때문에 개별적인 Feature로 만들기가 쉽지 않습니다.
그래서, 우리는 Bag of words라는 것을 활용합니다. 기본 개념은 단어의 빈도를 센다는 것입니다.
"Nice day", "A very nice day" 두 문장으로 Bag of words를 만들었습니다. 두 문장의 차이는 A, very 두 가지인데요. A는 Bag of words에 Count되지 않는 것을 볼 수 있습니다. A, the, of 같은 것들은 Text를 분석하는데 있어 큰 의미를 갖지 않습니다. 보통 이들은 Stopword라고 해서 제거하는 과정을 거칩니다.
"MR Day Loves A Nice Day"라는 문장이 있다면, Loves가 있지만 Love로 Count되지 않는 것을 볼 수 있습니다. 기초단계에서는 Love와 Loves를 구분하지 못하지만, 최근에는 어간을 구분하여 Count할 수 있습니다.
1. Bag of Words에서 단어의 순서가 중요할까요?
중요하지 않습니다. 단지 단어의 빈도만 셀 뿐, 위치에 대한 언급은 없습니다. 이것은 텍스트를 제한적으로 이해하는 방식입니다. 문장의 단어를 뽑아서 임의로 섞는 것과 똑같기 때문입니다. 저는 문맥을 파악하기 어렵다는 뜻으로 이해했습니다.
2. 긴 문장은 다른 Input이 될까요?
이메일 A와 A를 세번 복사한 B가 있다고 해봅시다. 두 데이터의 Bag of words를 만들었다고 하면, 당연히 A에 1번 나온 단어는 B에 세번 나오기 때문에 같은 단어더라도 다른 Count를 갖게 됩니다. 때문에 다른 Input이 만들어집니다.
3. "Chicago bulls"같은 복잡한 문구를 처리할 수 있나요?
기본적으로는 어렵습니다. 구글도 처음에는 "Chicago Bulls"를 검색했을 때 도시인 Chicago와 동물인 Bulls에 대한 결과가 같이 나왔다고 합니다. 시간이 지나면서 검색 엔진을 업그레이드해서 스포츠 팀인 Chicago Bulls에 대한 결과만 나오도록 한 것입니다.
텍스트의 모든 단어들은 동등하지 않습니다. 주제나 분석 관점에 따라 단어의 중요도가 달리질 수 있습니다.
분석이나 우리가 보고자하는 것에서 벗어나는 단어들은 고려대상에서 제외해서 Noise가 되지 않도록 합니다. 이렇게 고려대상에서 제외하는 단어들을 Stop Words라고 합니다.
Stop Words는 빈번하게 등장하는 덜 중요한 단어들을 의미합니다. 대표적으로 and, the, I, you 등이 있습니다. Stop Words의 일반적인 처리는 제거해주는 것입니다.
많은 단어들이 맥락이나 등장하는 위치에 따라 의미가 달라집니다.
(Unresponsive, Response, Responsivility, Responsiveness, Respond) 이 5개의 단어들은 Respond를 기반으로 합니다. 하지만 Bag of words에는 이 5개가 모두 다른 Feature로 Count 됩니다.
이런 단어들을 묶어서 하나의 단어로 대표하도록 할 수 있습니다. Stemmer라는 방법입니다. 단순히 하나의 단어로 만드는게 아니라, 어근을 찾고자 하는 것입니다. 위에서 예시로 들었던 5개의 단어들을 Stemmer에 넣으면, Respon이라는 결과를 얻을 수 있습니다.
지금까지 Bag of words와 Stemmer에 대해서 소개했습니다. 만약 두개를 다 해야한다면, Bag of words를 하기 전에 Stemming을 해주어야 합니다. 크게 두 가지 이유를 들 수 있습니다.
1. Bag of words를 Stemming 전에 하면, 의미가 없습니다. 같은 어근을 갖는 단어가 이미 다른 단어로 취급되어 Count 되었기 때문에 Stemming이 큰 의미가 없는 것입니다.
2. Stem은 단순히 String 데이터고, Bag of words는 (문서번호, 단어번호, Count)로 된 Matrix이기 때문에 Stem을 먼저 하는 것이 적합한 처리라고 합니다.
강의에서 마지막으로 TF-IDF를 소개하고 있습니다. 이는 Tf와 Idf로 나뉩니다.
TF는 Bag of words와 비슷하게 단순히 단어가 문서에서 등장하는 빈도입니다.
IDF는 Corpus에서 단어가 얼마나 많이 등장하는지에 대한 지표입니다. Inverse Document Frequency 말 그대로 Document Frequency의 역수입니다. (전체 문서의 수 / 해당 단어가 등장한 문서의 수)로 계산합니다.
TF-IDF값은 둘을 곱합니다. 문서 내에서 단어의 빈도가 높을 수록, 그리고 전체 문서들 중 해당 단어를 포함한 문서가 적을수록 TF-IDF값이 커집니다. 따라서 TF-IDF를 통해 모든 문서에 흔하게 나타나는 단어를 걸러낼 수 있습니다.
해당 문서에서만 Unique하게 자주 언급되는 단어에 대해 높은 점수를 부여합니다.