2010-01-18 8 views
32

Tôi muốn so sánh hai chuỗi và nhận được một số điểm số như thế nào trông giống nhau. Ví dụ: "Câu gần như tương tự""Câu này tương tự".Làm thế nào để so sánh các chuỗi gần như tương tự trong Java? (Chuỗi khoảng cách đo)

Tôi không quen với các phương pháp hiện có trong Java, nhưng đối với PHP, tôi biết số levenshtein function.

Có phương pháp nào tốt hơn trong Java không?

+0

Bạn làm gì có nghĩa là "tương tự"? Phát âm tương tự? Trực quan tương tự? –

+0

@Astor, đánh giá từ ví dụ tôi muốn nói rằng cả hình ảnh lẫn sự tương đồng về phát âm đều không phải là thước đo mong muốn ở đây. – Joey

Trả lời

20

Các Levensthein khoảng cách một biện pháp để làm thế nào dây tương tự đang có. Hoặc, chính xác hơn, có bao nhiêu thay đổi phải được thực hiện rằng chúng giống nhau.

algorithm có sẵn trong mã giả trên Wikipedia. Việc chuyển đổi sang Java không phải là vấn đề lớn, nhưng nó không được tích hợp trong thư viện lớp cơ sở.

Wikipedia có một số thuật toán khác đo lường độ tương đồng của chuỗi.

14

vâng thats một thước đo tốt, bạn có thể sử dụng StringUtil.getLevenshteinDistance() từ commons apache

+0

Nó không có sẵn trong Java Mobile Edition, phải không? Nhưng cảm ơn phản ứng của bạn! – hsmit

+0

bạn có thể sử dụng nó với ME, chỉ cần thêm bình. – jspcal

+1

hmmm, không, tôi không thực sự chắc chắn rằng nó hoàn toàn có thể sử dụng với J2ME, nó đã được biên dịch với một J2SE –

4

Tôi đã tìm thấy thuật toán Levenshtein trên this page.

+0

Tìm tốt, có vẻ như đủ đơn giản để làm việc trong MIDP và bộ nhớ hiệu quả, hai yếu tố quan trọng cho nền tảng như vậy. Bạn nên chấp nhận câu trả lời của riêng bạn ... Hoặc thay vào đó chấp nhận lời mời của Johannes, kể từ khi ông chỉ vào bài viết trên Wikipedia nơi bạn (rõ ràng) tìm thấy liên kết bạn đề cập đến. – PhiLho

+0

không, tôi tìm thấy nó trước khi thông qua google, nhưng tôi sẽ chấp nhận câu trả lời! – hsmit

+4

Có vẻ như www.merriampark.com không còn nữa. – peater

42

Các thư viện Java sau đây cung cấp nhiều so sánh các thuật toán (Levenshtein, Jaro Winkler, ...):

  1. Apache Commons Lang 3: https://commons.apache.org/proper/commons-lang/
  2. Simmetrics: http://sourceforge.net/projects/simmetrics/

Cả hai thư viện đều có tài liệu java (Apache Commons Lang Javadoc, Simmetrics Javadoc).

//Usage of Apache Commons Lang 3 
import org.apache.commons.lang3.StringUtils; 
public double compareStrings(String stringA, String stringB) { 
    return StringUtils.getJaroWinklerDistance(stringA, stringB); 
} 

//Usage of Simmetrics 
import uk.ac.shef.wit.simmetrics.similaritymetrics.JaroWinkler  
public double compareStrings(String stringA, String stringB) { 
    JaroWinkler algorithm = new JaroWinkler(); 
    return algorithm.getSimilarity(stringA, stringB); 
} 
+0

Cảm ơn bạn rất nhiều vì đã làm cho tôi biết về thư viện này. Chức năng và tính dễ sử dụng của nó rất hữu ích! – Tastybrownies

+0

siêu lib, dễ sử dụng và kết quả tốt – bluevoid

+2

Hiện có sẵn trong Apache commons-lang ngay bây giờ: http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html# getJaroWinklerDistance% 28java.lang.CharSequence,% 20java.lang.CharSequence% 29 –

1

Bạn có thể tìm hiện thực của Levenshtein và các biện pháp chuỗi tương đồng/khoảng cách khác trên https://github.com/tdebatty/java-string-similarity

Nếu dự án của bạn sử dụng maven, lắp đặt cũng đơn giản như

<dependency> 
    <groupId>info.debatty</groupId> 
    <artifactId>java-string-similarity</artifactId> 
    <version>RELEASE</version> 
</dependency> 

Sau đó, để sử dụng Levenshtein ví dụ:

import info.debatty.java.stringsimilarity.*; 

public class MyApp { 

    public static void main (String[] args) { 
    Levenshtein l = new Levenshtein(); 

    System.out.println(l.distance("My string", "My $tring")); 
    System.out.println(l.distance("My string", "My $tring")); 
    System.out.println(l.distance("My string", "My $tring")); 
    } 
}