11

私は、構文パーサーを使用して特定の文から構文解析ツリーを作成する自然言語処理 (NLP) プロジェクトに取り組んでいます。

入力例:私はジョーとジルに出くわし、買い物に行きました
出力例: [TOP [S [S [NP [PRP I]]] [VP [VBD ran] [PP [IN into] [NP [NNP Joe] [CC and] [NNP Jill]]]]] [CC and] [S [ADVP [RB then]] [NP [PRP we]] [VP [VBD going] [NP [NN shopping]]]]]] ここに画像の説明を入力

次のような複雑なクエリを実行できる C# ユーティリティを探しています。

  • 「Joe」に関連する最初の VBD を取得する
  • 「ショッピング」に最も近い NP を取得する

これを行うJava ユーティリティを次に示します。C# に相当するものを探しています。
どんな助けでも大歓迎です。

4

2 に答える 2

3

少なくとも 2 つの NLP フレームワークがあります。

また、.NET で Java NLP を使用する手順は次のとおりです。

このページは Java OpenNLP の使用に関するものですが、投稿で言及した Java ライブラリにも適用できます。

または、次のガイドラインに従って NLTK を使用します。

于 2013-02-04T00:38:22.980 に答える
2

すでに使用しています

1 つのオプションは、出力を 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);

これがあなたの2番目の例です

//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 に答える