2010-11-05 58 views
10

Tôi đang tìm thư viện java cho phép "chuẩn hóa" văn bản. Một cái gì đó tương tự như standart Normalizer, nhưng rộng hơn (một cái gì đó như utf8proc LUMP).Thư viện Java để chuẩn hóa văn bản

Nó nên thay thế tất cả các loại charachters đặc biệt để tương đương ASCII (nếu nó có thể tất nhiên). Tất cả các biến thể của không gian để mã 32, tất cả các biến thể của minuses (dài, ngắn, mỏng, vv) để mã 45 và như vậy.

+0

PS: Có vẻ như tôi phải triển khai nó. Có ý tưởng nào để làm nó không không? – valodzka

Trả lời

2

Bạn nên xem số Latin-ASCII chuyển đổi trong CLDR. nó sẽ ở trong ICU 4.6

+0

Cảm ơn bạn, trông giống như một giải pháp tốt – valodzka

+1

Trình chuyển ngữ Latin-ASCII được chuyển thành ICU 4.6/CLDR 1.9. –

1

Bạn đã xem số Normalizer của icu4j chưa?

normalize chuyển văn bản Unicode thành dạng tương đương hoặc bị phân tách, cho phép sắp xếp và tìm kiếm văn bản dễ dàng hơn. normalize hỗ trợ các biểu mẫu chuẩn hóa tiêu chuẩn được mô tả trong Unicode Standard Annex #15 — Unicode Normalization Forms.

+0

Có, tôi đã kiểm tra. Theo mặc định nó không làm những gì tôi cần. Tôi đã nhìn vào Normalizer2 (http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html), nó có thể được cấu hình, nhưng nó không phải là nhiệm vụ đơn giản. – valodzka

4

Yêu cầu cụ thể của bạn hơi mơ hồ, nhưng tôi cho rằng bạn muốn một điều làm Normalizer, nhưng với tính năng gộp một số điểm mã Unicode nhất định thành một ký tự - tương tự như utf8proc.

tôi sẽ đi cho một cách tiếp cận 2 bước:

  1. đầu tiên sử dụng Normalizer.normalize để tạo ra bất cứ điều gì (gỉ) thành phần bạn muốn
  2. Sau đó lặp qua các điểm mã của kết quả và thay thế thống nhất ký tự theo cách bạn thích.

Cả hai đều đơn giản. Đối với 2, nếu bạn đang xử lý các ký tự trong Ngăn đa ngôn ngữ cơ bản, sau đó lặp lại qua các điểm mã sử dụng một số appropriate algorithm for doing so. Nếu bạn chỉ sử dụng các điểm mã BMP, thì chỉ cần lặp lại các ký tự.

Đối với các ký tự mà bạn muốn gộp lại với nhau, tạo ra một cấu trúc dữ liệu thay thế cho việc lập bản đồ điểm mã ununified ->đang thống nhất điểm. Map<Character, Character> hoặc Map<Integer, Integer> hãy ghi nhớ điều đó. Điền bản đồ thay thế theo ý thích của bạn, ví dụ: bằng cách lấy thông tin từ số lump.txt của utf8proc và một nguồn cho character categories.

Map<Character, Character> LUMP; 

static { 
    LUMP = new HashMap<Character, Character>(); 
    LUMP.put('\u2216', '\\'); // set minus 
    LUMP.put('\u007C', '|'); // divides 
    // ... 
} 

Tạo StringBuilder mới hoặc thứ gì đó tương tự với cùng chuỗi chuẩn của bạn. Khi lặp qua các điểm mã, hãy kiểm tra xem LUMP.get(codePoint) có không phải là không. Trong trường hợp này, thêm giá trị trả về, nếu không thì thêm điểm mã vào StringBuilder. Đó nên là nó.

Nếu được yêu cầu, bạn có thể hỗ trợ cách tải nội dung LUMP từ cấu hình, ví dụ: từ đối tượng Properties.

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