2012-05-18 58 views
0

我想根據英語句子的解析描述(縮寫形式的句法解析)生成解析樹(Java對象)。我正在使用Java,並且也需要定義一個高效的樹。例如。說明:根據解析描述生成解析樹

(ROOT (S (NP (PRP I)) (VP (MD would) (VP (VB love) (S (VP (TO to) (VP (VB go) (PRT (RP out)) (PP (IN with) (NP (PRP you)))))))) (. .)) 
+0

我建議你找一個現有的NLP解析器。分析自然語言非常困難。 –

+0

@IraBaxter我已經有了一個句子的解析樹,這個句子在語料庫中的許多句子中被手動糾正。使用統計NLP解析器只會引入錯誤。 – damned

+0

您對問題的描述太短,無法得到連貫的答案。在這個問題中,你說「我想生成一個解析器樹」;在這個評論中,你說「我已經有一個分析樹」。這很混亂。用一種我們不必猜測你的問題的方式來寫你的問題。 –

回答

0

我終於摸索出來自己:)

public static Node getParseTree(String[] parseTokens, ArrayList<Node> leafNodeList) 
{ 
    Node top = new Node("TOP"); 
    Node rest = getParseTree(parseTokens, 2, top, false, leafNodeList); 
    return top; 
} 

public static Node getParseTree(String[] parseTokens, int currIndex, Node lastNode, Boolean closeBrace, ArrayList<Node> leafNodeList) 
{ 
    if(currIndex>=parseTokens.length) return lastNode; 
    else if("(".equals(parseTokens[currIndex])) 
    { 
     Node newNode = lastNode.addChild(parseTokens[currIndex+1]);//The next token is the data for the new node constructed 
     return getParseTree(parseTokens, currIndex+2, newNode, false, leafNodeList); 
    } 
    else if(")".equals(parseTokens[currIndex])) 
    { 
     if(closeBrace) return getParseTree(parseTokens, currIndex+1, lastNode.getParent(), true, leafNodeList); 
     else return getParseTree(parseTokens, currIndex+1, lastNode, true, leafNodeList); 
    } 
    else //leaf node 
    { 
     Node newNode = lastNode.addChild(parseTokens[currIndex]); 
     leafNodeList.add(newNode); 
     return getParseTree(parseTokens, currIndex+2, lastNode.getParent(), true, leafNodeList); 
    }  
} 

Node test(String parseDesc) 
{ 
     parseDesc = parseDesc.replace("(", " ("); 
     parseDesc = parseDesc.replace(")", ") "); 
     String[] parseDescTokens = parseDesc.trim().split("\\s+"); 
     Node treeReqd = getParseTree(parseDescTokens, leafNodes);// Required Tree 
}