node-twitter-korean-text

Nodejs interface to twitter-korean-text


Keywords
korean, nlp, twitter-korean-text
License
Apache-2.0
Install
npm install node-twitter-korean-text@1.0.0

Documentation

node-twitter-korean-text

npm version

Nodejs interface to twitter-korean-text via node-java

Dependency

Currently wraps twitter-korean-text 4.4.4

ν˜„μž¬ 이 ν”„λ‘œμ νŠΈλŠ” twitter-korean-text 4.4.4을 μ‚¬μš©μ€‘μž…λ‹ˆλ‹€.

Requirement

Since it uses java code compiled with Java 8, make sure you have both Java 8 JDK and JRE installed.
For more details about installing java interface, see installation notes on node-java.

이 ν”„λ‘œμ νŠΈλŠ” Java 8둜 컴파일된 μ½”λ“œλ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ—, Java 8 JDK/JREκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
Java interface의 μ„€μΉ˜μ— κ΄€λ ¨λœ 더 μžμ„Έν•œ 사항은 이곳 μ—μ„œ ν™•μΈν•˜μ„Έμš”.

Installation

npm install --save node-twitter-korean-text

Usage

Support both asynchronous(default) and synchronous way.

const TwitterKoreanProcessor = require('node-twitter-korean-text');

// Normalize
TwitterKoreanProcessor.normalize('νž˜λ“€κ²Ÿμ”€λ‹€ κ·Έλž˜μš¬γ…‹γ…‹γ…‹').then((result) => {
    // 'νž˜λ“€κ² μŠ΅λ‹ˆλ‹€ κ·Έλž˜μš”γ…‹γ…‹'
});


// Tokenize
// tokensToJsonArray(tokens, keepSpace = false)

TwitterKoreanProcessor.tokenize('μ°©ν•œκ°•μ•„μ§€μƒμ„ 받은 루루').then((tokens) => {
    TwitterKoreanProcessor.tokensToJsonArray(tokens, true).then((result) => {
        // [
        //     { 'text': 'μ°©ν•œ', 'koreanPos': 'Adjective', 'offset': 0, 'length': 2, 'isUnknown': false },
        //     { 'text': '강아지', 'koreanPos': 'Noun', 'offset': 2, 'length': 3, 'isUnknown': false },
        //     { 'text': '상', 'koreanPos': 'Suffix', 'offset': 5, 'length': 1, 'isUnknown': false },
        //     { 'text': '을', 'koreanPos': 'Josa', 'offset': 6, 'length': 1, 'isUnknown': false },
        //     { 'text': ' ', 'koreanPos': 'Space', 'offset': 7, 'length': 1, 'isUnknown': false },
        //     { 'text': '받은', 'koreanPos': 'Verb', 'offset': 8, 'length': 2, 'isUnknown': false },
        //     { 'text': ' ', 'koreanPos': 'Space', 'offset': 10, 'length': 1, 'isUnknown': false },
        //     { 'text': '루루', 'koreanPos': 'Noun', 'offset': 11, 'length': 2, 'isUnknown': false }
        // ]
    });

    TwitterKoreanProcessor.tokensToJsonArray(tokens, false).then((result) => {
        // [
        //     { 'text': 'μ°©ν•œ', 'koreanPos': 'Adjective', 'offset': 0, 'length': 2, 'isUnknown': false },
        //     { 'text': '강아지', 'koreanPos': 'Noun', 'offset': 2, 'length': 3, 'isUnknown': false },
        //     { 'text': '상', 'koreanPos': 'Suffix', 'offset': 5, 'length': 1, 'isUnknown': false },
        //     { 'text': '을', 'koreanPos': 'Josa', 'offset': 6, 'length': 1, 'isUnknown': false },
        //     { 'text': '받은', 'koreanPos': 'Verb', 'offset': 8, 'length': 2, 'isUnknown': false },
        //     { 'text': '루루', 'koreanPos': 'Noun', 'offset': 11, 'length': 2, 'isUnknown': false }
        // ]
    });
});


// Stemming
TwitterKoreanProcessor.tokenize('게으λ₯Έ 아침이 λ°μ•˜κ΅¬λ‚˜')
    .then((tokens) => TwitterKoreanProcessor.stem(tokens))
    .then((stemmed) => TwitterKoreanProcessor.tokensToJsonArray(stemmed))
    .then((result) => {
        // [
        //     { 'text': '게으λ₯΄λ‹€', 'koreanPos': 'Adjective', 'offset': 0, 'length': 3, 'isUnknown': false },
        //     { 'text': 'μ•„μΉ¨', 'koreanPos': 'Noun', 'offset': 4, 'length': 2, 'isUnknown': false },
        //     { 'text': '이', 'koreanPos': 'Josa', 'offset': 6, 'length': 1, 'isUnknown': false },
        //     { 'text': '밝닀', 'koreanPos': 'Verb', 'offset': 8, 'length': 4, 'isUnknown': false }
        // ]
    });


// Add to dictionary
TwitterKoreanProcessor.tokenize('μš°ν–λ‚˜μ–΄κ°€λ…€μ•„λŽŒ')
    .then((tokens) => TwitterKoreanProcessor.tokensToJsonArray(tokens, false))
    .then((result) => {
        // [
        //     { 'text': 'μš°ν–λ‚˜μ–΄κ°€λ…€μ•„λŽŒ', 'koreanPos': 'ProperNoun', 'offset': 0, 'length': 8, 'isUnknown': true }
        // ]
    });

TwitterKoreanProcessor.addNounsToDictionary('μš°ν–λ‚˜', 'μ–΄κ°€λ…€', 'μ•„λŽŒ')
TwitterKoreanProcessor.tokenize('μš°ν–λ‚˜μ–΄κ°€λ…€μ•„λŽŒ')
    .then((tokens) => TwitterKoreanProcessor.tokensToJsonArray(tokens, false))
    .then((result) => {
        // [
        //     { 'text': 'μš°ν–λ‚˜', 'koreanPos': 'Noun', 'offset': 0, 'length': 3, 'isUnknown': false },
        //     { 'text': 'μ–΄κ°€λ…€', 'koreanPos': 'Noun', 'offset': 3, 'length': 3, 'isUnknown': false },
        //     { 'text': 'μ•„λŽŒ', 'koreanPos': 'Noun', 'offset': 6, 'length': 2, 'isUnknown': false }
        // ]
    });



// Phrase extraction
// extractPhrases(tokens, filterSpam = true, includeHashtags = true)

TwitterKoreanProcessor.tokenize('μ•„λ¦„λ‹€μš΄ νŠΈμœ„ν„°λ₯Ό λ§Œλ“€μ–΄ 보자. μ‹œλ°œ #μš•ν•˜μ§€_말자').then((tokens) => { 
    TwitterKoreanProcessor.extractPhrases(tokens, true, true).then((result) => {
        // [
        //     { 'text': 'μ•„λ¦„λ‹€μš΄ νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 0, 'length': 8 },
        //     { 'text': 'νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 5, 'length': 3 },
        //     { 'text': '#μš•ν•˜μ§€_말자', 'koreanPos': 'Hashtag', 'offset': 21, 'length': 7 }
        // ]
    });
    TwitterKoreanProcessor.extractPhrases(tokens, true, false).then((result) => {
        // [
        //     { 'text': 'μ•„λ¦„λ‹€μš΄ νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 0, 'length': 8 },
        //     { 'text': 'νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 5, 'length': 3 }
        // ]
    });
    TwitterKoreanProcessor.extractPhrases(tokens, false, true).then((result) => {
        // [
        //     { 'text': 'μ•„λ¦„λ‹€μš΄ νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 0, 'length': 8 },
        //     { 'text': 'μ‹œλ°œ', 'koreanPos': 'Noun', 'offset': 18, 'length': 2 },
        //     { 'text': 'νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 5, 'length': 3 },
        //     { 'text': '#μš•ν•˜μ§€_말자', 'koreanPos': 'Hashtag', 'offset': 21, 'length': 7 }
        // ]
    });
    TwitterKoreanProcessor.extractPhrases(tokens, false, false).then((result) => {
        // [
        //     { 'text': 'μ•„λ¦„λ‹€μš΄ νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 0, 'length': 8 },
        //     { 'text': 'μ‹œλ°œ', 'koreanPos': 'Noun', 'offset': 18, 'length': 2 },
        //     { 'text': 'νŠΈμœ„ν„°', 'koreanPos': 'Noun', 'offset': 5, 'length': 3 }
        // ]
    });
});


// Splitting Sentence
TwitterKoreanProcessor.splitSentences('가을이닀! λ‚¨μžλŠ” 가을을 탄닀...... 그렇지? 루루야! λ²„λ²„λ¦¬μ½”νŠΈ μ‚¬λŸ¬ κ°€μž!!!!')
    .then((result) => {
        // [
        //     { 'text': '가을이닀!', 'start': 0, 'end': 5 },
        //     { 'text': 'λ‚¨μžλŠ” 가을을 탄닀......', 'start': 6, 'end': 22 },
        //     { 'text': '그렇지?', 'start': 23, 'end': 27 },
        //     { 'text': '루루야!', 'start': 28, 'end': 32 },
        //     { 'text': 'λ²„λ²„λ¦¬μ½”νŠΈ μ‚¬λŸ¬ κ°€μž!!!!', 'start': 33, 'end': 48 }
        // ]
    });

// Detokenize
TwitterKoreanProcessor.detokenize(['늘', 'ν‰μ˜¨', 'ν•˜κ²Œ', 'λˆ„μ›Œ', '있', 'λŠ”', '루루']).then((result) => {
    // '늘 ν‰μ˜¨ν•˜κ²Œ λˆ„μ›ŒμžˆλŠ” 루루'
});

Synchronous way

just append Sync at the end of each methods

const TwitterKoreanProcessor = require('node-twitter-korean-text');

// Normalize
const normalized = TwitterKoreanProcessor.normalizeSync('νž˜λ“€κ²Ÿμ”€λ‹€ κ·Έλž˜μš¬γ…‹γ…‹γ…‹'); 
// 'νž˜λ“€κ² μŠ΅λ‹ˆλ‹€ κ·Έλž˜μš”γ…‹γ…‹'


// Tokenize
// tokensToJsonArray(tokens, keepSpace = false)

const tokens = TwitterKoreanProcessor.tokenizeSync('μ°©ν•œκ°•μ•„μ§€μƒμ„ 받은 루루');
const tokenWithSpace = TwitterKoreanProcessor.tokensToJsonArraySync(tokens, true);
// [
//     { 'text': 'μ°©ν•œ', 'koreanPos': 'Adjective', 'offset': 0, 'length': 2, 'isUnknown': false },
//     { 'text': '강아지', 'koreanPos': 'Noun', 'offset': 2, 'length': 3, 'isUnknown': false },
//     { 'text': '상', 'koreanPos': 'Suffix', 'offset': 5, 'length': 1, 'isUnknown': false },
//     { 'text': '을', 'koreanPos': 'Josa', 'offset': 6, 'length': 1, 'isUnknown': false },
//     { 'text': ' ', 'koreanPos': 'Space', 'offset': 7, 'length': 1, 'isUnknown': false },
//     { 'text': '받은', 'koreanPos': 'Verb', 'offset': 8, 'length': 2, 'isUnknown': false },
//     { 'text': ' ', 'koreanPos': 'Space', 'offset': 10, 'length': 1, 'isUnknown': false },
//     { 'text': '루루', 'koreanPos': 'Noun', 'offset': 11, 'length': 2, 'isUnknown': false }
// ]

...