2012-02-19 30 views
5

Tôi đang phát triển một heuristic để phát hiện ngôn ngữ tự động và muốn tìm hiểu xem các thư được đưa ra có dấu phụ (như "Đàäèî Êóëüòóðà" - tất cả các chữ cái có dấu phụ). Nó sẽ là tốt nhất nếu tôi cũng có thể nhận được loại dấu phụ, nếu có thể.Cách kiểm tra xem ký tự Unicode có dấu phụ trong .Net?

Tôi duyệt qua UnicodeCategory enum nhưng không tìm thấy bất kỳ thứ gì có thể giúp tôi ở đây.

+0

Ký tự chữ cái (Ð) không có dấu phụ. Trong Unicode, nó là một nhân vật cơ bản; đột quỵ không được coi là dấu phụ. Do đó, bạn có thể muốn cải tổ mục tiêu của mình (và có thể giải thích vấn đề cụ thể nào sẽ giải quyết được, vì có thể có cách tiếp cận tốt hơn). –

+2

Phân hủy là điều cuối cùng bạn muốn làm. Sự kết hợp của một chữ cái cụ thể với dấu phụ cụ thể là một bộ chọn mạnh cho ngôn ngữ. Chỉ cần xây dựng các bảng tần số lên phía trước. Nhưng có rất nhiều ngôn ngữ sử dụng bên cạnh không có dấu phụ. Bạn sẽ không thể nói sự khác biệt giữa tiếng Anh, tiếng Hà Lan và tiếng Ý chẳng hạn. Bạn sẽ cần một từ điển để làm cho nó thực sự hoạt động. Lưu trữ, nói, 100 từ phổ biến nhất sẽ đi một chặng đường dài. –

Trả lời

11

Một cách có thể là chuẩn hóa nó thành một biểu mẫu trong đó các chữ cái và dấu phụ của chúng được viết dưới dạng một vài điểm mã. Sau đó kiểm tra xem bạn có một chữ cái tiếp theo là dấu trọng âm hay không.

Điều chỉnh từ How do I remove diacritics (accents) from a string in .NET?, bạn có thể bình thường hóa với Normalize(NormalizationForm.FormD) và kiểm tra dấu phụ với UnicodeCategory.NonSpacingMark.

bool IsLetterWithDiacritics(char c) 
{ 
    var s = c.ToString().Normalize(NormalizationForm.FormD); 
    return (s.Length > 1) && 
      char.IsLetter(s[0]) && 
      s.Skip(1).All(c2 => CharUnicodeInfo.GetUnicodeCategory(c2) == UnicodeCategory.NonSpacingMark); 
} 
+3

Nếu bạn cần một kiểm tra đúng/sai, bạn chỉ có thể bình thường hóa nó thành FormD hoặc bất cứ điều gì nó sẽ được, và chỉ cần kiểm tra xem chuỗi dài hơn bản gốc. –

+1

@JoakimJohansson Tôi sẽ không ngạc nhiên nếu có những glyph khác phân hủy trong FormD, nhưng không phải là chữ cái có dấu. Nhưng tôi cũng không biết ý tưởng của tôi sẽ tốt đến thế nào. – CodesInChaos

+2

@JoakimJohansson Một lớp nhân vật lớn mà thuật toán của bạn coi là có dấu phụ là các ký tự hangul của Hàn Quốc. Chúng bao gồm một số phần, bị phân hủy, nhưng không có dấu phụ. Một số ví dụ: '가', '간', '갂'. Sau đó, có các ký hiệu toán học như: '≠', '⊉',' ∄', '∦' Và cuối cùng là một số mà tôi không biết chút nào:' ஔ' – CodesInChaos

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