gpt4 book ai didi

java - 我应该使用 StringMetric 还是 MultisetMetric 将这些字符串与 simmetric 进行比较

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:42 29 4
gpt4 key购买 nike

我一直在使用 [Simmetrics][1] Java 库来比较两个字符串,并取得了很大的成功。但似乎有两种方法,我需要将两种方法结合起来以适应我的场景。

目前我正在使用 CosineSimilarity(我确实使用了一些简化器,但此处省略了以保持代码简单)

StringMetric metric = with(new CosineSimilarity<String>())
.tokenize(Tokenizers.whitespace()).build();
score = metric.compare(string1, string2);

这工作得很好,除了我,当有一个简单的拼写错误时,我预期会得到比我得到的更高的分数

例如,比较金钱蜂蜜金钱蜂蜜仅返回0.5(分数从0.0到1.0,其中1.0是完美匹配),我本来期望更高。

使用 Levenshtein,它会返回更好的 0.9090909

但我在阅读文档时注意到的一件事是,这是一个 MultiSet 指标,并且实际上需要使用空白()来将输入分解为多个部分,而 StringMetric 例如 Levenshtein 则不需要

 StringMetric metric = with(new Levenshtein())
.build();

这意味着 Levenshtein 不会特别考虑空格,这是一个问题,因为我想匹配单词并基本上忽略空格或顺序。

例如,使用 CosineSimilarity 在比较“honey trap”和“trap honey”时它返回 1.0,但 Levenshtein 返回 0.0,这对我来说没有好处。

我理想地想要的是词序不重要,然后如果单词中只有轻微的变化,例如钱/钱,那么单个单词就可以很好地匹配

字符串可以是任何语言,但通常是英语,它们是歌曲标题,因此通常少于十个单词长,通常约为 5 个单词长。

Simmetrics 是否提供另一种算法可以同时提供这两个部分?

有诸如RefinedSoundex之类的简化器可以应用于输入,但由于该语言可能不是英语,因此我认为这不会很好地工作。

您认为最好的算法是什么?

最佳答案

Simmetrics 包含用于比较字符串、列表、集合和多重集的指标。

两个单词之间的编辑距离是单字符编辑的最小次数。空格也是一个字符,因此空格的差异会导致相似度的差异。

余弦相似度是两个零 vector 之间的相似度(为方便起见,将其表示为多重集)。因此,如果没有某种形式的处理余弦相似度,就根本不适合比较字符串。

根据您分割字符串的方式,您最终可能会比较完全不同的东西。如果您在空格上分割字符串,您最终将根据单词使用的相似性来比较文档。如果您将字符串拆分为 n 元语法,您将比较字符串的字母对,这往往可以很好地防止拼写错误。

对于您的特定用例,您可能需要研究对空格进行标记,然后对 q-gram 进行标记。然后尝试 CosineSimilarity、Tanimoto、Dice、SimonWhite、Jaccard。

例如:

/**
* Tokenizers can also be chained.
*
* `chilperic ii son of childeric ii`
*
* By splitting on whitespace is tokenized into:
*
* `[chilperic, ii, son, of, childeric, ii]`
*
* After using a q-gram with a q of 2:
*
* `[ch,hi,il,il,lp,pe,er,ri,ic, ii, so,on, of, ch,hi,il,ld,de,er,ri,ic,
* ii]`
*
*/
public static float example04() {

String a = "A quirky thing it is. This is a sentence.";
String b = "This sentence is similar; a quirky thing it is.";

StringMetric metric =
with(new CosineSimilarity<String>())
.tokenize(Tokenizers.whitespace())
.tokenize(Tokenizers.qGram(3))
.build();

return metric.compare(a, b); // 0.8292
}

要做出决定,您可以进行一些有代表性的查询,并按 precision and recall 比较结果。 。然后您就可以决定使用哪个指标。

全面披露:我是 Simmetrics 项目的当前维护者。

关于java - 我应该使用 StringMetric 还是 MultisetMetric 将这些字符串与 simmetric 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40740577/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com