Java에서 주제 분석(LDA)

7625 단어 NLP자바LDA

이 페이지 정보



JavaFX & 자기 완결형 패키지의 연습을 하려고 했지만,
어차피라면 사용할 수 있는 툴을 만들고 싶고, LDA로 할까.
여기에서는 LDA on Java에 대해 정리하고 있습니다.
JavaFX & 자가 완결형 패키지에 대해서는 본말에 기재된 링크로부터 참조해 주세요.

LDA란 무엇입니까?



자연언어 처리에서 지정한 문서군에서 주제를 추정하는 (범용적인) 기계 학습 기법 중 하나입니다.
2019년 현재는 딥 러닝이 활발하지만, 그 이전의 NLP 경계에서는 수많은 정밀도 향상에 출장하고 있었다.
논리에 대해서 읽고 싶은 분은, 이하 페이지등이 읽기 쉽고 추천입니다.

Latent Dirichlet Allocation (LDA) 푹신한 입문 더 발췌

LDA는 하나의 문서가 여러 주제로 구성된다고 가정한 언어 모델의 일종입니다.
일본어라면 「잠재적 디리클레 배분법」이라고 불립니다.
단어 등을 표층적이라고 표현한다면, 주제는 단어와 달리 표면에는 나타나지 않기 때문에 잠재적입니다.
그 잠재적인 요소의 분포의 사전 분포에 디리클레 분포를 가정하고 어쩌면 '잠재적 디리클레 배분법'이라고 부르는 것일까 생각합니다.
(중략)
디리클레 분포는 자세하게 설명하면 확률 분포의 확률 분포입니다.
예를 들어 3가지 주제 '스포츠', '경제', '정치'가 있었다면
각 주제의 생성 확률 (스포츠, 경제, 정치) = (0.3, 0.2, 0.5)가 될 확률은
0>.1, (스포츠, 경제, 정치) = (0.1, 0.2, 0.7)이 될 확률은 0.2와 같이 확률 분포의 확률을 결정합니다.

구현 정책



LDA의 구현 정책으로는 gensim이라는 Python 라이브러리가 유명한 것 같습니다.
참고 : gensim 입문

후속 JavaFX 앱을 간단하게 하는 관점에서, Python&Java 콜라보레이션은 하지 않고,
GitHub에서 Java의 LDA 구현 예가 공개되었으므로 여기를 빌리기로 결정했습니다. 감사.
※주: 로직의 타당성은 검증하지 않습니다. 나쁘지 않아.

LDA4j라는 이름으로 두 HIT 했습니다만, 이번은 hankcs씨의 모듈을 채용했습니다.
거의 선호합니다.
(인풋이 되는 문서 집합의 잡는 방법으로서 breakbee/LDA4J 그럼 1 파일(1행 1 문서),
hankcs/LDA4j 에서는 복수 파일(1 파일 1 문서)의 차이가 있었지만,
개인적으로 파일별로 선호했습니다)

실행해 보자.




환경
서비스/버전


실행 환경
Windows10

개발 환경
이클립스 4.1.0

개발 언어
자바 8


적당히 모듈을 eclipse로 당긴다.
Github에서 포크 & 클론 or Zip을 다운로드하여 프로젝트를 가져옵니다.
그런 다음 자체 실행 모듈을 만들었습니다. (MainRunner.java)



ReadMe의 말대로….

MainRunner.java
package com.ketman.app;

import java.io.IOException;
import java.util.Map;

import com.hankcs.lda.Corpus;
import com.hankcs.lda.LdaGibbsSampler;
import com.hankcs.lda.LdaUtil;

public class MainRunner {
    public static void main(String[] args)
    {
        // 1. Load corpus from disk
        Corpus corpus;
        try {
            corpus = Corpus.load("data/mini");
            // 2. Create a LDA sampler
            LdaGibbsSampler ldaGibbsSampler = new LdaGibbsSampler(corpus.getDocument(), corpus.getVocabularySize());
            // 3. Train it
            ldaGibbsSampler.gibbs(10);
            // 4. The phi matrix is a LDA model, you can use LdaUtil to explain it.
            double[][] phi = ldaGibbsSampler.getPhi();
            Map<String, Double>[] topicMap = LdaUtil.translate(phi, corpus.getVocabulary(), 10);
            LdaUtil.explain(topicMap);
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
}

실행⇒실행 구성⇒Java 어플리케이션에서 MainRunner를 실행해 봅니다.
콘솔에 다음과 같은 출력이 나올 것.
data/mini 에 포함되어 있는 문서 세트에 대해서, 지정한 수 (10)의 토픽을 추정하고 있습니다.
Sampling 1000 iterations with burn-in of 100 (B/S=20).
BBBBB|S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||S||
topic 0 :
中国=0.0097164123524064
市场=0.007268178259268298
企业=0.006646897977003122
公司=0.006420165848545306
发展=0.005931172520179485
旅游=0.005517115761050293
目前=0.004144655174798414
记者=0.003896963247878764
产品=0.0038405773231741857
服务=0.0036131627315211285

topic 1 :
美国=0.007753386939328633
日本=0.004271883755069139
训练=0.0039382838929572965
系统=0.0038821627109404673
飞机=0.0037908977218186262
部队=0.003713327985408122
军事=0.003662570207063461
进行=0.003548971364140448
作战=0.003465095755923189
装备=0.0033491792847693187

~中略~

topic 9 :
比赛=0.00887335526016362
队员=0.003820752808354389
联赛=0.0034088636107220934
球队=0.0030593385176732896
俱乐部=0.002519739439727434
冠军=0.0025101075962186965
中国=0.002314435002019442
球员=0.0023066510579788685
决赛=0.002282312176369107
记者=0.0022029528425211455

실제로 도구로 활용해 본 이야기


  • JavaFX & 자기 완결형 패키지로의 툴 작성(JavaFX편)
  • JavaFX & 자기 완결형 패키지로의 툴 작성(배포편)
  • 좋은 웹페이지 즐겨찾기