2015-06-24 1 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

using java.io; 
using edu.stanford.nlp.process; 
using edu.stanford.nlp.ling; 
using edu.stanford.nlp.trees; 
using edu.stanford.nlp.parser.lexparser; 
using Console = System.Console; 

namespace Parser 
{ 

    class Parser 
    { 
     //loads the lexical parser 
     private static LexicalizedParser LoadLexicalizedParser() 
     { 
      // Path to models extracted from `stanford-parser-3.5.2-models.jar` 
      var jarRoot = @"E:\Project\stanford-parser-full-2015-04-20\stanford-parser-3.5.2-models"; 
      var modelsDirectory = jarRoot + @"\edu\stanford\nlp\models"; 

      // Loading english PCFG parser from file 
      var lp = LexicalizedParser.loadModel(modelsDirectory + @"\lexparser\englishPCFG.ser.gz"); 

      return lp; 
     } 

     //gets the lexical tree for a 'sentence' 
     private static Tree GetLexicalTree(LexicalizedParser lp, string sentence) 
     { 
      string[] words = sentence.Split(' '); 
      // This sample shows parsing a list of correctly tokenized words    
      var rawWords = Sentence.toCoreLabelList(words); 
      var tree = lp.apply(rawWords); 

      return tree; 
     } 

     //gets the constituency tree from the lexical 'tree' as a string 
     private static string GetConstituencyTree(Tree tree) 
     { 
      return tree.pennString(); 
     } 

     //gets the dependency tree from the lexical 'tree' as a string 
     private static string GetDependencyTree(Tree tree) 
     { 
      // Extract dependencies from lexical tree 
      var tlp = new PennTreebankLanguagePack(); 
      var gsf = tlp.grammaticalStructureFactory(); 
      var gs = gsf.newGrammaticalStructure(tree); 
      var tdl = gs.typedDependenciesCCprocessed(); 

      string dependencyTree = String.Empty; 

      for (int i = 0; i < tdl.size(); ++i) 
       dependencyTree += tdl.get(i) + "\n"; 

      return dependencyTree; 
     } 


     static void Main() 
     { 
      var lp = LoadLexicalizedParser(); 
      string sentence = "This is an easy sentence."; 

      Tree tree = GetLexicalTree(lp, sentence); 

      string constituencyTree = GetConstituencyTree(tree); 
      string dependencyTree = GetDependencyTree(tree); 

      Console.WriteLine("Constituency Tree\n" + constituencyTree); 
      Console.WriteLine("Dependency Tree\n" + dependencyTree); 

      //// Extract collapsed dependencies from parsed tree 
      //var tp = new TreePrint("penn,typedDependenciesCollapsed"); 
      //tp.printTree(tree); 
     } 
    } 
} 

В этом коде я получаю дерево окружения и дерево зависимостей как строки. Но я хочу использовать их, используя сам тип «Дерево», т.е. Я хочу получить доступ и манипулировать узлами переменной «tree». Есть ли способ сделать это? Или мне нужно создать свою собственную структуру данных дерева и получить отдельные узлы, обработав строки ('constituencyTree' & 'dependencyTree')?Как получить доступ к отдельным узлам в дереве зависимостей и дереве участников, возвращенном Стэнфордским парсером?

[Мне это нужно для небольшой проект, который я делаю в данный момент.]

ответ

1

Да, существует множество структур данных для работы с избирательных округов деревьев и деревьев зависимостей. Для деревьев окружения вы хотите работать с структурой данных Tree, которая имеет множество полезных встроенных функций для перемещения деревьев, получения всех конечных узлов и т. Д.

Для деревьев зависимостей вы можете либо работать со списком объектов TypedDependency где каждый TypedDependency представляет собой отношение между словам губернатора и зависимым словом, или вы можете работать с SemanticGraph. Для преобразования списка TypedDependency который вы назвали tdl в вашем примере с SemanticGraph, просто передать список конструктору:

SemanticGraph sg = new SemanticGraph(tdl); 
+0

Вы имеете в виду, TDL право? В любом случае, спасибо! Можете ли вы дать мне несколько советов о том, как пройти дерево с помощью встроенных методов ..... Есть несколько методов, таких как getChild(), но getChild требует индекса ребенка ... как я могу это знать заранее ? – noob11

+0

Да, для 'getChild' вам нужно знать индекс, но вы можете просто пропустить все дочерние элементы (вы можете получить все дети с' children() 'или' getChildrenAsList() '). –

+0

Хорошо. Благодаря! Кроме того, при использовании семантического графика я получаю ребра (зависимости), которых нет, когда я печатаю зависимости. [link] (https://www.dropbox.com/s/npp9jthq788bmc1/example.png?dl=0) На изображении первая часть показывает зависимости, напечатанные парсером stanford, вторая часть показывает зависимости, напечатанные меня, вы заметите несколько дополнительных краев ... @SebastianSchuster – noob11

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