Подтвердить что ты не робот

Есть ли утилита С# для сопоставления шаблонов в (синтаксическом разборе) деревьях?

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

Пример ввода: Я столкнулся с Джо и Джиллом, а затем мы пошли по магазинам
Результат: [TOP [S [S [NP [PRP I]] [VP [VBD ran] [PP [IN in] [NP [NNP Joe] [CC и] [NNP Jill]] ]]] [CC и] [S [ADVP [RB then]] [NP [PRP we]] [VP [VBD пошел] [NP [NN shopping]]]]]] enter image description here

Я ищу утилиту С#, которая позволит мне выполнять сложные запросы, например:

  • Получить первый VBD, связанный с 'Joe'
  • Получить NP ближе всего к "Покупкам"

Здесь утилита Java, которая делает это, я ищу эквивалент С#.
Любая помощь будет высоко оценена.

4b9b3361

Ответ 1

Мы уже используем

Один вариант: разобрать вывод в код С# и затем кодировать его в XML, создавая каждый node в string.Format("<{0}>", this.Name); и string.Format("</{0}>", this._name); в середине переведите все дочерние узлы рекурсивно.

После этого я буду использовать инструмент для запроса XML/HTML для синтаксического анализа дерева. Тысячи людей уже используют селектора запросов и jQuery для разбора древовидной структуры, основанной на связи между узлами. Я думаю, что это намного превосходит TRegex или другие устаревшие и неуправляемые утилиты java.

Например, это ответ на ваш первый пример:

var xml = CQ.Create(d.ToXml());
//this can be simpler with CSS selectors but I chose Linq since you'll probably find it easier
//Find joe, in our case the node that has the text 'Joe'
var joe = xml["*"].First(x => x.InnerHTML.Equals("Joe")); 
//Find the last (deepest) element that answers the critiria that it has "Joe" in it, and has a VBD in it
//in our case the VP
var closestToVbd = xml["*"].Last(x => x.Cq().Has(joe).Has("VBD").Any());
Console.WriteLine("Closest node to VPD:\n " +closestToVbd.OuterHTML);
//If we want the VBD itself we can just find the VBD in that element
Console.WriteLine("\n\n VBD itself is " + closestToVbd.Cq().Find("VBD")[0].OuterHTML);

Вот ваш второй пример

//Now for NP closest to 'Shopping', find the element with the text 'shopping' and find it closest NP
var closest = xml["*"].First(x =>     x.InnerHTML.Equals("shopping")).Cq()
                      .Closest("NP")[0].OuterHTML;
Console.WriteLine("\n\n NP closest to shopping is: " + closest);

Ответ 2

Существует, по крайней мере, две структуры NLP, то есть

  • SharpNLP (ПРИМЕЧАНИЕ: проект неактивен с 2006 года)
  • Proxem

И здесь вы можете найти инструкции по использованию java-NLP в .NET:

Эта страница посвящена использованию java OpenNLP, но может применяться к java-библиотеке, о которой вы упоминали в своем сообщении.

Или используйте NLTK, следуя этим рекомендациям: