우와 NLP다. 이거 사실 분야가 너무 큰 분야라서 폴더 하나 새로 만들어서 "시작하며" 부터 시작을 해야 하는 분야이다. 그런데 왜 이게 그냥 Data Mining 폴더 안에 있냐면.. 그렇게 자세하게 하지 않을꺼면서 거창하게 폴더까지 만들고 싶지 않아서이다. 그리고 사실 Data Mining과도 유사한 부분이 많기도 하다.


우선 NLP가 뭐하는 것인지 대략 설명해보자. 한국말로 하면 자연어 처리인데, 말 그대로 컴퓨터가 언어를 "이해하는 것처럼" 만들어 보자는 것이다. 가령 Twitter Data(Twitt)를 컴퓨터가 "Positive" 또는 "Negative"를 예상한다던지, 특정 문단을 보고 어떤 Topic에 속하는 것인지 예측을 한다든지.. 마치 컴퓨터가 인간의 글을 읽고 이해하는 것처럼 보이게 하는 것이다. 


그렇다면 그것을 어떻게 가능케할까? 그것을 위해서 우리는 Preprocessing을 먼저한다. Data를 실제로 Classify 하기 전에 우선 먼저 손을 봐준다는 것이다. 어떻게 손을 봐줄까? 가령 아래와 같은 Twitt이 있다고 해보자.


User1 : Oh my god, I rushed to my class at 8AM but it was cancelled. Give me my sweet morning back :(
User2 : Yeaaaaaaaaaah, I got A+ for all classes in this term.

User3 : San Francisco is cold, isn't it?

User4 : I was jogging 5km in the morning.


우선, NLP에서 가장 대표적으로 하는 Preprocessing에는 Tokenization이다. 단어별로 나누는 것이다. 그러고 난 후, 한번 이것을 Naive Bayes를 적용시켜서 Positive? Negative?를 예측해보자. 그렇게 하기 위해서 위의 Twitt을 아래와 같이 고쳐볼 것이다.

자, 직관적으로 생각해봤을 때, 위의 data를 NB에 집어 넣으면 결과가 나올까? 나온다. 당연히 나온다. 뭐 딱히 안될 것은 없다. 저 data와 각 User에 대한 positive negative값만 같이 넣어주면 Naive Bayes model 만드는데는 문제가 없다. 그런데!! 위의 데이터는 정말 여러 면에서 잘못됐다.


우선 너무 크고 sparse하다. 너무 0이 많다. 위에서 짧은 4개의 Twitt으로도 저렇게 큰 matrix가 나오는데 실제로 Twitter에서 받아 처리하는 데이터로 위의 작업을 하면? 어마어마한 크기가 나오고 prediction은 느리게 되겠지. 자!! feature 사이즈를 줄여보자 (NLP에서 각각의 단어를 통해 예측을 하므로 각각의 단어를 feature라고 한다.)


이게 가장 큰 문제점이다. 그럼 이걸 어떻게 줄일까? 음 직관적으로 풀수 있는 것부터 풀어보자. 


1. 우선 i와 I는 같으니까 이걸 해결하기 위해 모든 문자를 소문자로 바꿔주자.


2. ? ! , 등등은 없어도 되니까 지워주자.

.은 경우에 따라서 유용하게 쓰일 수 있다고 하나 이번에는 그냥 과감히 지워줘버리자.


3. 여기서 data를 조금 normalization 해줄 필요가 있다. 무슨 말이냐? 예를 들어, class와 classes는 결국 의미는 같은 것이다. 두 개의 다른 feature로 존재할 필요가 없다. 그리고 was is are 등도 그냥 be동사이기 때문에 be로 바꿔주면 좋다. NLP에서 이것을 Stemming이라고 한다. 단어들의 뿌리를 찾는 것이다. (비슷한 개념으로 Lemmatization 이라고도 한다. 다른 개념이나 설명은 생략하도록 하자.)


4. 자 여기서 또 비슷한 개념을 적용시켜서 feature 수를 줄여보자. POS Tag이다. POS는 Part of Speech의 약자이다. 가령, In은 전치사, have 는 동사, car는 명사 이런 식으로 Speech의 일부분이라는 것이다. 지금까지 남아있는 단어들에 대하여 POS Tag를 적용하면 각 단어가 특정 POS Tag를 가지게 된다.


우리는 딱히 쓸모 없는 POS Tag들은 빼버리려고 한다. 예를 들어 전치사나 a the등은 positive negative 구분을 하는데는 별로 필요가 없지 않을까? 


이제 feature크기가 많이 줄어들었다. 이것을 기반으로 word count table을 만들어서 Nave Bayes에 넣어서 Positive Negative를 예측하면 된다. 물론 Model 빌드할 때 positive negative를 같이 넣어줘야 model이 뭘 배우든 말든 하겠지. (여기서 계속 NB를 얘기하는데 물론 SVM, Logistic Regression등등 여러가지를 시도해봐도 좋다)


대략 이런식으로 text classification을 구현한다. 이는 매우 단편적인 예일 뿐이다. 실제로 Word2Vec같은 전혀 다른 것들도 쓰이기도 하는데 그것은 나중에 자세히 포스팅할 것이다. (내가 NLP부분은 사실 별로 그렇게 좋아하는 분야는 아니라 포스팅이 건성건성일 수 있으나 Word2Vec만큼은 잘 해놓을 것이다.)


아무튼 이번 포스팅은 누군가 text classification을 해야 하는데 도무지 어떻게 해야되는지 감이 오지 않는 사람을 위한 포스팅으로 보면 된다.

Posted by 빛나유
,