lda 관련 라이브러리간 궁합

gesim 안에 있는 LdaModel을 사용하다가, MalletLda를 사용하게되었다. 왜냐면, 참조 소스에 그렇게 되어 있어서…

그런데 LdaModel-> pyLDAvis는 잘 동작하는 반면 MalletLda는 에러를 내면서 죽는다.

다행히도 변환함수가 있어서, 그걸로 변환 가능

 

Topic Modeling with Gensim(Python)

1. 소개

자연언어 처리의 주요 어플리케이션중 하나는 커다란 볼륨의 텍스트로부터 사람들이 어떤 주제에 대해서 이야기하는지 자동으로 토픽을 추출하는 것입니다. 큰 텍스트의 예로는 소셜 미디어의 피드, 호텔, 영화등의 고객 리부, 사용자 피드백, 뉴스기사, 고객불만사항 전자메일 등이 있습니다. 사람들이 무엇을 원하는가를 알고 그들의 문제와 의견을 이해하는것은 사업이나, 관리, 정치 캠페인에 유용합니다. 그리고 그렇게 많은 양을 직접 읽고 주제를 이해하는 것은 정말 어렵습니다. 따라서 텍스트를 읽고 논의된 주제를 출력할 수 있는 자동화된 알고리즘이 필요합니다. 이 튜토리얼에서는 ’20개의 뉴스그룹’ 데이터세트의 실제 예제를 사용하고 LDA를 사용하여 있는 그대로의 논의된 주제를 추출해낼 것입니다. Gensim 패키지에 있는 Latent Dirichlet Allocation(LDA)를 사용할 것이고, (Gensim을 통해) Mallet’s의 구현도 함께 사용할 것입니다. Mallet은 LDA를 효율적으로 구현하였습니다. 더 빠르게 수행되고 더 좋은 토픽을 제시해주는 것으로 알려져있습니다. 우리는 또한 각 토픽의 양과 기여도 비율을 추출하여 얼마나 중요한 주제인지를 알아보도록 하겠습니다.

시작해봅시다.

2. 사전 준비 – nltk stopwords와 spacy 모델 다운받기

텍스트 전처리를 위하여 NLTK의 stopwords와 spacy의 en 모델이 필요합니다. 나중에 우리는 표준형변환(lemmatization)을 위하여 spacy 모델을 사용할 것입니다. 표준형변환(Lemmatization)은 근원 단어로 변환하는 것입니다. 예를들어 ‘machines’의 lemma 단어는 ‘machine’입니다. 마찬가지로, ‘walking’ -> ‘walk’,’mice’ -> ‘mouse’ 등입니다.

 

3. Import Packages

이 튜토리얼에서 사용할 핵심 패키지는 re , gensim , spacy , pyLDAvis  입니다. 이외에 우리는 matplotlib , numpy , pandas 를 사용하여 데이터를 다루고 시각화 할것입니다. 이것들을 import 합시다.

 

4. LDA는 무엇을 합니까?

토픽 모델링에 대한 LDA의 접근방식은 각 도큐먼트를 특정 비율의 토픽의 집합으로 가정합니다. 그리고 다시, 각 토픽은 다시 각 키워드의 일정 비율로 구성됩니다.알고리즘에 토픽의 개수를 입력하면, 문서 내에서의 토픽 분포화 토픽 안에서의 키워드 분포를 재정렬하여 토픽-키워드 분포의 적절한 구성을 얻을 수 있습니다. 토픽을 말할때, 실제로 그리고 어떻게 표현되는가? 토픽은 일반적으로 표현되는 지배적인 키워드의 모음입니다. 키워드를 살펴보는것만으로 주제가 무엇인지를 파악할 수 있습니다.

좋은 토픽 구분을 얻기 위한 핵심 요소는 다음과 같습니다.

  1. 처리된 텍스트 데이터의 품질
  2. 텍스트가 말하고자하는 토픽의 다양성
  3. 토픽 모델링 알고리즘의 선택
  4. 알고리즘에 공급된 주제수
  5. 알고리즘 튜닝 파라미터

 

5. Stopwords(불용단어) 준비하기

앞서 우리는 stopwords를 다운로드 하였습니다. 이것을 import 하여 사용하도록 합시다.

 

6. 뉴스그룹 데이터 임포트하기

본 실습을 위하여 ’20개 뉴스그룹’ 데이터를 사용할 것입니다. 이 데이터에는 20개의 서로 다른 주제로 구성된 약 11,000개의 뉴스그룹 게시물이 포함되어 있습니다. 이것은 newsgroups.json 에서 다운로드 가능합니다.

이것을 pandas.read_json  을 통해서 읽으며, 결과 데이터 세트는 보여지는 것 처럼 3개의 컬럼을 가지고 있습니다.

 

7. 이메일 주소와 줄바꿈 문자 제거

보는 것처럼 이메일, 줄바꿈 문자 및 불필요한 공백이 있어서 불편합니다. 이를 정규식을 사용하여 제거하도록 합시다.

 

전자메일과 불필요한 공백을 제거하고나서도 여전히 지저분해보입니다. LDA에서 처리하기에는 부적합합니다. 토큰화를 통해 각 문장을 단어의 list로 분해하면서 처리 과정에서 지저분한 모든 문자를 지워야합니다.

이를 위해서 Gensim의 simple_process  가 적절합니다.

8. 단어 토큰화와 텍스트 클린업

각 문장의 구두점과 불필요한 문자를 제거하여, 단어의 list로 토크나이징합시다. 이작업에는 Gensim의 simple_preprocess() 가 훌륭합니다. 추가적으로 나는 구두점을 제거하기 위해서 deacc=True 로 설정하였습니다.

 

 

9. Bigram과 Trigram 모델 만들기

Bigram은 문서에서 자주 발생되는 2연 단어입니다. Tigram은 자주 발생하는 3연 단어입니다. 이 예에서는 ‘front_bumper’,’oil_leak’,’maryland_college_park’등이 있습니다. Gensim의 Phrases 모델은 bigram, trigram, quadgram 등 그 이상을 구현할 수 있습니다. Phrases에 대한 두가지 중요한 인수는 min_count및 임계값입니다. 이 매개변수의 값이 높을수록 단어가 바이그램으로 결합되는 것이 어렵습니다.

 

 

10. 불용단어(Stopwords)를 제거하고, Bigram을 만들고 표준형변환

Bigram 모델이 준비되었습니다. 불용단어를 제거하고 Bigram을 만들고 표준화할 함수를 정의한뒤 순차적으로 실행합니다.

순서대로 이 함수들을 수행합시다.

 

 

11. 토픽 모델에 필요한 사전과 코퍼스 생성하기

LDA 토픽 모델의 두가지 주요 입력갑은 사전(id2word)와 코퍼스 입니다. 이것들을 만들어 봅시다.

Gensim 은 문서안의 각 단어에 대해서 유니크한 ID를 만듭니다. 위에 표시된 생성된 코퍼스는 (word_id, word_frequency의 매핑입니다. 예를들어, 위의 (0,1)은 첫번째 문서에서 단어 ID 0이 한번 발생한다는 것을 의미합니다. 마찬가지로, id 1단어는 2번 나옵니다. 이것이 LDA 모델의 입력으로 사용됩니다. ID가 어떤 단어를 나타내는지 알고 싶으면 사전에 id를 키로 넘기면 알 수 있습니다.

 

또는 사람이 이해할수 있는 형태의 코퍼스를 만들수도 있습니다.

이제 다음 단계로 돌아가봅시다. : 토픽 모델 만들기

12. 토픽 모델 만들기

이제 LDA 모델을 훈련하기 위한 모든 것을 준비했습니다. 코퍼스와 사전 외에도 토픽 개수를 제공해야합니다. 그 외에도, 알파와 에타는 토픽의 희소성에 영향을 주는 하이퍼파라미터입니다. Gensim docs에 따르면 기본값은 모두 ‘1.0/num_topics’ 을 기본값으로 사용합니다.

chunksize는 각 훈련 chunk에서 사용할 문서의 수입니다. update_every는 모델 매개변수를 업데이트해야하는 빈도를 결정하고, passes는 총 훈련 과정 수를 결정합니다.

 

13. LDA 모델의 토픽 보기

위의 LDA 모델은 각 토픽이 키워드의 조합이고 각 키워드가 토픽에 일정한 가중치를 부여하는 20개의 주제로 구성됩니다.  lda_model.print_topics()  를 사용하여 각 토픽의 키워드와 각 키워드의 중요도(가중치)를 볼수 있습니다.

 

이걸 어떻게 해석할까요?

토픽0은 _0.016“car” + 0.014“power” + 0.010“light” + 0.009“drive” + 0.007“mount” + 0.007“controller” + 0.007“cool” + 0.007“engine” + 0.007“back” + ‘0.006“turn”로 표현됩니다.

이 토픽에 대해 기여하고 있는 상위 10개 키워드는 ‘car’,’power’,’light’ 등 이며 토픽0에 대한 ‘car’의 가중치는 0.016 입니다. 가중치는 키워드가 해당 토픽에 얼마나 중요한지 반영합니다. 이러한 키워드를 보면 토픽이 무엇인지를 짐작할 수 있습니까? 요약해보면, ‘car’나 ‘automobile’ 일수 있습니다. 마찬가지로 다른 토픽 키워드를 살펴보고 토픽이 무엇인지를 판단할 수 있습니까?

 

14. 모델 난이도와 일관성 점수 계산하기

모델 난이도와 토픽 일관성은 토픽 모델이 얼마나 훌륭한지 판단할 수 있는 편리한 수단을 제공합니다. 내 경험에서는 특히 토픽 일관성 점수가 더 도움이 되었습니다.

일관성 점수는 0.53이 나왔습니다.

15. 토픽-키워드 시각화하기

LDA모델이 완성되었으므로 다음 다계는 생성된 토픽과 키워드를 검사하는 것입니다. pyLDAvis패키지의 대화형차트가 가장 훌륭하며 jupyter notebook과 잘 동작합니다.

예시 그림
예시 그림

어떻게 pyLDAvis의 결과물을 추론할 수 있을까요? 왼쪽 표의 각 버블은 토픽을 나타냅니다. 버블이 클 수록 그 토픽이 더 일반적입니다.(역주:특성화되지 않고 여러 단어가 등장한다는 의미) 좋은 토픽 모델은 하나의 사분면에 클러스터되지 않고 차트 전체에 흩어져있는 상당히 크고 겹치지 않는 버블을 가질 것입니다. 너무 많은 토픽을 가진 모델으 일반적으로 차트의 한 영역에 클러스터된 작은 크기의 버블이 많이 겹치게 될 것입니다. 이제, 버블중 하나로 커서를 이동하면 오른쪽의 단어와 막대가 업데이트 됩니다. 이 단언느 선택한 주제를 형성하게 하는 주도적인 키워드입니다. 우리는 성공적으로 좋은 토픽모델을 만들었습니다.

문서 그대로의 토픽 수에 대한 사전 지식이 있기때문에 최상의 모델을 찾는것은 직관적이었습니다. 다음으로, Mallet의 LDA알고리즘을 사용하여 이 모델을 개선한다음, 큰 텍스트 코프스가 주어질 때 취적의 토픽 수에 도달하는 방법을 알아보겠습니다.

16. LDA Mallet 모델 만들기

지금까지는 Gensim내장 LDA알고리즘을 살펴보았습니다. 그러나 Mallet 버전은 종종 더 나은 토픽을 제공합니다. Gensim은 Gensim 자체적으로 말렛의 LDA를 구현하는 래퍼를 제공합니다. zip파일을 다운로드 하고 압축을 풀고 압축이 해제된 디렉토리에 있는 Mallet 경로를 gensim.models.wrappers.LdaMallet 에 제공하기만 하면 됩니다.(역주: Window에서는 MALLET_HOME변수에 Mallet의 home directory 경로를 설정해 주어야합니다.) 어떻게 하면 되는지 살펴봅시다.

 

LDA알고리즘을 변경하는 것 만으로 일관성 점수를 .53에서 0.64으로 올렸습니다. 좋네요.

 

17. LDA에 대한 최적의 토픽수를 찾는 방법은 무엇인가?

최적의 주제수를 찾는 접근방식은 토픽수(k)가 다른 여러 LDA모델을 작성하고 가장 높은 일관성 값을 제공하는 LDA모델을 선택하는 것입니다. 토픽 일관성의 급속한 성장의 끝을 나타내는 ‘k’를 선택하는 것은 일반적으로 의미있고 해석 가능한 토픽들을 제공합니다. 더 높은 값을 선택하면 때로는 보다 세부적인 하위주제를 제공할수도 있습니다.

여러 주제에서 동일한 키워드가 반복되는 경우 ‘k’가 너무 크다는 것일 수 있습니다.

compute_coherence_values() (아래참조)는 여러 LDA모델을 교육하고 모델및 해당 하는 일관성 점수를 제공합니다.

 

일관성 점수가 계속 증가하는 것으로 보인다면 낮아지기 전에 가장 높은 CV를 얻은 모델을 선텍하는 것이 바람직 할 수 있습니다. 이것은 바로 이 케이스에 해당합니다.

그래서 다음 단계를 위해서 20가지 토픽을 가진 모델을 선택합니다.

선택된 LDA모델에 대한 토픽들입니다.

18. 각 문장에서 지배적인 토픽 찾기

토픽 모델링의 실제 적용중 하나는 주어진 문서가 어떤 토픽인지 판단하는 것입니다. 이를 찾아내기 위해, 해당 문서에서 가장 높은 비율로 기여한 토픽 번호를 찾아야합니다. 아래의 format_topics_sentences()  함수는 이 정보를 알기쉽게 테이블로 집계하여 표시하여줍니다.

 

19. 각 토픽별로 가장 대표적인 문서 찾기

때때로 토픽 키워드만으로는 토픽이 무엇인가 이해할수 없을 수도 있습니다. 따라서 토픽을 이해하는데 도움이 되도록 주어진 토픽이 가장 많이 기여한 문서를 찾아 해당 토픽을 추론하여 토픽을 추론할 수 있습니다.

위의 표 출력에는 실제로 토픽에 대해 각각의 20개의 행이 있습니다. 토픽번호, 키워드 및 가장 대표적인 문서가 있습니다. Perc_Contribution열은 주어진 문서에서 토픽이 차지하는 비율입니다.

20. 문서 전체적인 토픽 분포

마지막으로 토픽의 양과 분포를 이해하여 토픽이 얼마나 넓게 논의되었는지 판단합니다. 아래 표는 해당 정보를 제공합니다.

 

20. 결론

우리는 토픽모델링이 할수 있는 것을 이해하는 것으로 시작을 했습니다. Gensim의 LDA사용하여 기본 토픽 모델을 작성하고 pyLDAvis를 사용하여 토픽을 시각화했습니다. 그 다음 말렛의 LDA구현을 이용했습니다. 토픽 일관성 점수를 사용하여 최적의 주제수를 찾는 방법과 최적의 모델을 선택하는 방법을 논리적으로 이해하는 방법을 보았습니다.

마지막으로 결과를 집계하고 제시하여 실용적인 통찰을 얻는 방법을 살펴보았습니다. 당신이 이 글을 재밌게 보았으면 좋겠습니다. 아래 코멘트 섹션에 의견을 남겨주시면 감사하겠습니다.

 

LDA

LDA(Latent Dirichlet Allocation) : 잠재 디리클레 할당

LDA는 이산 자료들에 대한 확률적 생성 모형이다. 문자 기반의 자료들에 대해 쓰일 수 있으며 사진 등의 다른 이산 자료들에 대해서도 쓰일 수 있다. 기존의 정보 검색분야에서 LDA와 유사한 시도들은 계속 이루어져 왔다. TF-IDF를 필두로 하여 잠재 의미 분석(Latent semantic indexing, LSI), 확률 잠재 의미 분석(Probabilistic latent semantic analysis, pLSA)등을 거쳐 LDA로 도달하게 된다. 확률 잠재 의미 분석은 확률 잠재 의미 인덱싱(probabilistic latent semantic indexing, pLSI) 라고도 한다.

LDA에는 몇 가지 가정이 있는데 그 중 중요한 것은 단어의 교환성(exchangeability)이다. 이는 ‘단어 주머니(bag of words)’라고 표현하기도 한다. 교환성은 단어들의 순서는 상관하지 않고 오로지 단어들의 유무만이 중요하다는 가정이다. 예를 들어, ‘Apple is red’와 ‘Red is apple’ 간에 차이가 없다고 생각하는 것이다. 이 가정을 기반으로 단어와 문서들의 교환성을 포함하는 혼합 모형을 제시한 것이 바로 LDA이다.

하지만 LDA의 교환성의 가정을 확장 시킬 수 도 있다. 단순히 단어 하나를 단위로 생각하는 것이 아니라 특정 단어들의 묶음을 한 단위로 생각하는 방식(n-gram)도 가능하다.

LDA는 단순히 문서의 주제를 찾는데 쓰이는 것이 아니라 이미지, 소리 등 다양한 영역에서 쓰일 수 있다.

그리고 LDA는 이산 자료들, 즉 불연속 적인 자료들 뿐만 아니라 연속적인 자료들에 대해서 적용 할 수 있는 가능성이 있고 또한 다항 분포가 아닌 자료들에 대해서도 적용 할 수 있는 가능성이 있다.  LDA- 위키피디아

아티클

참고자료