我正在尝试使用斯坦福coreNLP将一个句子分成单词。 我对包含撇号的单词有疑问。
例如,句子: 我今年24岁。
这样的分裂: [I] ['m] [24] [年] [old]
是否可以使用Stanford coreNLP将其拆分?: [我] [24] [年] [旧]
我尝试过使用tokenize.whitespace,但它没有拆分其他标点符号,例如:'?'和','
答案 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组方面非常有用,因为我喜欢将它们分开来。
或者,是否应该“上午”?您可能希望查找它们并查找它的干标记并简单地将其恢复为该值。词干在机器学习和分析的许多其他方面非常有用。