sklearn / 문장 특징 추출과 유사도 측정

: Scikit-Learn의 text 특징추출과 벡터화를 통한 유사도 측정 (CountVectorizer, TfidfVectorizer, HashingVectorizer)


문장 특징추출 준비

CountVectorizer (API Reference)

: 문서목록에서 각 문서의 feature(문장의 특징) 노출수를 가중치로 설정한 BOW 벡터를 만든다.

위 처럼 CountVectorizer 로 dtm 을 만들면, 아래 그림과 같이 각 문장에서 feature 가 되는 단어들이 몇 번이나 노출 되는지 알 수 있다.

count-dtm

이제 CountVectorizer DTM에서 내가 원하는 유사한 문장을 찾아보자.

단순히 내가 원하는 문장을 search 라고 하고, search 문장이 위에서 만든 dtm 이 가지고 있는 feature 를 기준으로 어떻게 구성이 되는지 알아보고 그 feature 들이 노출되는 수의 합을 구하면 유사한 문장들을 구할 수 있다.

위 srch_dtm 은 다음과 같은 모습을 갖는다

srch-count-dtm

이제 각 feature의 합을 구해서 어느 문장(row)이 가장 점수가 높은지 그리고 높은 순서대로 rawdata 에서 문장을 뽑아보자

결과를 보면 문장이 가지고 있는 feature 의 빈도수 기준으로 뽑다보니 원하는 주제와는 다른 문장이 상위에 노출되었다. 이런 CountVectorizer의 특징은 모든 feature 가 동일한 점수를 가지고 있는 관계로 주제에서 중요하지 않은 feature가 빈번히 반복되는 단어가 노출 되는 경우에는 원하는 결과를 어렵게 만들기도 한다.

TfidfVectorizer (API Reference)

: 문서목록에서 각 문서의 feature를 tf-idf 값을 가중치로 설정한 BOW 벡터를 만든다. (TF-IDF에 대한 참고)

위 처럼 TfidfVectorizer 로 dtm 을 만들면, 아래 그림과 같이 각 문장에서 tfidf 값을 가중치로 설정한 행렬을 볼 수 있다.
tfidf-dtm

위 CountVector에서 유사문장을 뽑아낸 방법을 동일하게 TfidfVector에 적용해보자.

결과를 보면 하나의 feature가 가지는 score가 문장별로 다르게 적용 되어 있어, 유사 문장을 추출했을때 비교적 주제에 가까운 문장들이 상위에 노출 된 것을 볼 수 있다.

HashingVectorizer (API Reference)

: CountVectorizer, TfidfVectorizer 와 달리 벡터화 할때 모든 feature 에 대해 사전을 만들지 않고, 해싱함수를 통해 벡터안의 인덱스를 특정하도록 한다. 큰 사전을 만들 필요가 없어 메모리 소모가 적어 대용량 텍스트를 벡터화 할때 많이 쓰인다. (Hashing Trick에 대한 참고)

위 처럼 HashingVectorizer에서 리턴받은 벡터화된 모든 문서(rawdata)의 형태로는 어떤 feature 가 들어가 있는지 조차 알기 어렵다. 또한 HashingVectorizer 는 사전을 저장하지 않으므로 지금까지 해온 dtm 으로 특정 feature 의 column 의 score 를 구하는 방식은 사용하기 어려울 듯하다.

이제 좀 더 간단한 방법으로 유사 문장을 찾아보자. 다음은 문장 유사도 측정을 위해 이미 만들어진 벡터 X와 search 문장 벡터를 내적해서 (코사인 유사도) 를 구하고 유사문장을 찾는 과정을 보여준다.

Proudly powered by WordPress | Theme: Baskerville 2 by Anders Noren.

Up ↑