1

拜托,我正在开发一个用于人员实时识别的 PoC,其中一个关键方面是支持名字、中间名和姓氏的轻微拼写错误和语音变化。像 HarinGton == HarrinBton 或 RaphEAl == RafAEl。它适用于较长的名称,但对于像 Lee 和 John 这样的名称则有点不精确。

我在 PostgreSQL 13.3 (Supabase.io) 中通过 dmetaphone() 和 dmetaphone_alt() 使用 Double Metaphone。虽然我很欣赏 Double Metaphone,但它有一个(也是?)短字符串作为结果。metaphone() 具有使生成的语音表示更长的参数。我调查了 dmetaphone() 并且除了默认功能之外找不到任何东西。

有没有办法让 dmetaphone() 和 dmetaphone_alt() 返回类似于 metaphone() 的更长的语音表示,但具有 ALT 变化?

任何帮助将非常感激。

谢谢

4

1 回答 1

1

查看这些功能的postgres 文档,您无法对 Double Metaphone 的编码字符串的长度进行参数控制。在单个 Metaphone 的情况下,您只能截断输出字符串:

max_output_length设置输出变音位码的最大长度;如果更长,则输出被截断到这个长度。

Trigram Similarity但是,通过使用或使用任一变音位方法的编码输出,您可能会获得更好的结果Levenshtein Distance——这可能是使用变音位处理语音排列的更强大的方法。

例子

考虑艺术家可能的所有拼写排列Cyndi Lauper,使用具有三元相似性的双变音位,我们可以在不正确的字符串cindy lorper和正确的拼写之间实现 100% 的相似性:

SELECT similarity(dmetaphone('cindy lorper'), dmetaphone('cyndi lauper'));

产量:(similarity real: 1即:100% 相似度)

这意味着使用 Double Metaphone 的两个输入字符串的编码是相同的。使用 Metaphone 时,它​​们略有不同。以下所有产量SNTLRPR

SELECT metaphone('cyndy lorper',10);
SELECT metaphone('sinday lorper', 10);
SELECT metaphone('cinday laurper', 10);
SELECT metaphone('cyndi lauper',10);

产生:SNTLPR只有一个字符不同SNTLRPR

您还可以使用 Levenshtein Distance 来计算它,它为您提供了一个可过滤的参数来使用:

SELECT levenshtein(metaphone('sinday lorper', 10), metaphone('cyndi lauper', 10));

产量:levenshtein integer: 1


它适用于较长的名称,但对于像 Lee 和 John 这样的名称则有点不精确。

如果没有更完整的reprex,要确切地看到您遇到的问题有点困难。

SELECT similarity(dmetaphone('lee'), dmetaphone('leigh'));
SELECT similarity(dmetaphone('jon'), dmetaphone('john'));

两者都产生:(similarity real: 1即:100% 相似性)

编辑:这是一个易于遵循的指南,用于与 postgres 进行模糊匹配

于 2021-12-18T09:06:54.417 回答