NLP4J [007]에서 kuromoji를 사용하는 Annotator 만들기

색인으로 돌아가기

형태소 분석 모듈을 구분



NLP4J에서는 표준 (nlp4j-core)에서 Yahoo! 개발자 네트워크의 형태소 해석 처리를 이용하고 있습니다.

텍스트 분석 : 일본어 형태소 분석 - Yahoo! 개발자 네트워크
htps : //로 ゔぇぺぺr. 야호오. 이. jp/우바바피/jlp/마/v1/파르세. HTML

Yahoo! 개발자 네트워크의 API는 HTTP로 부를 수 있으므로 편리하지만 횟수 제한이 있다는 약점도 있습니다.
그래서 로컬에서도 사용할 수 있는 검은 문자 을 이용하는 라이브러리를 작성하기로 합니다.

Annotator 만들기



이번에는 nlp4j 프로젝트의 서브 모듈 (sub module)로 nlp4j-kuromoji를 만들었습니다.

nlp4j-쿠로모지
htps : // 기주 b. 코 m / 오야 히로키 / nlp4j / tree / ms r / nlp4j / nlp4j

Maven은 kuromoji를 사용하기위한 dependency를 추가합니다.
<!-- https://mvnrepository.com/artifact/com.atilika.kuromoji/kuromoji -->
<dependency>
 <groupId>com.atilika.kuromoji</groupId>
 <artifactId>kuromoji</artifactId>
 <version>0.9.0</version>
 <type>pom</type>
</dependency>
<dependency>
 <groupId>com.atilika.kuromoji</groupId>
 <artifactId>kuromoji-ipadic</artifactId>
 <version>0.9.0</version>
</dependency>

클래스 다이어그램



클래스도로서는 이런 느낌입니다.
형태소 해석 엔진으로서는 같은 일을 하고 있으므로 형제 관계라고 하게 됩니다.
일단 임플리 해 버리면 차분을 의식하는 것은 없어지므로, kuromoji의 인플리를 의식하는 것도 아마 이번 한계라고 할 것입니다.


@startuml
nlp4j.DocumentAnnotator <|-- YJpMaAnnotator
nlp4j.DocumentAnnotator <|-- KuromojiAnnotator 
@enduml

코드



NLP4J가 제공하는 nlp4j.DocumentAnnotator 인터페이스를 상속 (implement)합니다.
kuromoji로 추출한 키워드를 NLP4J에서 제공하는 키워드에 매핑합니다.

package nlp4j.krmj.annotator;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.atilika.kuromoji.ipadic.Token;
import com.atilika.kuromoji.ipadic.Tokenizer;
import nlp4j.AbstractDocumentAnnotator;
import nlp4j.Document;
import nlp4j.DocumentAnnotator;
import nlp4j.impl.DefaultKeyword;

/**
 * Kuromoji Annotator
 * @author Hiroki Oya
 * @since 1.2
 */
public class KuromojiAnnotator extends AbstractDocumentAnnotator implements DocumentAnnotator {
    static private final Logger logger = LogManager.getLogger(KuromojiAnnotator.class);
    @Override
    public void annotate(Document doc) throws Exception {
        Tokenizer tokenizer = new Tokenizer(); // kuromoji のインスタンス
        for (String target : targets) {
            Object obj = doc.getAttribute(target);
            if (obj == null || obj instanceof String == false) {
                continue;
            }
            String text = (String) obj;
            List<Token> tokens = tokenizer.tokenize(text);
            int sequence = 1;
            for (Token token : tokens) {
                logger.debug(token.getAllFeatures());
                DefaultKeyword kwd = new DefaultKeyword(); // 新しいキーワード
                kwd.setLex(token.getBaseForm());
                kwd.setStr(token.getSurface());
                kwd.setReading(token.getReading());
                kwd.setBegin(token.getPosition());
                kwd.setEnd(token.getPosition() + token.getSurface().length());
                kwd.setFacet(token.getPartOfSpeechLevel1());
                kwd.setSequence(sequence);
                doc.addKeyword(kwd);
                sequence++;
            }
        }
    }
}

같은 "원형"에서도 baseForm과 lex의 차이가 있거나 용어가 미묘하게 다른 것을 볼 수 있다고 생각합니다.

사용법



Annotator 클래스 지정을 변경하는 것을 제외하고는 Yahoo! 개발자 네트워크와 동일합니다.
별도의 자연 언어 처리인 kuromoji와 Yahoo! 개발자 네트워크의 자연 언어 처리를 WRAP하고 있습니다.
    public void testAnnotateDocument001() throws Exception {
        // 自然文のテキスト
        String text = "私は学校に行きました。";
        Document doc = new DefaultDocument();
        doc.putAttribute("text", text);
        KuromojiAnnotator annotator = new KuromojiAnnotator(); // ここだけ変更してモジュールを差し替え可能
        annotator.setProperty("target", "text");
        annotator.annotate(doc); // throws Exception
        System.err.println("Finished : annotation");
        for (Keyword kwd : doc.getKeywords()) {
            System.err.println(kwd);
        }
    }

결과



결과는 다음과 같습니다.
자연 언어 처리 라이브러리의 구현을 의식하지 않고 이용할 수 있었습니다.
Finished : annotation
私 [sequence=1, facet=名詞, lex=私, str=私, reading=ワタシ, count=-1, begin=0, end=1, correlation=0.0]
は [sequence=2, facet=助詞, lex=は, str=は, reading=ハ, count=-1, begin=1, end=2, correlation=0.0]
学校 [sequence=3, facet=名詞, lex=学校, str=学校, reading=ガッコウ, count=-1, begin=2, end=4, correlation=0.0]
に [sequence=4, facet=助詞, lex=に, str=に, reading=ニ, count=-1, begin=4, end=5, correlation=0.0]
行く [sequence=5, facet=動詞, lex=行く, str=行き, reading=イキ, count=-1, begin=5, end=7, correlation=0.0]
ます [sequence=6, facet=助動詞, lex=ます, str=まし, reading=マシ, count=-1, begin=7, end=9, correlation=0.0]
た [sequence=7, facet=助動詞, lex=た, str=た, reading=タ, count=-1, begin=9, end=10, correlation=0.0]
。 [sequence=8, facet=記号, lex=。, str=。, reading=。, count=-1, begin=10, end=11, correlation=0.0]


요약



NLP4J를 사용하면 Java로 쉽게 자연 언어 처리를 할 수 있군요!

프로젝트 URL



htps //w w. nlp4j. rg/


색인으로 돌아가기

좋은 웹페이지 즐겨찾기