2013-04-16 2 views
4

Я занимаюсь анализом зависимости от библиотеки Стэнфорда в Java. Есть ли способ вернуть индексы в моей исходной строке зависимости? Я пытался вызвать getSpans() метод, но он возвращает нуль для каждого маркера:Stanford Dependency Parser - как получить пролеты?

LexicalizedParser lp = LexicalizedParser.loadModel(
     "edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz", 
     "-maxLength", "80", "-retainTmpSubcategories"); 
TreebankLanguagePack tlp = new PennTreebankLanguagePack(); 
GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory(); 
Tree parse = lp.apply(text); 
GrammaticalStructure gs = gsf.newGrammaticalStructure(parse); 
Collection<TypedDependency> tdl = gs.typedDependenciesCollapsedTree(); 
for(TypedDependency td:tdl) 
{ 
     td.gov().getSpan() // it's null! 
     td.dep().getSpan() // it's null! 
} 

Любая идея?

ответ

2

Я, наконец, в конечном итоге писать свою собственную функцию помощника, чтобы получить пролеты из моей исходной строки:

public HashMap<Integer, TokenSpan> getTokenSpans(String text, Tree parse) 
{ 
    List<String> tokens = new ArrayList<String>(); 
    traverse(tokens, parse, parse.getChildrenAsList()); 
    return extractTokenSpans(text, tokens); 
} 

private void traverse(List<String> tokens, Tree parse, List<Tree> children) 
{ 
    if(children == null) 
     return; 
    for(Tree child:children) 
    { 
     if(child.isLeaf()) 
     { 
      tokens.add(child.value()); 
     } 
     traverse(tokens, parse, child.getChildrenAsList());   
    } 
} 

private HashMap<Integer, TokenSpan> extractTokenSpans(String text, List<String> tokens) 
{ 
    HashMap<Integer, TokenSpan> result = new HashMap<Integer, TokenSpan>(); 
    int spanStart, spanEnd; 

    int actCharIndex = 0; 
    int actTokenIndex = 0; 
    char actChar; 
    while(actCharIndex < text.length()) 
    { 
     actChar = text.charAt(actCharIndex); 
     if(actChar == ' ') 
     { 
      actCharIndex++; 
     } 
     else 
     { 
      spanStart = actCharIndex; 
      String actToken = tokens.get(actTokenIndex); 
      int tokenCharIndex = 0; 
      while(tokenCharIndex < actToken.length() && text.charAt(actCharIndex) == actToken.charAt(tokenCharIndex)) 
      { 
       tokenCharIndex++; 
       actCharIndex++; 
      } 

      if(tokenCharIndex != actToken.length()) 
      { 
       //TODO: throw exception 
      } 
      actTokenIndex++; 
      spanEnd = actCharIndex; 
      result.put(actTokenIndex, new TokenSpan(spanStart, spanEnd)); 
     } 
    } 
    return result; 
} 

Тогда я буду называть

getTokenSpans(originalString, parse) 

Так я получить карту, которая может сопоставьте каждый токен с соответствующим интервалом маркера. Это не изящное решение, но, по крайней мере, оно работает.

0

Даже если вы уже ответили на свои собственные вопросы, и это старый поток: я просто наткнулся на ту же проблему сегодня, но с (Stanford) LexicalizedParser, а не с парсером зависимости. Не проверял его на зависимость одного, но следующий решить мою проблему в сценарии lexParser:

List<Word> wl = tree.yieldWords(); 
int begin = wl.get(0).beginPosition(); 
int end = wl.get(wl.size()-1).endPosition(); 
Span sp = new Span(begin, end); 

Если Span затем проводит индексы (суб) дерева. (И если вы дойдете до терминалов, я думаю, что то же самое должно работать на уровне токенов).

Надеюсь, это поможет кому-то еще столкнуться с той же проблемой!

Смежные вопросы