2017-11-25 135 views
2

所以我终于OpenNLP纳入我的项目,我已经成功培训了15,000行的训练数据的我的模型,将其存储,并且可以加载它,当我想用它来识别我的程序中的实体!定制OpenNLP名称查找在训练集识别数据,而不是测试组

,我用它来识别井号标签,所以我的训练数据看起来是这样的:

... 
    Jim , I know you to be a fighter <START:HASHTAG> #usmarine <END> @ USMC Kira has your strength & amp ; ours @ t1r1u1t1h R love 2 U , Kira & amp ; 
    What has changed that people from your JAMAT are insulting Hindu GODS and GODDESSES . Calling our Religion names ... . 
    Ibtihaj represented the United States of America at the Olympics and brought home a medal , elevating the status of 
    A story point is a metric used in agile project management and development to determine (or estimate) the difficul 
    I 'm not shy or quiet , I just do n't find your mind appealing in any way shape or form and I 'm not gon na force a conv 
    <START:HASHTAG> #paradisepapers <END> , Canadian Taxpayers Federation (CTF) & amp ; tax reform `` CTF has not uttered even a single shocked-and-a 
    ... 

我发现,如果它传递一个句子并不能直接使用的模型是无法识别的任何主题标签在我的训练集,如:

String paragraph = "Take a shot for #harambe he took one for you!"; 

它将无法识别在这个例子中包括hashtag,即使我检查,并有我的训练数据内使用#harambe的一个实例。

但是,如果我一个句子直接通过它从训练数据:

String nameParagraph = "Idk whats funnier the #harambe or the fact that Im the only one who will see my page https : t.co/2eWjm6mOon "; 

这将能够正确识别它作为一个HASHTAG识别#harambe。

我希望我的模型来识别所有的井号标签,所以我不只是要养活它#harambe主题标签的多个实例,以便它能够识别出单#标签。

对我怎样才能使我的模型正确识别不在训练集合中的新实体的任何建议?提前致谢!

+1

有什么理由,为什么你不能使用正则表达式来识别哈希标签? – jbird

+0

所以我只是用它作为一种“第一次测试”来看看它是否可以接受一些简单的东西,我打算用它来识别正则表达式无法轻松找到的各种实体。 –

+0

您可以制作一个自定义要素生成器来触发每个“#”,但我不知道如何使用这些功能。无论如何,因为一个hashtag遵循一个模式,如果可以的话,我会坚持正则表达式。 – jbird

回答

0

我不知道你为什么要进行统计建模的问题是确定性的。使用正则表达式jbird7提到的,你还可以:

记号化使用WhitespaceTokenizer

迭代通过串看着字符串的第一个字符数组文本(是#)。

\\ create a Tokenizer 
Tokenizer tokenizer=WhitespaceTokenizer.INSTANCE 
String[] tokens = tokenizer.tokenize(text) 

\\ use old-style loop for span creation 
List<Span> spans = new ArrayList<Span>() 
for (int i=0;i<tokens.length;i++){ 
    if (token.charAt(0) == '#') spans.add(new Span(i,i+1,"HashTag")) 
} 
Span[] foundTags = spans.toArray(new Span[spans.size]) 

此时,您应该具有与HashTagNameFinder完全相同的输出。对不起,如果有语法错误。代码应该让你知道你想要做什么。

+0

是的你是对的。正如上面提到的jbird7,正则表达式可以很好地工作。我应该表明,我正在使用标签作为“第一测试”来查看模型是否可以识别一个简单的实体。我打算用它来识别正则表达式无法识别的其他实体,例如。)活动 - >远足,绘画,足球。不过感谢有关正则表达式的建议,我会转而理解这个概念以识别具有确定性的实体。 –

+0

好的,那么您的训练模型没有找到#harambe的原因可能是您没有足够的训练数据。分类器使用诸如单词,前两个单词之类的特征,该单词和前两个单词是否大写。因此,训练分类器需要多个示例。对于您给出的示例,添加一个功能,用于检查当前单词的第一个字母是否为hashtag。这个功能非常强大,你应该能够用几个例子来制作一个体面的分类器。 – HowYaDoing

+0

要创建自定义功能,请参阅https://opennlp.apache.org/docs/1.8.0/manual/opennlp.html#tools.namefind.training.featuregen – HowYaDoing

相关问题