11

我正在从事一个自然语言处理 (NLP) 项目,在该项目中,我使用句法解析器从给定的句子中创建句法解析树。

示例输入:我遇到了 Joe 和 Jill,然后我们去购物
示例输出: [TOP [S [S [NP [PRP I]] [VP [VBD ran] [PP [IN into] [NP [NNP Joe] [CC和] [NNP Jill]]]]] [CC and] [S [ADVP [RB then]] [NP [PRP we]] [VP [VBD going] [NP [NN shopping]]]]]] 在此处输入图像描述

我正在寻找一个 C# 实用程序,它可以让我执行复杂的查询,例如:

  • 获取与“乔”相关的第一个 VBD
  • 获取最接近“购物”的 NP

这是一个执行此操作的Java 实用程序,我正在寻找 C# 等价物。
任何帮助将非常感激。

4

2 回答 2

3

至少有两个 NLP 框架,即

在这里您可以找到在 .NET 中使用 java NLP 的说明:

此页面是关于使用 java OpenNLP,但可以适用于您在帖子中提到的 java 库

或者按照以下指南使用 NLTK:

于 2013-02-04T00:38:22.980 回答
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);
于 2013-02-04T12:22:52.267 回答