제퍼넷 로고

JAVA에서 Naive Bayes 텍스트 분류기 개발

시간

NaiveBayes-JAVA이전 기사에서 우리는 이론적 배경에 대해 논의했습니다. 나이브 베이 즈 텍스트 분류기 사용의 중요성 기능 선택 기술 텍스트 분류. 이 기사에서는 모든 것을 통합하고 JAVA에서 Naive Bayes 텍스트 분류 알고리즘의 간단한 구현을 빌드 할 것입니다. 분류기의 코드는 오픈 소스이며 (GPL v3 라이센스에 따라) 다음에서 다운로드 할 수 있습니다. 깃허브.

업데이트 : Datumbox Machine Learning Framework는 이제 오픈 소스이며 무료로 제공됩니다. 다운로드. com.datumbox.framework.machinelearning.classification 패키지를 확인하여 Java에서 Naive Bayes Classifier의 구현을 확인하십시오.

Naive Bayes Java 구현

코드는 JAVA로 작성되었으며 다음에서 직접 다운로드 할 수 있습니다. 깃허브. GPLv3에 따라 라이센스가 부여되었으므로 자유롭게 사용하고 수정 한 후 자유롭게 재배포하십시오.

텍스트 분류기는 다항식 나이브 베이 와 함께 모델 Chisquare 피처 선택 연산. 두 기술의 작동 방식에 대한 모든 이론적 세부 사항은 이전 기사에서 다루었으며 자세한 javadoc 주석은 구현을 설명하는 소스 코드에서 찾을 수 있습니다. 따라서이 세그먼트에서는 분류기의 아키텍처에 대한 높은 수준의 설명에 중점을 둘 것입니다.

1. 나이브 베이 클래스

이것은 텍스트 분류기의 주요 부분입니다. 분류기를 훈련시키고 예측에 사용하는 train () 및 predict ()와 같은 메소드를 구현합니다. 이 클래스는 교육 / 예측 전에 문서를 사전 처리하고 토큰 화하기 위해 적절한 외부 메소드를 호출해야합니다.

2. NaiveBayesKnowledgeBase 객체

훈련 결과는 Naive Bayes 분류기에서 사용하는 모든 필요한 정보와 확률을 저장하는 NaiveBayesKnowledgeBase 객체입니다.

3. 문서 객체

구현에서 학습 및 예측 텍스트는 모두 내부적으로 문서 객체로 저장됩니다. 문서 객체는 문서의 모든 토큰 (단어), 통계 및 문서의 대상 분류를 저장합니다.

4. FeatureStats 객체

FeatureStats 오브젝트는 기능 추출 단계 중에 생성 된 여러 통계를 저장합니다. 이러한 통계는 특징 및 등급의 공동 개수 (공동 확률 및 가능성이 추정 됨), 클래스 개수 (사전이 입력으로 제공되지 않은 경우 평가 기준) 및 교육에 사용 된 총 관측치 수입니다.

5. FeatureExtraction 클래스

기능 추출을 수행하는 클래스입니다. 이 클래스는 이후 단계에서 분류 알고리즘에 실제로 필요한 몇 가지 통계를 내부적으로 계산하므로 이러한 모든 통계는 다시 계산되지 않도록 FeatureStats 개체에 캐시되어 반환됩니다.

6. TextTokenizer 클래스

이것은 간편한 설치 텍스트 토큰 화 클래스-원본 텍스트의 전처리, 지우기 및 토큰 화 및 문서 오브젝트로 변환을 담당합니다.

NaiveBayes JAVA 클래스 사용

NaiveBayesExample 클래스에서 NaiveBayes 클래스 사용 예를 찾을 수 있습니다. 샘플 코드의 목표는 텍스트의 언어를 감지하기 위해 간단한 Naive Bayes 분류기를 훈련시키는 예제를 제시하는 것입니다. 분류기를 훈련시키기 위해 처음에는 HashMap에 훈련 데이터 세트의 경로를 제공 한 다음 그 내용을로드합니다.

 //map of dataset files Map<String, URL> trainingFiles = new HashMap<>(); trainingFiles.put("English", NaiveBayesExample.class.getResource("/datasets/training.language.en.txt")); trainingFiles.put("French", NaiveBayesExample.class.getResource("/datasets/training.language.fr.txt")); trainingFiles.put("German", NaiveBayesExample.class.getResource("/datasets/training.language.de.txt")); //loading examples in memory Map<String, String[]> trainingExamples = new HashMap<>(); for(Map.Entry<String, URL> entry : trainingFiles.entrySet()) { trainingExamples.put(entry.getKey(), readLines(entry.getValue())); }

NaiveBayes 분류기는 데이터를 전달하여 학습됩니다. 훈련이 완료되면 NaiveBayesKnowledgeBase 객체가 나중에 사용하기 위해 저장됩니다.

 //train classifier NaiveBayes nb = new NaiveBayes(); nb.setChisquareCriticalValue(6.63); //0.01 pvalue nb.train(trainingExamples); //get trained classifier NaiveBayesKnowledgeBase knowledgeBase = nb.getKnowledgeBase();

마지막으로 분류기를 사용하고 새로운 예제의 클래스를 예측하려면 훈련을 통해 이전에 얻은 NaiveBayesKnowledgeBase 객체를 전달하여 새 분류기를 초기화하기 만하면됩니다. 그런 다음 간단히 predict () 메소드를 호출하여 문서의 예측 된 클래스를 얻습니다.

 //Test classifier nb = new NaiveBayes(knowledgeBase); String exampleEn = "I am English"; String outputEn = nb.predict(exampleEn); System.out.format("The sentense "%s" was classified as "%s".%n", exampleEn, outputEn); 

필요한 확장

특정 JAVA 구현은 복잡한 텍스트 분류 문제에 대해 즉시 사용 가능한 솔루션으로 간주되어서는 안됩니다. 다음은 수행 할 수있는 중요한 확장 중 일부입니다.

1. 키워드 추출 :

언어 감지와 같은 간단한 문제에는 단일 키워드를 사용하는 것으로 충분하지만 다른 복잡한 문제에는 n- 그램 추출이 필요합니다. 따라서 TextTokenizer.extractKeywords () 메서드를 업데이트하여보다 정교한 텍스트 추출 알고리즘을 구현하거나 Datumbox를 사용할 수 있습니다 키워드 추출 API 문서의 모든 n- 그램 (키워드 조합)을 가져 오는 함수입니다.

2. 텍스트 전처리 :

분류기를 사용하기 전에 일반적으로 불필요한 문자 / 부품을 제거하기 위해 문서를 사전 처리해야합니다. 현재 구현에서는 TextTokenizer.preprocess () 메서드를 사용하여 제한된 전처리를 수행하지만 HTML 페이지를 분석 할 때는 상황이 더 까다로워집니다. HTML 태그를 잘라 내고 문서의 일반 텍스트 만 유지하거나 페이지의 기본 텍스트를 감지하고 바닥 글, 머리글, 메뉴 등에 속하는 콘텐츠를 제거하는보다 정교한 기계 학습 기술을 활용할 수 있습니다. Datumbox를 사용할 수 있습니다 텍스트 추출 API 기능.

3. 추가 Naive Bayes 모델 :

그럼에도 불구하고 현재 분류기는 다항식 Naive Bayes 분류기를 구현하지만 이전 기사에서 설명한 바와 같이 감정 분석다른 분류 문제에는 다른 모델이 필요합니다. 이진화 된 버전의 알고리즘이 더 적합한 반면에, Bernoulli 모델은 훨씬 더 나은 결과를 제공 할 것입니다. 이 구현을 시작점으로 사용하고 지침을 따르십시오. 나이브 베이 즈 튜토리얼 모델을 확장합니다.

4. 추가 기능 선택 방법 :

이 구현에서는 Chisquare 기능 선택 알고리즘을 사용하여 분류에 가장 적합한 기능을 선택합니다. 이전 기사에서 보았 듯이 Chisquare 기능 선택 방법은 통계를 중계하여 적절한 기능을 선택하는 좋은 기술이지만, 범주 중 하나에 만 나타나는 드문 기능에 대해서는 높은 점수를주는 경향이 있습니다. 기능 선택을 진행하기 전에 또는 앞서 언급 한 기사에서 논의한 상호 정보와 같은 추가 방법을 구현하여 노이즈 / 희귀 기능을 제거 할 수 있습니다.

5. 성능 최적화 :

특정 구현에서, 코드에 대한 미세 최적화를 수행하기보다는 코드의 가독성을 향상시키는 것이 중요했다. 이러한 최적화로 인해 코드가 더 추악 해지고 읽기 / 유지하기가 어렵다는 사실에도 불구하고이 알고리즘의 많은 루프가 훈련 및 테스트 중에 수백만 번 실행되기 때문에 종종 필요합니다. 이 구현은 자체 조정 버전을 개발하기위한 좋은 출발점이 될 수 있습니다.

거의… 최종 노트!

내가 들었을 때 코딩시 좋은 l이 구현이 어떻게 작동하는지 잘 이해하려면 이전 두 기사를 읽어 보는 것이 좋습니다. 나이브 베이 즈 분류기기능 선택. 메소드의 이론적 배경에 대한 통찰력을 얻고 알고리즘 / 코드의 일부를 더 명확하게 만듭니다.

Naive Bayes는 쉽고 빠르며 대부분 "정확한"상태 임에도 불구하고 기능의 조건부 독립성을 가정하기 때문에 "순진한"상태입니다. 이러한 가정은 텍스트 분류 문제에서 거의 충족되지 않기 때문에 Naive Bayes는 거의 최고의 성능 분류기입니다. 에 데이텀박스 API표준 Naive Bayes 분류기의 일부 확장은 언어 감지와 같은 간단한 문제에만 사용됩니다. 보다 복잡한 텍스트 분류 문제의 경우 최대 엔트로피 분류기 필요합니다.

흥미로운 프로젝트에서 구현을 사용하는 경우 우리에게 줄을 내리다 우리는 블로그에 프로젝트를 소개 할 것입니다. 또한 기사가 마음에 들면 잠시 시간을내어 Twitter 나 Facebook에서 공유하십시오. 🙂

소개 바실리스 브로 니 오티스

제 이름은 Vasilis Vryniotis입니다. 저는 데이터 엔지니어, 소프트웨어 엔지니어, Datumbox Machine Learning Framework의 저자 및 자랑스러운 괴짜입니다. 상세보기

출처 : http://blog.datumbox.com/developing-a-naive-bayes-text-classifier-in-java/

spot_img

최신 인텔리전스

spot_img