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구현을 이용했습니다. 토픽 일관성 점수를 사용하여 최적의 주제수를 찾는 방법과 최적의 모델을 선택하는 방법을 논리적으로 이해하는 방법을 보았습니다.

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

 

hyper parameters (머신러닝)

Hyper Parameter란

신경망 학습을 통해서 튜닝 또는 최적화 해야하는 주변수가 아니라,
학습 진도율이나 일반화 변수처럼,
사람들이 선험적 지식으로 설정을 하거나 또는 외부 모델 메커니즘을 통해 자동으로 설정이 되는 변수를 말한다.

사례

  1. Learning Rate

    학습진도율은 “gradient”의 방향으로 얼마나 빠르게 이동을 할 것인지를 결정한다. 학습진도율이 너무 작으면 학습의 속도가 너무 느리게 되고, 반대로 너무 크면 학습이 안되고 진동할 수 있다. 학습 진도율도 학습 대상이나 망에 따라 적절히 조절해야한다.

  2. Cost function

    일반적인 최소자승법을 사용할수 도 있고, cross-entropy 함수를 사용할 수도 있다.

  3. Regularization parameter

    overfitting 문제를 피하기 위해 L1이나 L2 regularization 방법을 사용할 수도 있고 거기서 사용하는 일반화 변수는 weight decay의 속도를 조절하기 위한 용도로 사용할 수가 있다.

  4. Mini-batch 크기

    Mini-batch크기가 큰 경우 병렬연산 구조를 사용할 때 효과적일 수 있으며, 크기가 작으면 더 많은 update를 할 수가 있다.

  5. Training 반복횟수

    학습의 조기 종료를 결정하는 변수가 된다.

  6. Hidden Unit의 개수

    Hidden Layer가 많아질수록 특정 훈련 데이터에 더 최적화 시킬수가 있다. 또한 모든 hidden layer의 뉴런의 개수를 동일하게 유지하는 것이 같은 hidden layer의 개수에 뉴런의 개수를 가변적으로 하는 것보다 효과적이다. 또한 첫번째 hidden layer에 있는 뉴런의 개수가 input layer에 있는 뉴런의 개수보다 큰것이 효과적인 경우가 많다.

  7. 가중치 초기화(Weight initialization)

    바이어스는 일반적으로 0으로 초기화가 만히 된다. 하지만 가중치의 경우는 초기화가 하습결과에 큰 영향을 미치기 때문에 주의가 필요하다. 가중치는 보통 [-r, r]의 범위를 가진다. 이때 r은 input layer에 있는 뉴런의 개수 제곱의 역수가 된다. 가령 뉴런의 개수가 6이라면, [-1/36, 1/36] 범위 내에서 무작위로 설정을 한다.

 

이 외에도 많다.