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);
产生:SNTLPR
与 SNTLRPR
只有一个字符不同
您也可以使用 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
进行模糊匹配
拜托,我正在研究一个用于人员实时识别的 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);
产生:SNTLPR
与 SNTLRPR
您也可以使用 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
进行模糊匹配