2

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

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

像这样分裂:[I] ['m] [24] [years] [old]

是否可以使用斯坦福 coreNLP 像这样拆分它?:[I​​'m] [24] [years] [old]

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

4

3 回答 3

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, .]
}
于 2012-12-28T02:51:03.050 回答
4

目前,没有。随后的斯坦福 CoreNLP 处理工具都使用Penn Treebank 标记化,它将缩略词分成两个标记(将“I'm”视为“I am”的简化形式,使其成为两个“单词”[I] ['m]) . 听起来您想要一种不同类型的标记化。

虽然有一些标记化选项,但没有一个可以改变这一点,并且后续工具(如 POS 标记器或解析器)会在不拆分收缩的情况下运行不佳。您可以将这样的选项添加到标记器,更改(删除)REDAUX 和 SREDAUX 尾随上下文的处理。

您也可以按照@dhg 的建议通过后期处理加入缩略语,但您希望在“if”中更仔细地进行操作,以便它不会加入引号。

于 2012-12-28T14:07:05.470 回答
2

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

通过词性标签,我们可以分辨出区别。使用树外科医生语法,您可以组装、更改它们等等。语法在这里列出:http: //nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/turgeon/package-summary.html。我发现树外科医生在分离 NP 组时非常有用,因为我喜欢通过连词来分解它们。

或者,'m 是否源于“am”?您可能想要寻找那些并寻找它的词干标签,然后简单地将其恢复为该值。词干在机器学习和分析的许多其他方面都非常有用。

于 2012-12-28T18:17:19.120 回答