2013-02-03 45 views
11

Tôi đang làm việc trong một dự án Xử lý ngôn ngữ tự nhiên (NLP), trong đó tôi sử dụng một trình phân tích cú pháp cú pháp để tạo ra một cú pháp phân tích cú pháp từ một câu đã cho.Có tiện ích C# nào cho các mẫu phù hợp trong cây (cú pháp phân tích cú pháp) không?

Example Input: Tôi chạy vào Joe và Jill và sau đó chúng tôi đã đi mua sắm
Kết quả ví dụ: [TOP [S [S [NP [PRP I]] [VP [VBD chạy] [PP [IN vào] [NP [NNP Joe] [CC và] [NNP Jill]]]]] [CC và] [S [ADVP [RB rồi]] [NP [PRP chúng tôi]] [VP [VBD đã đi] [NP [NN mua sắm]]]]]] enter image description here

tôi đang tìm một tiện ích C# mà sẽ cho phép tôi làm các truy vấn phức tạp như:

012.
  • Lấy VBD đầu tiên liên quan đến 'Joe'
  • Lấy NP gần 'Shopping'

Dưới đây là một Java utility mà thực hiện điều này, tôi đang tìm một C# tương đương.
Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

+2

Để downvoter, bạn sẽ nhớ giải thích tại sao? Câu hỏi này rõ ràng tuân theo Câu hỏi thường gặp về trang web. –

Trả lời

2

Chúng tôi đã sử dụng

Một tùy chọn sẽ là parse the output into C# code và sau đó mã hóa nó thành XML làm cho mỗi nút thành string.Format("<{0}>", this.Name);string.Format("</{0}>", this._name); ở giữa đặt tất cả các nút con đệ quy.

Sau khi bạn thực hiện việc này, tôi sẽ sử dụng a tool for querying XML/HTML để phân tích cú pháp cây. Hàng ngàn người đã sử dụng bộ chọn truy vấn và jQuery để phân tích cấu trúc giống cây dựa trên mối quan hệ giữa các nút. Tôi nghĩ rằng điều này vượt trội so với TRegex hoặc các tiện ích java đã lỗi thời và chưa được duy trì khác.

Ví dụ, đây là để trả lời ví dụ đầu tiên của bạn:

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); 

Dưới đây là ví dụ thứ hai của bạn

//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); 
3

Có ít nhất hai khung NLP, tức là

  • SharpNLP (Chú ý: Dự án không hoạt động kể từ 2006)
  • Proxem

Và ở đây bạn có thể tìm hướng dẫn sử dụng NLP java trong .NET:

Trang này là về việc sử dụng java OpenNLP, nhưng có thể áp dụng đối với các thư viện java bạn đã đề cập trong bài viết của bạn

Hoặc sử dụng NLTK sau hướng dẫn này: