단어 임베딩을 이용한 추출적 텍스트 요약 기법

Posted by 적분 ∫2tdt=t²+c
2019. 2. 8. 01:58 그냥 공부

오늘 살펴볼 논문은 추출적 텍스트 요약 기법(Extractive Text Summarization)에 단어 임베딩을 적용하는 간단한 방법을 통해 비지도 방법으로 높은 텍스트 요약 성능을 보인 기법에 대한 것입니다. 아이디어는 정말로 간단한데 성능이 강력하니 이보다 좋을 수 없지요. 간략하게 어떤 기법인지 살펴보도록 하겠습니다.


Rossiello, G., Basile, P., & Semeraro, G. (2017). Centroid-based text summarization through compositionality of word embeddings. In Proceedings of the MultiLing 2017 Workshop on Summarization and Summary Evaluation Across Source Types and Genres (pp. 12-21).


추출적 텍스트 요약 기법

앞서 텍스트 요약 기법에 대해 정리했었지만, 추출적 요약 기법에 대해 간략하게 다시 설명하도록 하겠습니다. 추출적 텍스트 요약 기법이라 함은 1) 원본 문헌을 특정 단위(대게 문장)로 분할하고, 2) 분할된 각 단위의 중요도를 평가한 뒤, 3) 중요도가 높은 단위들만을 추출하여 요약문을 구성하는 방법을 말합니다.


여기서 중요도를 어떻게 평가하느냐가 추출적 텍스트 자동 요약 기법의 성능을 가르는 핵심이 됩니다. 당연히 문헌 전체의 내용을 잘 드러낼 수 있는 문장일수록 그 중요도가 높다고 할 수 있을텐데요, 이를 위해 문장들 간의 유사도를 계산하고, 그것들을 바탕으로 모든 문장들 중에서 가장 중심성이 높은 문장을 찾는 방법을 사용할 수 있겠습니다.

그러면 두 문장이 유사한지는 어떻게 판단할 수 있을까요? 가장 원초적인 방법으로는 두 문장 사이에 겹치는 단어가 얼마나 있는지 세는 것일 겁니다. 조금 더 고급스럽게 이야기하면, 용어 빈도(term frequency, tf)를 이용한 유사도 척도라는 표현을 쓰기도 하죠. 그리고 이를 좀더 고도화하여 중요한 용어에는 더 높은 가중치를 부여하도록 한 tf-idf를 이용한 유사도 척도를 쓸 수도 있습니다.


이런 고전적인 단어 빈도 기반의 접근법은 두 문장 사이에 일치하는 단어가 있어야만 그 유사도가 계산이 됩니다. 따라서 두 문장이 아무리 유사한 이야기를 하더라도 둘 사이에 겹치는 단어가 하나도 없다면 둘의 유사도는 0이 될 수 밖에 없습니다. 이는 단어주머니 모델(Bag of Words Model)의 큰 한계입니다.


단어 임베딩을 이용한 문장 유사도 계산

BOW 모델의 한계를 지적하면서 뒤따라 나오는 이야기는 늘 단어 임베딩 기법입니다. (패턴이 뻔하죠..) 단어 임베딩 기법은 개별적인 단어를 특정한 차원의 벡터(벡터 공간 상의 점)로 매핑해주기에, 서로 다른 단어들끼리의 거리 계산, 여러 산술 연산이 가능해집니다. 따라서 이를 이용하면 두 문장 사이에 공통 단어가 존재하지 않더라도 의미적으로 유사하다면 그 유사도를 구해낼 수 있습니다. 이러한 단어 임베딩 기법 중 대표적인 것엔 Word2Vec이 있습니다.


본격적으로 저자들이 어떻게 단어 임베딩을 자동 요약에 적용했는지를 살펴보도록 하겠습니다. 먼저 미리 학습된 Word2Vec 임베딩을 이용하면 문장 내의 각 단어들을 하나의 벡터로 표현할 수 있습니다. 그런데 단어를 벡터로 만드는 것은 간단했지만, 여러 단어가 모여 만들어진 문장을 벡터로 만드는 것은 생각보다 어렵습니다. 저자들은 정말 단순하게 문장 내에 등장하는 모든 단어들의 벡터 값을 합하는 것으로 문장 전체의 임베딩을 구하는 방식을 제안했습니다. 수식으로 옮기자면 다음과 같겠습니다.


(여기서 S_j는 임의의 문장, E(S_j)는 S_j의 N차원 임베딩, V_w는 단어 w에 대한 N차원 임베딩)


그리고 이 때 두 문장 간의 유사도는 다음과 같이 정의합니다.

(수식으로는 복잡해보이지만, 사실은 코사인 유사도 공식입니다.)


중심점(Centroid)을 이용한 문장의 중요성 판단

사실 본 논문에서는 문장 간의 유사도를 가지고 중요성을 판단하기보다는, 문헌의 중심점(Centroid)와 문장의 유사도를 가지고 그 중요성을 판단합니다. 여기서 문헌의 Centroid라고 함은, 전체 문헌의 내용의 중심이 되는 임베딩 벡터를 가리킵니다. 즉 이 중심점에 가까울수록 문헌의 주 내용과 유사한 것이라고 판단할 수 있고, 이런 문장들만 추려내면 전체 문헌의 내용을 잘 표현하는 요약문이 생성될 수 있다고 가정할 수 있겠습니다.


그럼 문헌의 Centroid는 어떻게 구할 수 있을까요? 저자들은 고전적이면서 간단한 방법을 제안했습니다. 문헌 내에 등장하는 단어들 중 tf-idf 값이 특정한 값 이상인 경우들만 골라내, 이 단어들의 임베딩 값을 합한 것을 Centroid로 쓰기로 한 것이죠. tf-idf 가중치 값은 문헌 집합 내에서 골고루 등장하는 것이 아니라 현재 문헌에서만 집중적으로 자주 등장하는 용어들에 대해서 높은 점수를 부여하는 특성이 있습니다. 따라서 tf-idf값이 높은 용어는 그 문헌의 중요 단어, 즉 키워드일 가능성이 높습니다.


중심점 계산 공식을 형식적으로 쓰자면 다음과 같습니다.

(여기서 D는 문헌, f(w)는 단어 w의 tf-idf 가중치 값, tt는 가중치 임계값)


마지막으로 문장의 중요성은 중심점과 해당 문장과의 유사도로 계산할 수 있습니다.


실제 예시를 봅시다. 다음 예시는 논문에서 가져온 것입니다.

arcadedonkeykonggamenintendocolecoCent
arcadesgoathonggameplaymariointellivisionnes
pac-manpigmacaomultiplayerwiiatarigamecube
consolemonkeyfungvideogameconsoleneskonami

위의 arcade, donkey, kong, game, nintendo, coleco라는 단어는 Donkey Kong이라는 영어 위키백과 문헌에서 tf-idf 가중치가 0.3 이상인 것만 골라낸 결과입니다. 그 아래에는 Word2Vec을 통해 계산한 각 키워드별 유사 단어 Top3이구요. 제일 오른쪽의 Cent는 arcade, donkey, kong, game, nintendo, coleco의 임베딩 벡터를 합하여 Centroid를 구성하였을때 이와 Word2Vec 상에서 가장 유사한 단어 3개를 보여줍니다. 이를 통해 Centroid가 문헌 전반의 의미를 비교적 잘 잡아내고 있다는 것을 알 수 있습니다.


그럼 실제 Centroid와 제일 유사도가 높은 문장들에는 어떤 것들이 뽑히는지 살펴봅시다.

이 역시 논문에서 가져온 예시인데요, 보시다시피 Donkey Kong이라는 게임에 대한 내용과 관련이 깊은 문장들이 주로 선택된 것을 확인할 수 있습니다.


문장 추출 및 요약문 생성

각 문장의 중요성 점수 Score(S_j)를 계산했다면, 이제 Score가 높은 문장들을 추려 요약문을 생성할 단계입니다. 이는 간단합니다. 모든 문장들의 Score를 계산한 뒤, 이를 내림차순으로 정렬하여 Score가 높은 값부터 차례대로 후보에 추가해나갑니다. 이를 후보들 전체의 길이가 원하는 길이에 도달할때까지 반복합니다. 최종적으로 후보에 있는 문장들을 이어서 출력하면 이것이 요약문이 됩니다.


사실, 이 방법은 한 가지 문제가 있습니다. Score가 매우 높은 문장들은 모두 Centroid와 유사도가 높으니, 서로 간의 유사도도 높을 수 밖에 없습니다. 이 문장들을 그대로 다 요약문에 넣을 경우 요약문에 유사한 문장들이 반복되어 장황함(redundancy)이 높아지겠죠. 따라서 후보에 이미 비슷한 문장이 있다면 또 추가하지 않도록 배제하는 것이 조금 더 나은 요약문을 생성할 수 있습니다. 이를 고려해 문장 추출 알고리즘을 정리하자면 다음과 같이 되겠습니다.


  1. 모든 문장들의 집합 S에 대해 각각 Score(s)를 계산
  2. Score(s)를 기준으로 S를 내림차순 정렬
  3. Cand는 빈 리스트로 설정
  4. S 내의 각 문장 s에 대해 다음을 반복
    1. (Cand 전체의 길이) > LIMIT 이면 반복문을 탈출
    2. sim(s, t) > STtCand가 존재하지 않는다면
      1. Cand에 문장 s를 추가
  5. Cand 내의 문장들을 연결하여 요약문 출력

이때 LIMIT은 전체 요약문의 길이를 지정하는 상수값이며, ST는 중복 용인 한계를 지정하는 상수값입니다.


실험 결과

그러면 실제 실험 결과를 살펴보도록 합시다. 다음은 DUC-2004에 대해 진행한 실험입니다.

R1는 Rouge-1 Score, R2는 Rouge-2 Score를 의미합니다.

C_BOW는 Centroid BOW로 단어임베딩을 적용안 한 모델, C_GNEWS는 Google News Datasets을 이용한 Word2Vec을 사용한 모델, C_CBOW는 입력데이터로 Word2Vec CBOW를 학습하여 사용한 모델, C_SKIP은 입력데이터로 Word2Vec Skipgram을 학습하여 사용한 모델입니다. Skipgram을 사용한 경우가 기존보다 높은 성능을 보였으며, 이 때 tt = 0.3, st = 0.94였습니다.


모델이 단순한 것치고는 기존의 방법들보다 높은 성능을 보였는데, 이는 단어 임베딩 덕분이라고 볼 수 있습니다. 또한 discussion에서 나온 이야기로는 tt값을 낮춰서 문헌 내의 모든 단어를 centroid에 만드는데에 사용할 경우 C_BOW만도 못한 성능을 보인다고 합니다. 즉 다시 말하면, 좋은 centroid를 찾는 것이 성능을 높이는데에 필수적이라는 것이죠. 이 부분은 단순히 tf-idf를 이용하는 것보다 더 세련된 방법을 이용할 수 있다면 개선의 여지가 있을 것 같습니다.



위의 결과는 MultiLing MSS 2015 데이터셋에 대해 실험을 진행할 결과입니다. LEAD와 C_BOW는 Baseline이라고 볼 수 있으며, ORACLE은 자동 요약 시스템이 낼 수 있는 성능의 상한점이라고 볼 수 있습니다. C_W2V가 제안한 방법을 가지고 얻은 실제 점수인데, 영어의 경우 최고 시스템을 앞지르는 결과를 냈으며, 독일어, 스페인어, 프랑스어의 경우 최저 시스템을 앞서는 점수를 냈습니다. 반면 이탈리아어의 경우는 최저 시스템에 못 미치는 결과를 냈습니다.


이탈리아어의 성능이 낮은 원인은 이탈리아어의 특성상 굴절이 많아 어휘의 수가 많은데 이를 Word2Vec이 학습하는데에 어려움을 겪기 때문이라고 저자들은 설명했습니다.


MSS에 제출된 시스템들의 경우 높은 성능을 달성하기 위해서 복잡한 기법들을 사용했어야 했는데, 본 논문에서 제안하는 기법은 단순한 시스템에 단어 임베딩을 조합하는 것만으로 복잡한 기법들과 유사한 성능을 달성했다는 데에서 의미가 있다고 볼 수 있겠습니다.


저자들이 친절하게 코드도 공개해주었습니다. 사실 방법이 단순해서 직접 구현해도 어렵지 않아보이지만 코드 공개해주는것처럼 감사한 일도 없지요.

https://github.com/gaetangate/text-summarizer


마무리

장황하게 설명했지만, 결국 한 줄 요약하자면, Word2Vec을 이용해서 문장의 임베딩과 Centroid의 임베딩을 얻고, Centroid와의 코사인 유사도가 높은 문장들을 뽑아서 요약문을 생성하면 의외로 좋은 성능을 얻을 수 있다는 것입니다. 기법이 참 간단하긴 한데, 종종 이렇게 해도 되는건지 아쉬운 지점들도 있었습니다. 정리해보니 크게 다음과 같네요

  1. Centroid나 문장의 임베딩을 계산할때 단순히 각 단어들의 임베딩을 합하여도 되는 것인지?
  2. tf-idf 가중치로 단어를 골라냈는데, 이게 Centroid를 계산하는 최선의 방법인 것인지?
  3. tt, st 값에 전체 성능이 크게 좌우되는데, 적절한 tt, st 값을 어떻게 선정할 수 있는지?

특히 1번이 많이 걸렸습니다. 그저 단어의 임베딩을 더하여 전체 문장의 임베딩을 구하기 때문에, 단어들 간의 순서가 무시되고, 임베딩 벡터를 더하는 과정에서 각 단어의 의미들이 희석될 수 밖에 없다는 염려를 떨칠 수가 없었네요. LSTM을 이용해 문장을 바로 임베딩하는 식의 방법으로 조금더 정밀하게 개선할 수 있을 것 같습니다.


그리고 Centroid가 반드시 필요한지도 의문입니다. TextRank를 이용한 요약 기법에서는 굳이 Centroid를 가정하지 않고, 문장 간의 유사도 네트워크에서 PageRank를 수행하여 각 문장의 중요성을 계산하는 방식을 사용했습니다. 이런 방법을 적용하면 어떤 다른 결과가 나올지도 흥미로운 부분입니다. 시간이 되면 실험해봐야겠네요.

이 댓글을 비밀 댓글로