text data를 vectorize하기 전에 tokenize나 POS tagging을 통해 전처리(preprocess)를 해야 하는데 이때, 어떤 전처리를 하는가도 매우 중요한 것 같다.

문제의 data를 저장하는 경우에, 숫자나 수식을 인식하는 것 보다 문제가 어떤 방식으로 만들어졌느냐가 중요할 것이기 때문에

같은 단어라도 어떤 맥락 중에 사용되었느냐와, 조건에서 사용된 단어와 (최종)질문에서 사용된 단어를 구분하여 인식해야 하므로

한 문장이 조건에 사용되는 문장인지 질문에 사용되는 문장인지를 전처리에서 가려내는 것이 중요할 것이다.


학습 데이터셋의 포스태깅 후 정보들의 라벨 특성과 테스트셋의 포스태깅 라벨 특성이 얼마나 일치하는지를 보면

최종적으로 문제만으로 풀이를 만들어내는 과정을 완성할 수도 있지 않을까.

한 문장 내에서 수식으로 이루어진 부분은 숫자만 조금 달리하면 항상 다르게 나타나므로 수식이 포함된 부분과 그 주변 단어들을 분리해 인지하고

각각으이 조건을 계산하는 방법들을 학습 data set으로 학습하여 라벨링하면..

사실 수학문제라는 게 유형학습이 있을 정도로 생각보다 전형적인 문제가 많이 있기 때문에 가능할 지도 모르겠다는 생각이 든다.

공부를 막 시작하는 단계라서 찾다 보니 끝도 없다. 처음 논문을 쓸 때 material 두 개에서 시작해서 스무 개 남짓으로 늘어났던 때가 생각나는 요즘.

뭔가를 정리해서 쓰기에는 아직 모르는 것이 너무 많아서 알게 된 것을 조금 쓰다 보면 앞으로 뭘 더 공부해야 할 지 알게 될 것 같아

일단 뭐가 될 지 모를 포스팅을 하나 해 보려 한다.


word2vec이나 doc2vec은 모두 이름에서부터 2vec을 목적으로 하는데, 이는 특정 단어나 문서를 벡터화하여 저장하고 싶은 것이다.

word2vec은 중심 단어를 기반으로 주변 단어를 예측하거나 주변 단어를 중심으로 중심 단어를 예측하는 데 쓰인다.

이렇게 벡터화할 때 단어들, 문장, 문단, 문서 간의 유사도를 inner product로 나타내고 싶어한다.

예를 들어 $doc_1$, $doc_2$, $\cdots$, $doc_n$의 $n$개의 문서를 벡터 $v_1$, $\cdots$, $v_n$ $\in \mathbb{R}^k$에 대응시키고 싶다고 할 때, 

$doc_i$와 $doc_j$의 유사도가 $\left< v_i | v_j \right>$가 되도록 $v_1$, $cdots$, $v_n$을 정하고 싶은 것이다.

유사도는 모든 pair에 대해 존재하기 때문에 $\mathscr{O}(n^2 )$개의 relation을 만족시켜야 하고, 

각 vector들의 undetermined components의 갯수는 $n \times k$이므로, vector space 의 dimension(=the length of vectors)은 optimal하게 잡으면 $\mathscr{O}(n )$, 특정 성질을 더 만족하게 하거나 직관적인 embedding을 사용하면 그보다 더 커야 해서 space 의 dimension은 매우 큰 편이다.

이렇게 embedding한 벡터들을 연산할 때는 inner product나 matrix operation을 활용해야 하므로 operation complexity가 대략$\mathscr{O}(n^2 )$인 연산을 활용하게 되는데, 계산량이 많아서 어떻게 계산하는 것이 효율적인지 공부하는 방향으로 찾아봐야 할 듯 하다.


또 doc2vec에서는 대표적으로 빈도수를 세어 각 단어가 얼마나 자주 나타나는지를 vector로 표현하는데, 

단순히 빈도수만 세는 것이기 때문에 단어들의 순서구조가 만드는 의미가 생략되는 단점이 있지만, embedding의 방법이 직관적이고, 생각보다 좋은 결과를 낸다고 한다.(더 찾아봐야 알 수 있는 내용이지만, 아마도 큰 수의 데이터를 활용했을 때의 이야기일 듯 하다.)

doc2vec의 범위는 document, paragraph, sentense등 여러 가지로 설정하여 활용하는 듯 하다.

'언어 공부 > ML(NLP)' 카테고리의 다른 글

preprocessing  (0) 2018.06.19
word2vec, doc2vec 읽기 시작.  (0) 2018.06.07

GiChang Lee님의 Ratsgo Blog에 정리되어 있는 내용을 기준으로 필요한 material을 읽기 시작.

코딩과 자료구조에 관한 책만 보고 공부하다가 오랜만에 ArXiv article을 보니까 기분이 묘하다. 다시 제대로 공부해야 할 것 같은 기분도 들고.

조금 더 빨리 공부했어야 한다고 생각하지만, 그래도 늦게나마 시작해서 다행이라고 생각한다.


ML에 대해서는 큰 흐름만 공부하고, 각각의 방법론을 구현하거나 테스트하진 않았다.

통계보다 선형대수를 많이 사용하는 SVM이나 embedding을 이용한 방법을 먼저 공부하는 게 좋겠구나 막연히 생각만 했지.


MathPresso에 지원하면서 자연어 처리에 관해 읽을거리를 찾다 보니 word2vec이나 doc2vec에 대해 찾게 되었다.


처음 clustering이나 SVM을 찾을 때의 개념이 data를 분류/라벨링 하는 방법에 관한 것이라는 것을 대략 알았음에도

음성신호나 텍스트를 벡터로 변환하는 과정에 대해선은 완전히 blackbox라서 답답했었다.

vectorization이라는 키워드로 찾아봐도 이렇다할 읽을거리가 없어서 나중으로 미뤄 두었는데 자연어 처리를 찾으니 바로 나와서 당황.

어쨌든 이렇게 좋은 블로그에서 좋은 자료들을 많이 발견하게 되어서 다행이라고 생각한다.

한편으론 공부할 게 갑자기 폭발해서 조금 부담스럽긴 하지만 뭘 해야 할지 몰라서 혼란스러운 것 보다는 할 게 너무 많아서 고민인 게 나으니.


블로그와 ArXiv자료를 읽으면서 시간나는 대로 matrix연산에 필요한 함수들을 library로 만들어보면 어떨까 싶은 생각도 들었다.

library자체는 만들어져 있는 것보다 못하겠지만 하면서 코딩이 손에 더 익으면 좋고.


'언어 공부 > ML(NLP)' 카테고리의 다른 글

preprocessing  (0) 2018.06.19
알게 된 조각조각의 나열. (word2vec, embedding, linear algebra)  (1) 2018.06.12

+ Recent posts