【问题标题】:How to compare almost similar Strings in Java? (String distance measure) [closed]如何比较Java中几乎相似的字符串? (字符串距离测量)[关闭]
【发布时间】:2011-01-06 06:48:51
【问题描述】:

我想比较两个字符串并得到一些分数,它们看起来有多相似。 例如“句子很相似”和“句子很相似”。

我不熟悉 Java 中的现有方法,但对于 PHP,我知道 levenshtein function。

Java中有更好的方法吗?

【问题讨论】:

  • “相似”是什么意思?发音相似?视觉上相似吗?
  • @Astor,从这个例子来看,我想说视觉和发音相似性都不是这里想要的衡量标准。
  • 这是“好问题”的一个很好的例子,但是希望在 stackoverflow 上关闭所有类型的问题的人......问题很清楚。为什么要关闭它?

标签: java string comparison levenshtein-distance string-metric


【解决方案1】:

以下 Java 库提供多种比较算法(Levenshtein、Jaro Winkler、...):

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

两个库都有一个 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);
}

【讨论】:

【解决方案2】:

Levensthein 距离衡量字符串的相似程度。或者,更准确地说,必须进行多少更改才能使它们相同。

algorithm 在 Wikipedia 上以伪代码形式提供。将其转换为 Java 应该不是什么大问题,但它没有内置到基类库中。

Wikipedia 有更多的算法可以测量字符串的相似度。

【讨论】:

    【解决方案3】:

    是的,这是一个很好的指标,您可以使用来自 apache commons 的 StringUtil.getLevenshteinDistance()

    【讨论】:

    • Java 移动版中不可用,是吗?不过感谢您的回复!
    • 你可以和我一起使用它,只需添加jar即可。
    • 嗯,不,我不太确定它是否完全可用于 J2ME,它已使用 J2SE 编译
    • 它不使用任何我不支持的东西。你可以在罐子里制作和复制
    【解决方案4】:

    您可以在以下位置找到 Levenshtein 和其他字符串相似度/距离度量的实现 https://github.com/tdebatty/java-string-similarity

    如果你的项目使用maven,安装就这么简单

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

    然后,以 Levenshtein 为例

    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"));
      }
    }
    

    【讨论】:

      【解决方案5】:

      无耻插件,但我也写了一个库:

      https://github.com/vickumar1981/stringdistance

      它具有所有这些功能,加上一些用于语音相似性的功能(如果一个词“听起来像”另一个词 - 返回真或假,这与其他模糊相似性是 0-1 之间的数字不同)。

      还包括 dna 测序算法,例如 Smith-Waterman 和 Needleman-Wunsch,它们是 Levenshtein 的通用版本。

      我计划在不久的将来使这项工作适用于任何数组,而不仅仅是字符串(字符数组)。

      【讨论】:

        猜你喜欢
        • 2010-10-31
        • 2011-08-17
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 2017-02-25
        • 1970-01-01
        • 2012-07-17
        相关资源
        最近更新 更多