2009-01-01 25 views
14

Tôi cần phải xác định ngôn ngữ tự nhiên mà đầu vào của tôi thuộc về. Mục đích là để phân biệt giữa các từ tiếng Ả Rậptiếng Anh trong đầu vào hỗn hợp, trong đó đầu vào là Unicode và được trích xuất từ ​​các nút văn bản XML. Tôi đã nhận thấy lớp học Character.UnicodeBlock. Nó có liên quan đến vấn đề của tôi không? Làm thế nào tôi có thể làm cho nó hoạt động?Java: làm thế nào để kiểm tra xem ký tự thuộc về một khối unicode cụ thể?

Edit: Các Character.UnicodeBlock cách tiếp cận là hữu ích cho tiếng Ả Rập, nhưng dường như không làm điều đó cho tiếng Anh (hoặc các ngôn ngữ châu Âu khác) vì BASIC_LATIN Unicode khối bao gồm các biểu tượng và ký tự không in cũng như các chữ cái. Vì vậy, bây giờ tôi đang sử dụng phương pháp matches() của đối tượng String với biểu thức chính quy "[A-Za-z]+" thay thế. Tôi có thể sống với nó, nhưng có lẽ ai đó có thể đề xuất một cách tốt hơn/nhanh hơn.

Trả lời

0

Bạn có vấn đề đối diện với this one, nhưng trớ trêu thay những gì không làm việc cho ông ta, đó chỉ nên làm việc tuyệt vời cho bạn. Nó chỉ là tìm kiếm các từ bằng tiếng Anh (chỉ các ký tự tương thích ASCII) với reg-exp "\ w".

5

Nếu [A-Za-z]+ đáp ứng yêu cầu của bạn, bạn sẽ không tìm thấy bất kỳ thứ gì nhanh hơn hoặc đẹp hơn. Tuy nhiên, nếu bạn muốn kết hợp tất cả các chữ trong khối latin1 (bao gồm cả chữ cái có dấu và chữ ghép), bạn có thể sử dụng này:

Pattern p = Pattern.compile("[\\pL&&\\p{L1}]+"); 

Đó là giao điểm của các thiết lập của tất cả các chữ Unicode và các thiết lập của tất cả các nhân vật latin1 .

0

ký tự tiếng Anh có xu hướng ở các khối 4 Unicode:

ArrayList<Character.UnicodeBlock> english = new ArrayList<>(); 
english.add(Character.UnicodeBlock.BASIC_LATIN); 
english.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT); 
english.add(Character.UnicodeBlock.LATIN_EXTENDED_A); 
english.add(Character.UnicodeBlock.GENERAL_PUNCTUATION); 

Vì vậy, nếu bạn có một String, bạn lặp trên tất cả các ký tự và có thể xem những gì Unicode chặn mỗi nhân vật là:

for (char currentChar : myString.toCharArray()) 
{ 
    Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar); 
    if (english.contains(unicodeBlock)) 
    { 
     // This character is English 
    } 
} 

Nếu tất cả đều là tiếng Anh, thì bạn biết bạn có các ký tự là tất cả tiếng Anh. Bạn có thể lặp lại điều này cho bất kỳ ngôn ngữ nào; bạn sẽ phải chỉ ra những gì Unicode chặn mỗi ngôn ngữ sử dụng.

Lưu ý: Điều này KHÔNG có nghĩa là bạn đã chứng minh ngôn ngữ tiếng Anh. Bạn đã chỉ chứng minh nó sử dụng các ký tự được tìm thấy bằng tiếng Anh. Nó có thể là tiếng Pháp, tiếng Đức, tiếng Tây Ban Nha hoặc các ngôn ngữ khác có các ký tự có nhiều trùng lặp với tiếng Anh.

Có nhiều cách khác để phát hiện ngôn ngữ tự nhiên thực tế. Thư viện như langdetect, mà tôi đã sử dụng với thành công rực rỡ, có thể làm điều này cho bạn:

https://code.google.com/p/language-detection/

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