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

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

Пример ввода: Я столкнулся с Джо и Джилл, а затем мы пошли по магазинам
Пример вывода: [TOP [S [S [NP [PRP I]] [VP [VBD run] [PP [IN into] [NP [NNP Joe] [CC and] [NNP Jill]]]]] [CC and] [S [ADVP [ РБ потом]] [НП [ПРП мы]] [ВП [ВБД пошли] [НП [НН за покупками]]]]]] введите здесь описание изображения

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

  • Получить первый VBD, связанный с «Джо»
  • Получите ближайший к «Покупкам» NP

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


person Gilad Gat    schedule 03.02.2013    source источник
comment
Для downvoter, не могли бы вы объяснить, почему? Этот вопрос четко соответствует FAQ сайта.   -  person Benjamin Gruenbaum    schedule 03.02.2013


Ответы (2)


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

Одним из вариантов было бы разобрать вывод в код C#, а затем закодировать его в XML, превратив каждый узел в 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's 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);
person Benjamin Gruenbaum    schedule 04.02.2013

Существует как минимум две структуры НЛП, т.е.

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

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

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

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

person JotaBe    schedule 04.02.2013