1

我一直在尝试使用以下 Sim-metrics 库:

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

到目前为止,我正在使用以下方法计算 Jaro Winkler:

StringMetric sm = StringMetrics.jaroWinkler();
res = sm.compare("Harry Potter", "Potter Harry");
System.out.println(res);

0.43055558

和余弦相似度:

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

0.25

但根据https://asecuritysite.com/forensics/simstring

jaro-winkler 应该是 0,重叠系数应该是 100。这甚至是使用这个库的正确方法吗?什么是正确的调用,比如说如果我想运行这两个指标来匹配我从 IMDB 获得的一个列表中的电影,我打算比较两个集合中的标题并获得两个分数的平均值并为两部电影的演员阵容。谢谢

4

1 回答 1

1

您正在正确使用该库。但是,您可能希望自定义您正在使用的指标。这听起来像过滤短的、常见的词,如“the”、“a”、“and”等,使用 q-gram 标记器可能比使用 StringMetrics 中的默认度量更有效,其中大多数在空格上标记并且没有应用过滤器或简化器。

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


当我使用您提供的网站计算余弦相似度和重叠系数时The quick brown foxThe slow brawn fur我得到:

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 Length Deviation 毫无疑问。

旧版本有一些特殊性,尽管我无法指出导致这种差异的具体原因,而无需再次并排调试它们。

于 2016-01-19T17:06:16.707 回答