Stanford coreNLP - 忽略撇号的分词

时间:2012-12-27 17:07:35

标签: nlp stanford-nlp

我正在尝试使用斯坦福coreNLP将一个句子分成单词。 我对包含撇号的单词有疑问。

例如,句子: 我今年24岁。

这样的分裂: [I] ['m] [24] [年] [old]

是否可以使用Stanford coreNLP将其拆分?: [我] [24] [年] [旧]

我尝试过使用tokenize.whitespace,但它没有拆分其他标点符号,例如:'?'和','

3 个答案:

答案 0 :(得分:4)

如果你只是重新连接由撇号分割的标记呢?

这是Java中的一个实现:

public static List<String> tokenize(String s) {
    PTBTokenizer<CoreLabel> ptbt = new PTBTokenizer<CoreLabel>(
            new StringReader(s), new CoreLabelTokenFactory(), "");
    List<String> sentence = new ArrayList<String>();
    StringBuilder sb = new StringBuilder();
    for (CoreLabel label; ptbt.hasNext();) {
        label = ptbt.next();
        String word = label.word();
        if (word.startsWith("'")) {
            sb.append(word);
        } else {
            if (sb.length() > 0)
                sentence.add(sb.toString());
            sb = new StringBuilder();
            sb.append(word);
        }
    }
    if (sb.length() > 0)
        sentence.add(sb.toString());
    return sentence;
}

public static void main(String[] args) {
    System.out.println(tokenize("I'm 24 years old."));  // [I'm, 24, years, old, .]
}

答案 1 :(得分:4)

目前,没有。随后的斯坦福CoreNLP处理工具全部使用Penn Treebank tokenization,它将收缩分成两个标记(将“我是”作为“我是”的简化形式,将其设为两个“单词”[I] ['m ])。听起来你想要一种不同类型的标记化。

虽然有一些标记化选项,但是没有人可以更改它,并且后​​续工具(如POS标记器或解析器)在没有分割收缩的情况下会很糟糕。您可以将这样的选项添加到tokenizer,更改(删除)REDAUX和SREDAUX尾随上下文的处理。

你也可以像@dhg建议的那样通过后期处理加入收缩,但是你想在“if”中更加谨慎地加入收缩,所以它没有加入引号。

答案 2 :(得分:2)

有占有欲和收缩。你的例子是收缩。只是寻找撇号不会发现你们两者之间的区别。 “这是皮特的回答。我相信你知道的。”在这两个句子中,我们有一个案例。

使用词性标签我们可以区分它们。使用树形外科医生语法,您可以组装它们,更改它们等等。语法列在此处:http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/tsurgeon/package-summary.html。我发现树木外科医生在拉开NP组方面非常有用,因为我喜欢将它们分开来。

或者,是否应该“上午”?您可能希望查找它们并查找它的干标记并简单地将其恢复为该值。词干在机器学习和分析的许多其他方面非常有用。