2010-04-06 26 views
9

Có thư viện nào cho .NET xử lý việc xác định Indefinite Article của danh từ không?Thư viện để xác định bài viết không xác định của một danh từ?

Cố gắng thô lỗ của tôi ở bên dưới, có thể sẽ hoạt động cho 99% mức sử dụng của tôi (có thể chấp nhận được) chỉ cần tự hỏi liệu có bất kỳ giải pháp thay thế nào được thiết lập không?

public static string GetIndefinateArticle(string noun) 
{ 
    if(string.IsNullOrEmpty(noun)) 
     return noun; 

    var first = noun[0]; 

    if(first == 'a' || 
     first == 'e' || 
     first == 'i' || 
     first == 'o') 
     return "an " + noun; 

    return "a " + noun; 
} 

Cập nhật: Eamon chỉ ra một câu hỏi trùng lặp trong các ý kiến: How can I correctly prefix a word with "a" and "an"? Tôi sẽ để lại Q này ở đây và mở dù, bởi vì tôi vẫn không thực sự có một câu trả lời.

+1

Theo Grammar Girl, việc sử dụng bài báo vô thời hạn dựa trên âm thanh của danh từ, Worth lưu ý nó ở đây, tôi nghĩ vậy. http://grammar.quickanddirtytips.com/ –

+5

yeah tôi nhận ra điều này, nhưng xác định âm thanh từ ascii là khá khó khăn! Do đó tự hỏi nếu có bất kỳ libs mà có lẽ kiểm tra các kết hợp thư bắt đầu chung được nhóm lại dựa trên âm thanh của chúng? –

+0

bạn nên chuyển "a" và "an". – lugte098

Trả lời

0

gì tôi sẽ làm là:

var first = noun[0]; 
var second = noun[1]; 

if(first == 'a' || 
    first == 'e' || 
    first == 'i' || 
    first == 'o') 
    return "an " + self; 

if(first == 'u') 
    if (second == 'n' || 
     second == 'l') 
     return "an " + self; 

if(first == 'h') 
    if (second == 'i') 
     return "an " + self; 

return "a " + self; 

Vì vậy, bạn có thể xác định một số trường hợp một số chữ cái kết hợp với từng loại hình khác một âm thanh nào đó. Hi vọng điêu nay co ich.

+1

Câu lệnh 'if' của bạn cho' h' rất sai. Nó sẽ tạo ra 'một hit' và' một danh dự', cả hai đều không chính xác. –

+0

Bạn có quen thuộc với câu lệnh điều khiển có tên là 'switch' không? – ANeves

+0

@Matthew Ferreira: hãy nhớ rằng đây chỉ là một ví dụ về khái niệm. – lugte098

2

Vì tất cả những gì bạn thực sự đang làm là kiểm tra các mẫu trong chuỗi, bạn có thể sử dụng cụm từ thông dụng. Điều này cũng nên cho phép mở rộng trong tương lai của combo thư như lutge098 nói về:

public static string GetIndefinateArticle(string noun) 
{ 
    if (Regex.IsMatch(noun, "^([aeio]|un|ul)", RegexOptions.IgnoreCase)) 
     return "an " + noun; 
    else 
     return "a " + noun; 
} 
+0

Nó sẽ là một regex dài và khó khăn, nhưng hiệu quả hơn – lugte098

+1

@ lugte Bạn chưa từng thấy một regex dài và khó khăn cho đến khi bạn đã nhìn thấy một cách thích hợp để xác nhận địa chỉ email. Đó là ** trên 6 dòng! ** – Earlz

+1

@Earlz Nếu bạn đặt nó theo cách đó, tôi đoán tôi đã không: D – lugte098

6

Nếu đây là một cái gì đó bạn không cần thực hiện nghiêm túc, bạn có thể xem xét porting các thư viện Ruby Ngôn ngữ (tiếng Anh) để Net. Đó là mã nguồn mở & thực hiện công việc khá tốt để tính toán các bài viết chính xác.

http://deveiate.org/projects/Linguistics/

+2

+1 để trả lời câu hỏi (là có một thư viện) chứ không phải là cobbling cùng một số mã. –

+1

Nhìn thấy như IronRuby vừa được phát hành, có thể không cần phải cổng! Tôi sẽ chơi vào ngày mai. Cảm ơn –

0

Nguyên tắc cơ bản của "a" trước một phụ âm và "an" trước một nguyên âm được bạn hầu hết các con đường đó, điều đó sẽ rất dễ dàng để thực hiện. Vấn đề là trường hợp "âm thanh giống như nguyên âm = một" - điều đó sẽ khó hơn nhiều.

0

Không, và nó không đơn giản như chỉ cần bỏ thêm n khi ký tự tiếp theo là nguyên âm. Có một loạt các tinh tế xung quanh nó, và bạn cũng phải xem xét làm thế nào để xử lý h - một số sử dụng an trước khi nó, một số thì không.

Đây cũng là tiếng Anh cụ thể và khung là tương đối bất khả tri về ngôn ngữ.

Điều này có nghĩa bạn sẽ phải nấu nó lên bản thân :)

2

Tôi đã triển khai thư viện để thực hiện việc này: https://github.com/eamonnerbonne/a-vs-an; đó là AvsAn trên nuget. Nó dựa trên các mẫu sử dụng thực tế trong wikipedia và do đó thậm chí còn giao dịch tốt với những thứ phức tạp như ...

  • "một số lượng 0800"
  • "một ∞ của oregano"
  • "một chuyến bay của NASA"
  • "chuyên gia phân tích NSA"

Nói cách khác, nó thường thậm chí sẽ đối phó hợp lý với nhiều thứ không phải là từ thông thường.

Các vấn đề liên quan