2008-11-27 19 views
7

Tôi có một cơ sở dữ liệu của các công ty. Ứng dụng của tôi nhận dữ liệu tham chiếu đến một công ty theo tên, nhưng tên có thể không khớp chính xác với giá trị trong cơ sở dữ liệu. Tôi cần phải khớp dữ liệu đến với công ty mà nó đề cập đến.Phù hợp với tên công ty không chính xác trong Java

Ví dụ: cơ sở dữ liệu của tôi có thể chứa công ty có tên "A. B. Widgets & Co Ltd." trong khi dữ liệu đến của tôi có thể tham chiếu "AB Widgets Limited", "A.B. Widgets and Co" hoặc "A B Widgets".

Một số từ trong tên công ty (A B Widgets) quan trọng hơn để so khớp với các từ khác (Co, Ltd, Inc, v.v.). Điều quan trọng là tránh các trận đấu sai.

Số lượng công ty đủ nhỏ để tôi có thể duy trì bản đồ tên của họ trong bộ nhớ, ví dụ: Tôi có tùy chọn sử dụng Java thay vì SQL để tìm đúng tên.

Bạn sẽ làm như thế nào trong Java?

Trả lời

0

cơ sở dữ liệu của bạn có thể suport việc sử dụng Regular Expressions (regex) - xem dưới đây để biết một số hướng dẫn trong Java - đây là liên kết đến các tài liệu MySQL (như là một ví dụ):

http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

Bạn sẽ có thể muốn lưu trữ trong cơ sở dữ liệu một tuyên bố rõ ràng khá phức tạp cho mỗi công ty bao gồm các biến thể chính tả mà bạn có thể dự đoán - hoặc các phần tử phụ của tên công ty mà bạn muốn trọng lượng là quan trọng.

Bạn cũng có thể sử dụng thư viện regex trong Java

JDK 1.4.2
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html

JDK 1.5.0
http://java.sun.com/j2se/1.5.0/docs/api/java/util/regex/Matcher.html

Sử dụng Regular Expressions trong Java
http://www.regular-expressions.info/java.html

Giải thích về API Regex của Java
http://www.sitepoint.com/article/java-regex-api-explained/

Bạn cũng có thể muốn xem nếu cơ sở dữ liệu của bạn hỗ trợ khả năng Soundex (ví dụ, xem đường dẫn sau để MySQL)
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex

2

Bạn có thể sử dụng một thuật toán LCS ghi bàn họ.

Tôi làm điều này trong số photo album để giúp dễ dàng gửi email trong ảnh và khiến chúng rơi vào danh mục bảo mật đúng cách.

0

Bạn có thể sử dụng Lucene để chỉ số cơ sở dữ liệu của bạn, sau đó truy vấn các chỉ số Lucene. Có một số công cụ tìm kiếm được xây dựng trên đầu trang của Lucene, bao gồm cả Solr.

+0

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại nhận xét bên dưới bài đăng của họ. –

+0

Cảm ơn phản hồi, tôi đã trả lời câu trả lời giống như câu trả lời. –

1

Hãy xem Lucene.Đó là một thư viện Java tìm kiếm toàn văn bản nguồn mở với khả năng 'gần khớp'.

3

Bạn có thể chuẩn hóa các định dạng càng nhiều càng tốt trong đầu vào DB/& (tức là chuyển đổi thành chữ thường/chữ thường), sau đó sử dụng Levenshtein (edit) distance metric từ chương trình động để ghi điểm vào đối với tất cả các tên đã biết của bạn.

Sau đó, bạn có thể yêu cầu người dùng xác nhận đối sánh & nếu họ không thích, cung cấp cho họ tùy chọn để nhập giá trị đó vào danh sách tên đã biết (theo ý nghĩ thứ hai). người dùng ...)

+1

Tôi chỉ mới phát hiện ra thuật toán này khoảng 6 tháng trước, nhưng nó đã phục vụ tôi rất tốt kể từ đó! Ngoài ra nó làm cho tôi trông thông minh khi tôi nói "oh chỉ cần sử dụng một khoảng cách Levenshtein '. :-) – Aidos

2

Tôi muốn LCS bỏ qua dấu cách, dấu câu, trường hợp và các biến thể về "co", "llc", "ltd", v.v.

0

bỏ phiếu lên 1 phiếu xuống

Bạn có thể sử dụng một thuật toán LCS ghi bàn họ.

Tôi làm điều này trong anbom ảnh của mình để dễ dàng gửi email trong ảnh và khiến chúng rơi vào danh mục bảo mật đúng cách.

* LCS code 
* Example usage (guessing a category based on what people entered) 

chính xác hơn, tốt hơn so với hậu quả chung ít nhất, Chuỗi con chung ít nhất phải chính xác hơn theo thứ tự của các ký tự là quan trọng.

3

Mặc dù chủ đề này là một chút cũ, tôi gần đây đã làm một cuộc điều tra về hiệu quả của các số liệu chuỗi khoảng cách cho tên phù hợp và đã xem qua thư viện này:

https://code.google.com/p/java-similarities/

Nếu bạn không muốn chi tiêu Tôi khuyên bạn nên thử làm bước đầu tiên, có ~ 20 thuật toán khác nhau đã được triển khai (bao gồm các thuật toán Levenshtein, Jaro-Winkler, Monge-Elkan, v.v.) và mã của nó được cấu trúc đủ tốt bạn không cần phải hiểu toàn bộ logic, nhưng bạn có thể bắt đầu sử dụng nó trong vài phút.

(BTW, tôi không phải là tác giả của thư viện, vì vậy kudo cho người sáng tạo của nó.)

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