4

トークン化してデータベーステーブルに保持する必要がある中国語で書かれたドキュメントを取得します。私は Lucene の CJKBigramFilter を試していましたが、ドキュメントにあるものとは意味が異なる 2 文字を結合するだけです。これが、中国の伝統では「你好我的名字是普拉迪普」である「こんにちは、私の名前はプラディープです」というファイルの行であるとします。トークン化すると、以下の 2 文字の単語に変換されます。你好 - こんにちは 名字 - 名前 好我 - まあ私 字是 - 言葉は我的 - 私の拉迪 - ラジ是普 - S & P 普拉 - プーラ 的名 - 迪普の名で - ディップ。私が望むのは、同じ英語の翻訳に変換することだけです。私はこれに Lucene を使用しています...他に有利なソースがある場合は、それを教えてください。前もって感謝します

4

3 に答える 3

4

手遅れかもしれませんが、無料で利用できるオンライン API である U-Tokenizer を試してみてください。http://tokenizer.tool.uniwits.com/を参照してください

于 2012-11-18T06:17:04.540 に答える
3

本格的な NLP パーサーが必要な場合は、http://nlp.stanford.eduをチェックしてください。

中国語用の単純な 1 回限りのソリューションが必要な場合は、私が使用したものを次に示します。

最初に中国語辞書を Trie (Prefix-Tree) にロードして、メモリ フットプリントを削減します。次に、一度に 1 文字ずつ文を調べて、辞書に存在する枯れた部分文字列を観察しました。もしそうなら、私はそれをトークンとして解析します。アルゴリズムはおそらく大幅に改善される可能性がありますが、これは私には役に立ちました. :)

public class ChineseWordTokenizer implements WordTokenizer {

    private static final int MAX_MISSES = 6;

    // example implementation: http://www.kennycason.com/posts/2012-03-20-java-trie-prefix-tree.html
    private StringTrie library;

    private boolean loadTraditional;

    public ChineseWordTokenizer() {
        this(true);
    }

    public ChineseWordTokenizer(boolean loadTraditional) {
        loadLibrary();
        this.loadTraditional = loadTraditional;
    }

    @Override
    public String[] parse(String sentence) {
        final List<String> words = new ArrayList<>();
        String word;
        for (int i = 0; i < sentence.length(); i++) {
            int len = 1;
            boolean loop = false;
            int misses = 0;
            int lastCorrectLen = 1;
            boolean somethingFound = false;
            do {
                word = sentence.substring(i, i + len);
                if (library.contains(word)) {
                    somethingFound = true;
                    lastCorrectLen = len;
                    loop = true;
                } else {
                    misses++;
                    loop = misses < MAX_MISSES;
                }
                len++;
                if(i + len > sentence.length()) {;
                    loop = false;
                }        
            } while (loop);

            if(somethingFound) {
                word = sentence.substring(i, i + lastCorrectLen);
                if (StringUtils.isNotBlank(word)) {
                    words.add(word);
                    i += lastCorrectLen - 1;
                }
            }
        }
        return words.toArray(new String[words.size()]);
    }

    private void loadLibrary() {
        library = new StringTrie();
        library.loadFile("classify/nlp/dict/chinese_simple.list");
        if(loadTraditional) {
            library.loadFile("classify/nlp/dict/chinese_traditional.list");
        }
    }

}

ここに単体テストがあります

public class TestChineseWordTokenizer {

    @Test
    public void test() {
        long time = System.currentTimeMillis();
        WordTokenizer tokenizer = new ChineseWordTokenizer();
        System.out.println("load time: " + (System.currentTimeMillis() - time) + " ms");

        String[] words = tokenizer.tokenize("弹道导弹");
        print(words);
        assertEquals(1, words.length);

        words = tokenizer.tokenize("美国人的文化.dog");
        print(words);
        assertEquals(3, words.length);

        words = tokenizer.tokenize("我是美国人");
        print(words);
        assertEquals(3, words.length);

        words = tokenizer.tokenize("政府依照法律行使执法权,如果超出法律赋予的权限范围,就是“滥用职权”;如果没有完全行使执法权,就是“不作为”。两者都是政府的错误。");
        print(words);

        words = tokenizer.tokenize("国家都有自己的政府。政府是税收的主体,可以实现福利的合理利用。");
        print(words);
    }

    private void print(String[] words) {
        System.out.print("[ ");
        for(String word : words) {
            System.out.print(word + " ");
        }
        System.out.println("]");
    }
}

そして、ここに結果があります

Load Complete: 102135 Entries
load time: 236 ms
[ 弹道导弹 ]
[ 美国人 的 文化 ]
[ 我 是 美国人 ]
[ 政府 依照 法律 行使 执法 权 如果 超出 法律 赋予 的 权限 范围 就是 滥用职权 如果 没有 完全 行使 执法 权 就是 不 作为 两者 都 是 政府 的 错误 ]
[ 国家 都 有 自己 的 政府 政府 是 税收 的 主体 可以 实现 福利 的 合理 利用 ]
于 2014-05-23T17:26:37.570 に答える