Java 如何在OpenNLP中培训标记器?
我目前正在使用OpenNLP中的空白标记器,它在找到空白的地方标记句子。 如果我有一句话,比如:Java 如何在OpenNLP中培训标记器?,java,nlp,tokenize,stringtokenizer,opennlp,Java,Nlp,Tokenize,Stringtokenizer,Opennlp,我目前正在使用OpenNLP中的空白标记器,它在找到空白的地方标记句子。 如果我有一句话,比如: My hobbies are reading books, magazines, Roller skating and playing football. 现在,如果我想从那句话中得到爱好,我想标记这个句子,不是基于空格,而是基于逗号的标记 我怎样才能做到这一点 编辑1: 主要的问题是在训练了一个NER模型之后,我将它应用到代币上。因此,它不会认识到“溜冰”,因为在记号中,它们是“滚轴”和“溜冰”
My hobbies are reading books, magazines, Roller skating and playing football.
现在,如果我想从那句话中得到爱好,我想标记这个句子,不是基于空格,而是基于逗号的标记
我怎样才能做到这一点
编辑1:
主要的问题是在训练了一个NER模型之后,我将它应用到代币上。因此,它不会认识到“溜冰”,因为在记号中,它们是“滚轴”和“溜冰”,而NER模型现在不能识别这个爱好。 < P>我没有一个具体的答案(没有一个我不认为),但是一些问题和要点你可能需要考虑。< /P> 标记器是否需要知道那些是逗号分隔的爱好?如果是这样的话,你会遇到一个更大的问题,那就是标记化。如果没有,您仍然会遇到如何处理逗号分隔部分的端点的问题。顺便说一句,在这种情况下逗号的用法是错误的,因为轮滑之后应该有一个逗号。我觉得您实际上需要构建一个“命名实体识别模型”,而不是一个标记器,但希望我在这里的评论能让您更进一步(可能不会有结果) 比如说,, 如果你用逗号标记你的句子,你会得到以下标记:
My hobbies are reading books
magazines
Roller skating and playing football.
这并没有把轮滑和踢足球分开,而且它也不知道任意一句话中逗号之间是什么
因此,简单的答案是OpenNLP并没有真正实现“基于上下文的标记化”,您必须以自己的方式来实现该逻辑
这里有一些想法
- 使用句子切块器创建标记。。。这将是基于名词短语,动词短语等,这可能是有用的
- 使用NER模型提取“嗜好”实体,这可能会很嘈杂,但会给您一些概率标记
- 使用regex查找所需内容,并仅基于regex命中创建令牌
NP: My hobbies
VP: are reading
NP: books
NP: magazines
NP: Roller skating and playing football
你可以假设动词短语(VP)是动作方面,名词短语(NP)是“东西”…我不确定为什么chunker不把玩看作动词,但NLP就是这样做的…你可以在NPs中寻找“和”,然后在这方面进行分割,但我保证你会找到一段文字,让它很糟糕
记住,在火车时刻使用的任何标记化方法都必须在分类时刻使用
希望这会有帮助,但我感觉不会有多大帮助
UPDATE IN RESPONSE TO THE OP EDIT
NER(NameFinder)将在单个令牌数组中查找多个令牌实体;所以别担心。从nameFinder.find()方法返回的Span对象是句子标记的开头和结尾。有多个部件名称是很常见的。现在,如果您认为NER模型没有返回多部分名称,那就不同了,您可能需要对更多数据进行培训,不要将其归咎于标记化