4

我将获得用中文编写的文档,我必须对其进行标记并将其保存在数据库表中。我正在尝试 Lucene 的 CJKBigramFilter,但它所做的只是将 2 个字符结合在一起,其含义与文档中的含义不同。假设这是文件“Hello My name is Pradeep”中的一行,在中国传统中是“你好我的名字是普拉迪普”。当我对其进行标记时,它会转换为下面的 2 个字母单词。你好 - 你好名字 - 名字好我 - Well I 字是 - 字是我的 - 我的拉迪 - Radi 是普 - 是标准普尔普拉 - 普拉的名字 - 以迪普的名义 - 迪普。我想要的只是将其转换为相同的英文翻译。我正在为此使用 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

如果你想要一个简单的、一次性的中文解决方案,这就是我使用的。

首先将中文字典加载到Trie(Prefix-Tree)中以减少内存占用。然后,我一次浏览一个字符的句子,观察字典中存在的枯萎子字符串。如果他们这样做了,我会将其解析为令牌。该算法可能会大大改进,但这对我很有帮助。:)

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 回答
1

试试这个资源,它是一个使用 CC-CEDICT 的中文分词器

https://github.com/yishn/chinese-tokenizer

于 2018-05-19T22:39:35.120 回答