我在opennlp的文档页面上发现了这个类TokenizerME(http://opennlp.apache.org/documentation/manual/opennlp.html)。我搞不明白它是如何计算概率的。我用不同的输入测试过,仍然不理解。有人能帮我理解背后的算法吗?我写了这段示例代码
public void tokenizerDemo(){ try { InputStream modelIn = new FileInputStream("en-token.bin"); TokenizerModel model = new TokenizerModel(modelIn); Tokenizer tokenizer = new TokenizerME(model); String tokens[] = tokenizer.tokenize("This is is book"); for(String t:tokens){ System.out.println("Token : "+t); } double tokenProbs[] = ((TokenizerME) tokenizer).getTokenProbabilities(); for(double tP : tokenProbs){ System.out.println("Token Prob : "+tP); } } catch (IOException e) { e.printStackTrace(); }}
我得到了这个输出
Token : This
Token : is
Token : is
Token : book
Token Prob : 1.0
Token Prob : 1.0
Token Prob : 1.0
Token Prob : 1.0
我希望标记“is”被计数两次,并且它的概率应该比其他标记略高。感到困惑。
回答:
标记器的概率与标记器识别标记跨度的自信程度有关:根据标记器模型,这串字符在这个上下文中是否是一个标记。“This”在一个字符串的开头,后面跟着一个空格,对于英语来说是一个非常可能的标记,而“Thi”后面跟着“s”则不是。
这些概率与特定标记内容出现的频率无关,只与这一串字符是否是一个可能的标记有关。字符串“is is is is is is is”对于英语来说很容易标记,因为“is”是一个常见的词,空格是好的标记边界。仅此而已。
如果你对计算n-gram概率感兴趣,你应该查看语言模型。(显然,你仍然需要先对你的文本进行标记。)