2015-10-17 120 views
1

我正在研究使用CoreNlp爲了解析句子,使用各種可用的註釋器(主要是選區和情緒)的研究。「合併」依賴關係和選區樹

我現在試圖創建一個「合併」樹,其中包括我將從中提取語法(可以考慮PCFG)的選區和依賴信息。

我試圖得到類似的圖像在左樹:

​​ (從Relational-Realizational Parsing (Tsarfaty and Sima’an, 2008)圖像)

有一些「簡單」的方式與所提供的解析器輸出工作(在代碼就是)得到類似的東西?

或者,您可能知道基於斯坦福NLP庫的任何實現嗎?

請問GrammaticalStructure會有幫助嗎?是否爲每個節點製作一個GS並在每個選區節點讀取它是typedDependencies()這裏有意義?

回答

0

爲創建合併選區和依賴樹所需的代碼創建了一個「代碼片段」(相當長的一段代碼),該代碼遵循上述建議的線路 - 遍歷兩棵樹。

Merge Constituency and Dependency

在較高水平的過程:

  1. 使用解析器/管道

  2. 從它那裏得到的樹和語法結構獲得選區樹,輸入依賴性(注意 - 保持標點符號)

  3. 將類型化依賴轉換爲依賴樹

  4. 根據匹配的節點覆蓋範圍合併依賴和選區樹。

的代碼(類):

  • DependencySpan - 表示跨度和覆蓋它的節點(用於匹配跨度)

  • DependencyTreeNode - 在依賴關係樹中的節點,其保持參考核心標籤(其反過來具有用於獲得跨度的相關字索引)

  • MergedNode - 合併選區+依賴節點。

  • MergeConstituencyAndDependency - 合併樹的實際代碼 - 遵循上述算法。包括主要(測試的入口點)。

有一件事我不是100%肯定的是爲什麼需要「情緒」註釋 - 沒有它創造的語法結構將引發錯誤。

A免責聲明 - 我不熟悉斯坦福NLP圖書館及其所有選項。代碼鬆散地基於我在網上找到的其他例子,可能有更好的方法來完成這項任務。

1

下面是一些使用選區和依賴分析的代碼示意圖。

Properties props = new Properties(); 
props.setProperty("annotators","tokenize, ssplit, pos, lemma, parse"); 
StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
String sampleDoc = "This is the first sentence. This is the second one."; 
Annotation annotation = new Annotation(sampleDoc); 
pipeline.annotate(annotation); 
List<CoreMap> sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class); 
for (CoreMap sentence : sentences) { 
    Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class); 
    SemanticGraph deps = sentence.get(SemanticGraphCoreAnnotations.BasicDependenciesAnnotation.class); 
} 

爲你的項目,你會需要學習這兩個類:

http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/trees/Tree.html

http://nlp.stanford.edu/nlp/javadoc/javanlp/edu/stanford/nlp/semgraph/SemanticGraph.html

樹類代表選區解析和SemanticGraph類代表的依賴解析。

+0

謝謝 - 我真的很熟悉這些類,並想知道是否有一種「內置」合併方式或我可以使用的示例代碼。我最終實現了一個基於兩個類和我創建的中間節點格式的合併算法。我會盡快用我的代碼回答。 –