对于Java,有一个令牌识别符与我想要的完全匹配吗?

时间:2011-07-28 18:24:26

标签: java text nlp tokenize

我想要标记文本,但不能仅用空格分隔。

有一些事情,比如我只想设置一个标记的专有名称(例如:“RenatoDinhaniConceição”)。另一种情况:百分比(“60%”)并且不分成两个代币。

如果某个库中存在可以提供高度自定义的Tokenizator,我想知道什么?如果没有,我会尝试编写自己的,如果有一些接口或实践可以遵循。

并非所有事情都需要得到普遍认可。示例:我不需要重新配置中文字母。

我的申请是大学申请,主要是针对葡萄牙语。只有名字,地点和类似物之类的东西才能使用其他语言。

4 个答案:

答案 0 :(得分:2)

我试图不是从标记化的角度来看,而是从规则的角度来看。这将是最大的挑战 - 创建一个满足大多数情况的综合规则集。

  • 在人类术语中定义不应基于空格分割的单位。名称示例是一个。
  • 对于空格分割的每个例外,创建一组规则来识别它。对于名称示例:两个或更多连续的大写单词,其中包含或不包含语言特定的非大写名称单词(如“de”)。
  • 将每个规则实现为自己的类,可以在循环时调用。
  • 根据空格拆分整个字符串,然后循环它,跟踪之前的标记,以及当前的标记,为每个标记应用规则类。

规则isName的示例:

  • 循环1:(eg.: isName = false
  • 循环2:"Renato isName = true
  • 循环3:Dinhani isName = true
  • 循环4:Conceição"). isName = true
  • 循环5: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类来增强它。您可以编译模式对象,然后使用它来匹配各种场景。