我想要标记文本,但不能仅用空格分隔。
有一些事情,比如我只想设置一个标记的专有名称(例如:“RenatoDinhaniConceição”)。另一种情况:百分比(“60%”)并且不分成两个代币。
如果某个库中存在可以提供高度自定义的Tokenizator,我想知道什么?如果没有,我会尝试编写自己的,如果有一些接口或实践可以遵循。
并非所有事情都需要得到普遍认可。示例:我不需要重新配置中文字母。
我的申请是大学申请,主要是针对葡萄牙语。只有名字,地点和类似物之类的东西才能使用其他语言。
答案 0 :(得分:2)
我试图不是从标记化的角度来看,而是从规则的角度来看。这将是最大的挑战 - 创建一个满足大多数情况的综合规则集。
规则isName的示例:
(eg.:
isName = false "Renato
isName = true Dinhani
isName = true Conceição").
isName = true Another
isName = false 离开时:(eg.:
,"Renato Dinhani Conceição").
,Another
答案 1 :(得分:1)
我认为令牌化器对于你想要的东西来说太简单了。从标记器向上一步就是像JFlex这样的词法分析器。这些会将一串字符拆分为单独的令牌,如令牌器,但具有更灵活的规则。
即便如此,似乎你需要某种自然语言处理,因为教一个词法分析器,正确的名字和正常的单词之间的区别可能是棘手的。通过教导一串以大写字母开头的单词全部属于一起,数字可以跟随单位等等,你可能会走得很远。祝你好运。
答案 2 :(得分:1)
您应该尝试Apache OpenNLP。它包括准备使用葡萄牙语的Sentence Detector和Tokenizer模型。
下载Apache OpenNLP并将其解压缩。将葡萄牙语模型复制到OpenNLP文件夹。从http://opennlp.sourceforge.net/models-1.5/
下载模型从命令行使用它:
bin/opennlp TokenizerME pt-ten.bin
Loading Tokenizer model ... done (0,156s)
O José da Silva chegou, está na sua sala.
O José da Silva chegou , está na sua sala .
使用API:
// load the model
InputStream modelIn = new FileInputStream("pt-token.bin");
try {
TokenizerModel model = new TokenizerModel(modelIn);
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (modelIn != null) {
try {
modelIn.close();
}
catch (IOException e) {
}
}
}
// load the tokenizer
Tokenizer tokenizer = new TokenizerME(model);
// tokenize your sentence
String tokens[] = tokenizer.tokenize("O José da Silva chegou, está na sua sala.");
答案 3 :(得分:0)
StringTokenizer是一个遗留类,仅为了向后兼容而维护。在新代码中不鼓励使用它。
您应该使用String.split()函数。 split函数采用正则表达式作为参数。此外,您可以使用Pattern和Matcher类来增强它。您可以编译模式对象,然后使用它来匹配各种场景。