如何使用Simmetrics java计算重叠系数和Jaro Winkler

如何使用Simmetrics java计算重叠系数和Jaro Winkler,java,overlap,similarity,jaro-winkler,Java,Overlap,Similarity,Jaro Winkler,我一直在尝试从以下位置使用Sim度量库: <dependency> <groupId>com.github.mpkorstanje</groupId> <artifactId>simmetrics-core</artifactId> <version>4.1.0</version> </dependency> 0.43055558 和余

我一直在尝试从以下位置使用Sim度量库:

    <dependency>
        <groupId>com.github.mpkorstanje</groupId>
        <artifactId>simmetrics-core</artifactId>
        <version>4.1.0</version>
    </dependency>
0.43055558

和余弦相似性:

sm  = StringMetrics.overlapCoefficient();
res = sm.compare("The quick brown fox", "The slow brawn fur");
System.out.println(res); 
0.25

但是根据


对此,jaro winkler应为0,重叠系数应为100。这是使用这个图书馆的正确方法吗?什么是正确的调用,比如说,如果我想运行这两个指标来匹配从IMDB获得的一个列表到另一个列表中的电影,我打算比较两组电影的标题,得到两个分数的平均值,并对两组电影的演员做同样的操作。谢谢

您正确使用了库。但是,您可能希望自定义正在使用的度量。这听起来像是过滤诸如“the”、“a”和“etc”之类的短而常见的单词,使用q-gram标记器可能比使用StringMetrics中的默认度量更有效,其中大多数标记化为空白,没有应用过滤器或简化器

除此之外,我无法告诉您哪些组合度量、标记化器、过滤器和简化器可能适用于您的用例。效果最好的是特定领域的。你必须尝试几种组合,看看哪种组合效果最好


当我使用您提供的网站计算快速棕色狐狸和慢速棕色皮毛的余弦相似性和重叠系数时,我得到:

String 1: The quick brown fox
String 2: The slow brawn fur

The results are then:
Cosine Similarity   25
Overlap Coefficient 25
当我使用Simmetrics时

System.out.println(
  StringMetrics.overlapCoefficient().compare(
    "The quick brown fox", "The slow brawn fur")); // 0.25
System.out.println(
  StringMetrics.cosineSimilarity().compare(
     "The quick brown fox", "The slow brawn fur")); // 0.25

关于Jaro Winkler,该网站似乎使用了较旧版本的Simmetrics。度量和名称的具体组合,特别是最初由Simmetrics Sam Chapman的原始作者编写的Chapman长度偏差,对此毫无疑问


旧版本有一些特点,但我无法指出造成这种差异的具体原因,除非再次对它们进行并排调试。

@mpkorstanje我不知道您是否仍然是维护此库的主要人员,但我认为这可能是一个很好的联系方式,谢天谢地,这种伎俩只对谈话中的人有效。:)您上面链接的站点正在标准化分数,因此完美匹配(根据特定算法)为100。例如,“猫”和“帽子”之间的Levenshtein距离是1,而不是67。看起来该站点使用(len dist)/len计算了分数。我建议您通过自己计算Jaro Winkler距离来验证您正在使用的库,或者使用另一个库进行比较(例如)。该网站似乎正在使用一个相当旧且有缺陷的Simmetrics版本。谢谢,这是有意义的,将进行适当的更改:)
System.out.println(
  StringMetrics.overlapCoefficient().compare(
    "The quick brown fox", "The slow brawn fur")); // 0.25
System.out.println(
  StringMetrics.cosineSimilarity().compare(
     "The quick brown fox", "The slow brawn fur")); // 0.25