2012-12-27 85 views
2

我试图用斯坦福coreNLP将一个句子分成单词。 我遇到包含撇号的单词的问题。Stanford coreNLP - 分词忽略撇号

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

拆分这样的: [I] ['M] [24] [年] [老]

是否有可能像这样使用斯坦福coreNLP ?: 分裂[我] [24 ] [年] [旧]

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

+0

我正在尝试将句子中的单词分开。你是怎么做到的?它真的被他们的API的javadoc困惑了。 – Tim

回答

4

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

尽管存在一些标记化选项,但没有人需要更改此选项,并且随后的工具(如POS标记器或解析器)将不会收缩而分裂。您可以将这样的选项添加到标记器,更改(删除)REDAUX和SREDAUX尾随上下文的处理。

你也可以通过后处理加入收缩,就像@dhg所建议的那样,但是你希望在“if”中更仔细一点,这样它就不会加入引号。

+0

目前收缩'can't'被分成'ca'和'n't',它背后的基本原理是什么?我希望它是'可以'和'不'。 –

+0

@Christopher Manning我有一个类似的问题。对于像这样的一个句子 - abc * def - 它分成abc,*,def。但我不希望*被视为另一个令牌。如何解决此问题? – AV94

+1

@ AngularInDepth.com任何一种选择都是可能的,这个选择可能与'不'成为''''''''''''''''''''''''''不''''等等。但是,从根本上来说,我们这样做是因为这是Penn Treebank标记化标准所做的,这是英语中很多NLP资源所使用的。 –

3

如果您只是重新连接由撇号分割的令牌,那么该怎么办?

这里有一个实施的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, .] 
} 
2

有所有格和收缩。你的例子是收缩。只是寻找一个撇号不会找到你们之间的差异。 “这是皮特的回答,我相信你知道这一点。”在这两个句子中,我们有每种情况。

使用词性标签我们可以区分不同的部分。使用树外科医生的语法,你可以组装这些语句,改变它们等等。语法如下:http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/tregex/tsurgeon/package-summary.html。我发现树木外科医生在拆分NP组方面非常有用,因为我喜欢通过连词将它们分开。

或者,是否是“am”?您可能需要查找这些标签并查找它的标签并简单地将其恢复为该值。 Stemming在机器学习和分析的许多其他方面非常有用。