使用CoreNLP

时间:2015-06-12 17:18:59

标签: java nlp stanford-nlp

我对Stanford CoreNLP将文本分成句子的方式几乎没有问题,即:

  1. 它对待!和? (感叹号和问号)在引用的文本中作为一个句子结尾,它不应该,例如:他喊“爱丽丝!爱丽丝!” - 在这里对待!在第一个Alice作为一个句子结束后,将文本分成两个句子。
  2. 它不会将省略号识别为句子结尾。
  3. 在NLTK中,我们将通过简单地在分成句子之前和之后对文本进行标准化来处理这些问题,即,在分割之前用其他符号替换所述标记,然后将它们返回以便以适当的形式将它们发送到管道之下。

    但是,CoreNLP中的标记化程序在分成句子之前会进行标记,并且不会给调整过程留下太多空间。所以,我的第一个问题是:是否有可能“纠正”令牌化器而不重写它以解决这种情况?

    如果不是,我们是否至少可以从管道的其余部分(在我的情况下是pos,lemma和parse)中分离标记化,以便我们可以在将它们向下发送之前自行更改标记?

    谢谢!

1 个答案:

答案 0 :(得分:3)

在我看来,你最好将标记化阶段与其他下游任务分开(所以我基​​本上回答了问题2)。您有两种选择:

  1. 使用Stanford tokenizer进行Tokenize(来自Stanford CoreNLP用法页面的示例)。注释器选项应该只在你的情况下使用'tokenizer'。

    java -cp "*" -Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner,parse,dcoref -file input.txt
    

    执行此操作后,您可以要求其他模块不对您的输入进行标记。例如,Stanford Parser有一个命令行标志(-tokenized),您可以设置该标志以指示您的输入已经被标记化。

  2. 使用其他标记器(例如,NLTK)进行标记,并遵循1的第二部分。

  3. 事实上,如果你使用任何外在工具将文本拆分成句子(基本上你不想再拆分的块),你可以选择在CoreNLP工具中设置一个命令行标志,它不会尝试并分开你的输入。对斯坦福分析器来说,这是通过使用“-sentences newline”标志来完成的。如果你有一个可靠的句子检测器,这可能是最简单的事情。