Kuromoji MEMO - yuokada/presto-sample-udf GitHub Wiki

package io.github.yuokada;

import com.atilika.kuromoji.ipadic.Token;
import com.atilika.kuromoji.ipadic.Tokenizer;
import com.atilika.kuromoji.ipadic.Tokenizer.Builder;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class Demo
{

    public static void main(String[] args)
    {
        // https://qiita.com/masato_ka/items/2bae7f1e8ce245443947
        String input = "井口裕香ちゃんと一風堂のラーメンが食べたい";
        String userDict = "# 単語, 形態素解析結果の単語, 読み, 品詞\n" +
                "井口裕香,井口裕香,イグチユカ,名詞\n" +
                "一風堂,一風堂,イップウドウ,名詞\n" +
                "一蘭,一蘭,イチラン,名詞\n" +
                "元祖長浜,元祖長浜,ガンソナガハマ,名詞\n";
        InputStream inputStream = new ByteArrayInputStream(userDict.getBytes());
        Builder builder = new Tokenizer.Builder();
        Tokenizer tokenizer = null;
        try {
            tokenizer = builder.mode(Tokenizer.Mode.NORMAL)
                    .userDictionary(inputStream)
                    .build();
        }
        catch (IOException e1) {

        }
        List<Token> tokens = tokenizer.tokenize(input);
        tokens
                .stream()
                .map(e -> e.getSurface() + " " + e.getAllFeatures())
                .forEach(System.out::println);
        tokens
                .stream()
                .map(e -> e.getAllFeaturesArray()[0])
                .forEach(System.out::println);
    }
}

# Output
井口裕香 名詞,*,*,*,*,*,*,イグチユカ,*
ちゃんと 副詞,一般,*,*,*,*,ちゃんと,チャント,チャント
一風堂 名詞,*,*,*,*,*,*,イップウドウ,*
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ラーメン 名詞,一般,*,*,*,*,ラーメン,ラーメン,ラーメン
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
たい 助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
名詞
副詞
名詞
助詞
名詞
助詞
動詞
助動詞

getSurfaceForm?
トークンに分解された単語が返却されます。
getPartOfSpeech?
トークンの品詞が返却されます。
getBaseForm?
トークンの原型が返却されます。動詞の場合は、基本形に直してくれます。
getReading
トークンの読みが返却されます。
isKnown、isUnknown
辞書の登録語かどうかをbooleanで返却します。
isUser
ユーザ辞書の登録後かどうかをbookeanで返却します。
getAllFeatures?、getAllFeaturesArray?
すべての情報をString/String[]で返却します。

辞書サポート

array(varchar(x)) を引数に取るのに苦戦中。 パット見は出来てる気がするがテストが通らない。
同じような引数をとる関数のコードを閲覧中。

"regexp_replace","varchar","varchar, JoniRegExp, function(array(varchar),varchar(x))",
"scalar","true","replaces substrings matching a regular expression using a lambda function"

https://github.com/prestodb/presto/blob/master/presto-main/src/main/java/com/facebook/presto/operator/scalar/Re2JRegexpReplaceLambdaFunction.java

調査結果

ARRAYの記法が間違えてた。 なんとなく予想で書いたコードはダメだね。

presto> select kuromoji_tokenize('一風堂のラーメンが食べたい。', 'normal', ARRAY['一風堂,一風堂,イップウドウ,名詞', '一蘭,一蘭,イチラン,名詞'] );
                    _col0
----------------------------------------------
 [一風, 堂, の, ラーメン, が, 食べ, たい, 。]
(1 row)

Query 20180412_015840_00005_65gdd, FINISHED, 1 node
Splits: 17 total, 17 done (100.00%)
0:00 [0 rows, 0B] [0 rows/s, 0B/s]
⚠️ **GitHub.com Fallback** ⚠️