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')?Как получить доступ к отдельным узлам в дереве зависимостей и дереве участников, возвращенном Стэнфордским парсером?
[Мне это нужно для небольшой проект, который я делаю в данный момент.]
Вы имеете в виду, TDL право? В любом случае, спасибо! Можете ли вы дать мне несколько советов о том, как пройти дерево с помощью встроенных методов ..... Есть несколько методов, таких как getChild(), но getChild требует индекса ребенка ... как я могу это знать заранее ? – noob11
Да, для 'getChild' вам нужно знать индекс, но вы можете просто пропустить все дочерние элементы (вы можете получить все дети с' children() 'или' getChildrenAsList() '). –
Хорошо. Благодаря! Кроме того, при использовании семантического графика я получаю ребра (зависимости), которых нет, когда я печатаю зависимости. [link] (https://www.dropbox.com/s/npp9jthq788bmc1/example.png?dl=0) На изображении первая часть показывает зависимости, напечатанные парсером stanford, вторая часть показывает зависимости, напечатанные меня, вы заметите несколько дополнительных краев ... @SebastianSchuster – noob11