我将获得用中文编写的文档,我必须对其进行标记并将其保存在数据库表中。我正在尝试 Lucene 的 CJKBigramFilter,但它所做的只是将 2 个字符结合在一起,其含义与文档中的含义不同。假设这是文件“Hello My name is Pradeep”中的一行,在中国传统中是“你好我的名字是普拉迪普”。当我对其进行标记时,它会转换为下面的 2 个字母单词。你好 - 你好名字 - 名字好我 - Well I 字是 - 字是我的 - 我的拉迪 - Radi 是普 - 是标准普尔普拉 - 普拉的名字 - 以迪普的名义 - 迪普。我想要的只是将其转换为相同的英文翻译。我正在为此使用 Lucene ...如果您有任何其他有利的开源资源,请指导我。提前致谢
问问题
4855 次
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 的中文分词器
于 2018-05-19T22:39:35.120 回答