Java NLP:在对文本进行标记时提取索引

时间:2012-09-13 02:39:38

标签: java nlp token tokenize information-retrieval

当标记一串文本时,我需要提取标记化单词的索引。例如,给定:

"Mary didn't kiss John"

我需要类似的东西:

[(Mary, 0), (did, 5), (n't, 8), (kiss, 12), (John, 17)]

其中0,5,8,12和17对应于令牌开始的索引(在原始字符串中)。我不能只依赖空格,因为有些单词会成为2个令牌。此外,我不能只搜索字符串中的标记,因为单词可能会出现多次。

一个巨大的障碍是我正在使用“脏”文本。以下是语料库中的一个真实示例及其标记化:

字符串:

The child some how builds a boaty  c capable of getting scrtoacross the sea, even after findingovercoming many treachrous rous obsittalcles.

令牌:

The, child, some, how, builds, a, boaty, , , c, , capable, of, getting, scrto, , across, the, sea, ,, even, after, finding, , , , , overcoming, many, treachrous, rous, obsittalcles, .

我目前正在使用OpenNLP对文本进行标记,但对于使用哪种API进行标记化而言却很矛盾。它确实需要是Java,所以(不幸的是)Python的NLTK是不可能的。

任何想法都将不胜感激!谢谢!

3 个答案:

答案 0 :(得分:1)

您可以将OpenNLP Tokenizer与UIMA一起使用。 UIMA中的令牌注释器将为令牌创建一个类型,该类型将包括令牌的开始和结束索引。您还可以将诸如词性标记,词干,引理等功能附加到令牌。 UIMA有Java和C ++ API。

答案 1 :(得分:1)

OpenNLP将使用Tokenizer.tokenizePos(String s)方法返回偏移量,请参阅OpenNLP API for TokenizerME作为已实现的标记生成器的示例。返回的每个Span都包含令牌的开始和结束位置。

您是否决定使用UIMA实际上是一个单独的问题,但OpenNLP确实为使用tokenizePos()的令牌化程序提供了UIMA注释器。但是,如果你只想标记一个字符串,那么UIMA绝对有点过分......

答案 2 :(得分:0)

您可以使用BreakIterator而不是使用任何外部API。