Postgresql 的语音算法

Phonetic Algorithms for Postgresql

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

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

有没有一种方法可以使 dmetaphone() 和 dmetaphone_alt() return 成为类似于 metaphone() 的更长的语音表示形式,但具有ALT 变体?

如有任何帮助,我们将不胜感激。

谢谢

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

max_output_length sets the maximum length of the output metaphone code; if longer, the output is truncated to this length.

然而,通过在任一 metaphone 方法的编码输出上使用 Trigram Similarity or Levenshtein Distance 可能会获得更好的结果 - 这可能是使用 [=60= 处理语音排列的更强大的方法]s.

例子

考虑艺术家 Cyndi Lauper 的所有可能的拼写排列,使用 double metaphone 和三字母组相似性,我们可以在不正确的字符串 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);

产生:SNTLPRSNTLRPR

只有一个字符不同

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

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

产量:levenshtein integer: 1


It's working for longer names, but it's a bit more imprecise for names like Lee and John.

如果没有更完整的 reprex.

,很难准确地看出您遇到了什么问题
SELECT similarity(dmetaphone('lee'), dmetaphone('leigh'));
SELECT similarity(dmetaphone('jon'), dmetaphone('john'));

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

编辑:这里有一个易于理解的 guide 用于与 postgres

进行模糊匹配